Skip to content

Commit d3181c7

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/sort-dot-path-fallback-fc72e9
2 parents 3f41bfc + 05154a1 commit d3181c7

98 files changed

Lines changed: 741 additions & 152 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.changeset/adapter-hono-auth-wildcard-yields.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
"@objectstack/adapter-hono": patch
2+
"@objectstack/hono": patch
33
---
44

55
fix(adapters/hono): the auth wildcard yields paths the auth service does not own (#4117)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
docs(adr-0104): amend the upgrade-path advertisement clause to record how it landed (#4253/#4284) — `os migrate meta` names the migrations without gate status, because gate status is per deployment (2026-07-27 addendum) while `meta` acts on source, which deploys to zero-or-N of them; status is reported where a datastore is actually open. Releases nothing.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
'@objectstack/spec': patch
3+
'@objectstack/runtime': patch
4+
---
5+
6+
Discovery stops telling Cloud/Enterprise deployments that nothing implements `ai` (#4093 follow-up).
7+
8+
`CORE_SERVICE_PROVIDER` recorded `null` for `ai` because no **workspace** package provides it, and `serviceUnavailableMessage('ai')` therefore produced *"No implementation ships for the 'ai' slot"*. That is false: `@objectstack/service-ai` registers the slot in `objectstack-ai/cloud`. The table conflated "not in this repository" with "does not exist" — the same class of wrong answer the table was introduced to end, one step further out.
9+
10+
Verified against the cloud repository rather than inferred: `packages/service-ai/src/plugin.ts` calls `ctx.registerService('ai', …)`, and the package is `private: true`, so there is genuinely nothing to install — which is why `null` stays right and an `Install X` sentence would still be wrong. `search`, `workflow` and `graphql` were checked the same way and nothing registers them in either repository, so their `null` and their "nothing ships" sentence are accurate.
11+
12+
`ai` now carries a `REMEDY_DETAIL` sentence — *"Provided by @objectstack/service-ai in ObjectStack Cloud/Enterprise — no implementation ships in the open framework"* — the mechanism `ui` already used. Both discovery (`services.ai.message`) and the `/ai` 501 body report it.
13+
14+
This **removes** code: `/ai`'s domain had a local message override, added because the shared sentence was wrong there. Correcting the table fixed the domain *and* discovery, which the override could never reach, so the override and `capabilityUnavailable`'s `message?` parameter are both gone. A slot whose sentence is wrong needs the table corrected, not a local exception.
15+
16+
Also corrected: three places still describing `/ai`'s absent-service answer as a 404 (`docs/api/client-sdk.mdx`, `docs/releases/v17.mdx`, and a comment in `packages/client`'s URL-conformance test) — stale since that answer became 501.
17+
18+
FROM → TO: `services.ai.message` and the `/ai/*` 501 body change text. Nothing branches on either — `status` and `enabled` are the contract, the message is prose for humans and agents.
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
---
2+
"@objectstack/account": patch
3+
"@objectstack/cli": patch
4+
"@objectstack/client": patch
5+
"@objectstack/client-react": patch
6+
"@objectstack/cloud-connection": patch
7+
"@objectstack/connector-mcp": patch
8+
"@objectstack/connector-openapi": patch
9+
"@objectstack/connector-rest": patch
10+
"@objectstack/connector-slack": patch
11+
"@objectstack/console": patch
12+
"@objectstack/core": patch
13+
"@objectstack/driver-memory": patch
14+
"@objectstack/driver-mongodb": patch
15+
"@objectstack/driver-sql": patch
16+
"@objectstack/driver-sqlite-wasm": patch
17+
"@objectstack/embedder-openai": patch
18+
"@objectstack/formula": patch
19+
"@objectstack/hono": patch
20+
"@objectstack/knowledge-memory": patch
21+
"@objectstack/knowledge-ragflow": patch
22+
"@objectstack/lint": patch
23+
"@objectstack/mcp": patch
24+
"@objectstack/metadata": patch
25+
"@objectstack/metadata-core": patch
26+
"@objectstack/metadata-fs": patch
27+
"@objectstack/metadata-protocol": patch
28+
"@objectstack/objectql": patch
29+
"@objectstack/observability": patch
30+
"@objectstack/platform-objects": patch
31+
"@objectstack/plugin-approvals": patch
32+
"@objectstack/plugin-audit": patch
33+
"@objectstack/plugin-auth": patch
34+
"@objectstack/plugin-dev": patch
35+
"@objectstack/plugin-email": patch
36+
"@objectstack/plugin-hono-server": patch
37+
"@objectstack/plugin-pinyin-search": patch
38+
"@objectstack/plugin-reports": patch
39+
"@objectstack/plugin-security": patch
40+
"@objectstack/plugin-sharing": patch
41+
"@objectstack/plugin-webhooks": patch
42+
"@objectstack/rest": patch
43+
"@objectstack/runtime": patch
44+
"@objectstack/sdui-parser": patch
45+
"@objectstack/service-analytics": patch
46+
"@objectstack/service-automation": patch
47+
"@objectstack/service-cache": patch
48+
"@objectstack/service-cluster": patch
49+
"@objectstack/service-cluster-redis": patch
50+
"@objectstack/service-datasource": patch
51+
"@objectstack/service-i18n": patch
52+
"@objectstack/service-job": patch
53+
"@objectstack/service-knowledge": patch
54+
"@objectstack/service-messaging": patch
55+
"@objectstack/service-package": patch
56+
"@objectstack/service-queue": patch
57+
"@objectstack/service-realtime": patch
58+
"@objectstack/service-settings": patch
59+
"@objectstack/service-sms": patch
60+
"@objectstack/service-storage": patch
61+
"@objectstack/setup": patch
62+
"@objectstack/studio": patch
63+
"@objectstack/trigger-api": patch
64+
"@objectstack/trigger-record-change": patch
65+
"@objectstack/trigger-schedule": patch
66+
"@objectstack/types": patch
67+
"@objectstack/verify": patch
68+
"create-objectstack": patch
69+
"objectstack-vscode": patch
70+
---
71+
72+
chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
73+
74+
The AGENTS.md post-task checklist requires breaking changesets to carry their
75+
FROM → TO migration because "this text ships to consumers as `CHANGELOG.md`
76+
inside the npm package and is what an upgrading agent greps after the tombstone
77+
error." That delivery path was severed for 68 of the 69 publishable packages:
78+
npm packs `package.json` / `README*` / `LICENSE*` unconditionally but — unlike
79+
older npm versions — not `CHANGELOG.md`, and the canonical
80+
`"files": ["dist", "README.md"]` whitelist never named it. Measured on npm
81+
10.9.7: `npm pack --dry-run` on `@objectstack/types` shipped 3 files while its
82+
70KB `CHANGELOG.md` stayed behind. Only `@objectstack/spec` listed it
83+
explicitly.
84+
85+
The tombstone-error scenario is precisely the one where the repo is out of
86+
reach — the upgrading agent has `node_modules` and nothing else — so the
87+
migration text has to ride in the tarball. Every publishable package now
88+
declares `CHANGELOG.md` in `files`, and the canonical whitelist is
89+
`["dist", "README.md", "CHANGELOG.md"]`.
90+
91+
The other half is the gate: `check:published-files` gains a fifth invariant,
92+
COMPLETE — a whitelist that fails to cover `CHANGELOG.md` fails the
93+
always-required lint job, so the next package cannot silently sever the path
94+
again. `@objectstack/spec`'s per-package EXTRA_ENTRIES exemption dissolves
95+
into the canonical set.
96+
97+
Consumer-visible change: one more file per install (the package's changelog,
98+
e.g. 70.8KB for `@objectstack/types`), and `grep -r "removed key"
99+
node_modules/@objectstack/*/CHANGELOG.md` now finds the migration it was
100+
promised.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
---
3+
4+
docs: fix the plugin-spec CHANGELOG example that still taught the retired
5+
`onUpgrade` hook as running automatically (#4212 family). Releases nothing.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
Repo-plumbing only: the pending changeset `adapter-hono-auth-wildcard-yields` referenced the Hono adapter by its old `@objectstack/adapter-hono` name, which `changeset version` rejects because the workspace package is named `@objectstack/hono`. Renamed the entry; a full sweep of every other pending changeset (and `pre.json`) against the workspace found nothing else stale. Releases nothing by itself.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
---
3+
4+
chore(spec): register the `adr0104-field-file-collection` dogfood proof tag in the ADR-0054 registry, honestly unbound — the collection contract it guards is `lifecycle` on the system `sys_file` object, already bound to `data-lifecycle`. Gate-only (`packages/spec/scripts/`, not published), so this releases nothing.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
'@objectstack/spec': major
3+
'@objectstack/service-automation': patch
4+
---
5+
6+
feat(spec)!: retire `waitEventConfig.timeoutMs` / `.onTimeout``wait` never had a timeout (#4158)
7+
8+
Both keys described a timeout and neither delivered one, so protocol 18 removes the pair
9+
rather than leaving a promise the runtime does not keep (PD #10).
10+
11+
- **`onTimeout`** had **zero** readers. No path ever inspected it, so neither `'fail'` nor
12+
`'continue'` ever happened — and its `.default('fail')` stamped a decision nothing made
13+
onto every wait node. The showcase set `onTimeout: 'continue'`, which did nothing.
14+
- **`timeoutMs`** said *"maximum wait time before timeout"* while its only reader used it
15+
as the timer **duration** when `timerDuration` was absent. It did something, just not
16+
what it claimed.
17+
18+
Together they declared a timeout `wait` does not have: a run resumes when its timer
19+
elapses or its signal arrives, never on a deadline. Real timeout semantics are left
20+
unimplemented deliberately — they should be built to a requirement, not retrofitted to
21+
fit two keys that happened to be declared.
22+
23+
`timeoutMs` **converts to `timerDuration`** rather than being dropped, because that is
24+
what it did. It is stringified on the way: the target is `z.string()` while `timeoutMs`
25+
was `z.number()`, and `parseIsoDuration` reads a bare numeric string as milliseconds — so
26+
`timeoutMs: 60000` and `timerDuration: '60000'` are the same wait. Moving the number
27+
unstringified would have produced a block that no longer parses, which a test pins. With
28+
`timerDuration` already set it is dropped instead: the executor's `??` never looked past
29+
the duration, so it was already dead metadata.
30+
31+
Both leave the **load path** (`retiredFromLoadPath`), which is the registry's existing
32+
split: a key retired for being *renamed* keeps a load window, because punishing an author
33+
for a spelling nobody warned them about is pointless; a key that **misdescribed itself**
34+
does not, because silently absorbing it lets the author keep believing they configured a
35+
timeout. That is why `api.requireAuth`, the tool/app/flow inert keys and RLS `priority`
36+
all left it too. The migration chain converts stored sources mechanically; the schema
37+
tombstones name the replacement.
38+
39+
One fixture interaction worth recording: the #4045 lift fixture used
40+
`waitEventConfig.timeoutMs` to demonstrate its fourth ledger entry, and the fixture
41+
harness replays the whole table — so its `after` described an end state protocol 18 makes
42+
unreachable. It now lifts `eventType` instead. The harness caught this itself.

content/docs/api/client-sdk.mdx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,8 +315,9 @@ await client.notifications.markAllRead();
315315
// through sys_inbox_message and tracks read-state in sys_notification_receipt.
316316
// These helpers will be repointed during the objectui bell cut-over.
317317

318-
// AI — served by `service-ai` (Cloud/EE); 404s "AI service is not configured"
319-
// when the plugin is absent, so check `discovery.services` first.
318+
// AI — served by `service-ai` (Cloud/EE). Without it the route is mounted but
319+
// unimplemented, so it answers 501 and discovery reports the slot unavailable
320+
// with the same sentence; check `discovery.services` first.
320321
const answer = await client.ai.chat({
321322
messages: [{ role: 'user', content: 'How many open orders this quarter?' }],
322323
conversationId, // omit to have one created and echoed back

content/docs/protocol/kernel/http-protocol.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ GET /api/v1/discovery HTTP/1.1
5555
"metadata": { "enabled": true, "status": "available", "route": "/api/v1/meta", "provider": "objectql" },
5656
"auth": { "enabled": true, "status": "available", "route": "/api/v1/auth", "provider": "@objectstack/plugin-auth" },
5757
"workflow": { "enabled": false, "status": "unavailable", "message": "No implementation ships for the 'workflow' slot — register a service under it to enable" },
58-
"ai": { "enabled": false, "status": "unavailable", "message": "No implementation ships for the 'ai' slot — register a service under it to enable" }
58+
"ai": { "enabled": false, "status": "unavailable", "message": "Provided by @objectstack/service-ai in ObjectStack Cloud/Enterprise — no implementation ships in the open framework" }
5959
},
6060
"locale": {
6161
"default": "en-US",

0 commit comments

Comments
 (0)