@immediately-run/sdk 0.52.0 → 0.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -73,6 +73,36 @@ check against the committed snapshot). Run it before pushing; it is the same set
73
73
  checks CI enforces, so a local green equals a green CI. (Ways of working §4: the local
74
74
  verify gate must equal the deploy gate — one `npm run verify` per repo.)
75
75
 
76
+ ### The API-stability gate (`api:check`)
77
+
78
+ A pinned or forked app rides one SDK version forever, so the public API is
79
+ **additive-only** (SDK_PACKAGING_SPEC §9). `api-snapshot.json` records the **shape**
80
+ of every export — not just its name — and `npm run api:check` fails when that shape
81
+ shrinks:
82
+
83
+ | Recorded as | Example |
84
+ |---|---|
85
+ | `interface(a, b?, c(1..2))` | members, sorted; `?` = optional; `(required..total)` = a callable member's arity |
86
+ | `object(…)` / `class(…)` / `enum(…)` | same member vocabulary |
87
+ | `union(a\|b\|c)` | a type alias's union members, normalised + sorted |
88
+ | `fn(1..2)` | a function's `required..total` parameter arity |
89
+ | `const(T)` / `alias(T)` | the normalised type text |
90
+
91
+ So removing an export, dropping an interface field, flipping a field's optionality,
92
+ dropping a union member, or dropping a function parameter all fail — each of them
93
+ breaks a pinned consumer at compile time, and each of them passed the pre-R3-261
94
+ names-only check. Member and parameter **types** are deliberately not compared; see
95
+ the "Deliberate limit" note in [`scripts/lib/dts-shape.mjs`](./scripts/lib/dts-shape.mjs).
96
+
97
+ - **Additive change** (a new export, a new optional field): run `npm run api:update`
98
+ and commit the snapshot, so every API change lands in a reviewed diff.
99
+ - **Deliberate removal**: add an entry to [`api-removals.json`](./api-removals.json)
100
+ with a **reason**, then `npm run api:update`. Without an entry the updater refuses
101
+ to write, so re-running it is not a way past the gate.
102
+ - `npm run api:selftest` proves the gate can fail — it drives the real extractor over
103
+ crafted `.d.ts` fixtures for each break above, checks that additive changes are
104
+ *not* reported as breaking, and pins the two documented blind spots.
105
+
76
106
  ## License
77
107
 
78
108
  [MIT](./LICENSE)
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var chromeState_exports = {};
20
+ __export(chromeState_exports, {
21
+ getChromeState: () => getChromeState,
22
+ onChromeStateChange: () => onChromeStateChange,
23
+ useChromeState: () => useChromeState
24
+ });
25
+ module.exports = __toCommonJS(chromeState_exports);
26
+ var import_pushChannel = require("./pushChannel");
27
+ var import_protocol = require("./generated/protocol");
28
+ const DEFAULT_CHROME_STATE = { overlay: "none", tab: { edge: "top-right" } };
29
+ const isChromeState = (v) => {
30
+ const c = v;
31
+ return !!c && (c.overlay === "none" || c.overlay === "menu") && !!c.tab && typeof c.tab === "object" && c.tab.edge === "top-right";
32
+ };
33
+ const channel = (0, import_pushChannel.createPushChannel)({
34
+ pushType: import_protocol.CHROME_STATE,
35
+ requestType: import_protocol.REQUEST_CHROME_STATE,
36
+ initial: DEFAULT_CHROME_STATE,
37
+ parse: (msg) => isChromeState(msg.chromeState) ? msg.chromeState : void 0
38
+ });
39
+ const getChromeState = () => channel.get();
40
+ const onChromeStateChange = (listener) => channel.onChange(listener);
41
+ const useChromeState = () => channel.use();
42
+ // Annotate the CommonJS export names for ESM import in node:
43
+ 0 && (module.exports = {
44
+ getChromeState,
45
+ onChromeStateChange,
46
+ useChromeState
47
+ });
48
+ //# sourceMappingURL=chromeState.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chromeState.ts"],"sourcesContent":["import { createPushChannel } from './pushChannel';\nimport { CHROME_STATE, REQUEST_CHROME_STATE } from './generated/protocol';\n\n/**\n * What the immediately.run host's own chrome is currently doing over your app\n * (PRESENT_MODE_CHROME_SPEC §6). In run (\"present\") mode the platform shows a\n * single pull-down tab in one corner; activating it opens the platform menu —\n * an anchored panel on desktop, a bottom sheet on mobile — and the host dims\n * and slightly insets your app behind it.\n *\n * Reading this is **entirely optional**. No platform behavior depends on your\n * app consuming it, and an app that never reads it behaves identically\n * (R-PMC-18) — the platform never requires immediately.run knowledge of an app\n * (product value 3). It exists for the two things a cooperative app can do\n * better with it than without:\n *\n * - **Pause while dimmed.** `overlay === 'menu'` means the user is looking at\n * platform chrome, not at you: a good moment to pause a video, an animation,\n * or a polling loop.\n * - **Keep the corner clear.** `tab.edge` says where the platform's tab sits, so\n * a floating control of your own can avoid overlapping it.\n *\n * Baseline capability `chrome:read` — every app may read it. It is a read of the\n * host's own UI state and discloses nothing app-foreign; there is deliberately no\n * counterpart that lets an app *operate* platform chrome.\n *\n * ```ts\n * import { onChromeStateChange } from '@immediately-run/sdk';\n *\n * onChromeStateChange(({ overlay }) => {\n * if (overlay === 'menu') video.pause();\n * });\n * ```\n */\nexport interface ChromeState {\n /**\n * `'menu'` while the platform menu / bottom sheet (and its scrim) is open over\n * your app; `'none'` at rest. Edit mode reports `'none'` — the workbench chrome\n * is beside your app, not over it.\n */\n overlay: 'none' | 'menu';\n /** Where the platform's pull-down tab sits. Only one edge exists today. */\n tab: { edge: 'top-right' };\n}\n\n/**\n * Assumed before the host reports — and the value that stands forever on a host\n * that never pushes this channel (an older host, or one that does not paint\n * present-mode chrome at all). \"Nothing is over you\" is the safe default: an app\n * that gates a pause on it simply never pauses.\n */\nconst DEFAULT_CHROME_STATE: ChromeState = { overlay: 'none', tab: { edge: 'top-right' } };\n\nconst isChromeState = (v: unknown): v is ChromeState => {\n const c = v as Partial<ChromeState> | null;\n return (\n !!c &&\n (c.overlay === 'none' || c.overlay === 'menu') &&\n !!c.tab &&\n typeof c.tab === 'object' &&\n (c.tab as ChromeState['tab']).edge === 'top-right'\n );\n};\n\n// Read over the transport (SDK_PACKAGING_SPEC §4): the host pushes `chrome-state`\n// and answers `request-chrome-state` (wire format: site-main channelBridge.ts).\nconst channel = createPushChannel<ChromeState>({\n pushType: CHROME_STATE,\n requestType: REQUEST_CHROME_STATE,\n initial: DEFAULT_CHROME_STATE,\n parse: (msg) => (isChromeState(msg.chromeState) ? (msg.chromeState as ChromeState) : undefined),\n});\n\n/** Returns the current chrome state. Poll for a one-off read. */\nexport const getChromeState = (): ChromeState => channel.get();\n\n/**\n * Subscribe to chrome-state changes. The listener is invoked immediately with the\n * current value, then again on every change. Returns an unsubscribe fn.\n */\nexport const onChromeStateChange = (listener: (chromeState: ChromeState) => void): (() => void) =>\n channel.onChange(listener);\n\n/** React hook returning the current chrome state, re-rendering on change. */\nexport const useChromeState = (): ChromeState => channel.use();\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAkC;AAClC,sBAAmD;AAkDnD,MAAM,uBAAoC,EAAE,SAAS,QAAQ,KAAK,EAAE,MAAM,YAAY,EAAE;AAExF,MAAM,gBAAgB,CAAC,MAAiC;AACtD,QAAM,IAAI;AACV,SACE,CAAC,CAAC,MACD,EAAE,YAAY,UAAU,EAAE,YAAY,WACvC,CAAC,CAAC,EAAE,OACJ,OAAO,EAAE,QAAQ,YAChB,EAAE,IAA2B,SAAS;AAE3C;AAIA,MAAM,cAAU,sCAA+B;AAAA,EAC7C,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,OAAO,CAAC,QAAS,cAAc,IAAI,WAAW,IAAK,IAAI,cAA8B;AACvF,CAAC;AAGM,MAAM,iBAAiB,MAAmB,QAAQ,IAAI;AAMtD,MAAM,sBAAsB,CAAC,aAClC,QAAQ,SAAS,QAAQ;AAGpB,MAAM,iBAAiB,MAAmB,QAAQ,IAAI;","names":[]}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * What the immediately.run host's own chrome is currently doing over your app
3
+ * (PRESENT_MODE_CHROME_SPEC §6). In run ("present") mode the platform shows a
4
+ * single pull-down tab in one corner; activating it opens the platform menu —
5
+ * an anchored panel on desktop, a bottom sheet on mobile — and the host dims
6
+ * and slightly insets your app behind it.
7
+ *
8
+ * Reading this is **entirely optional**. No platform behavior depends on your
9
+ * app consuming it, and an app that never reads it behaves identically
10
+ * (R-PMC-18) — the platform never requires immediately.run knowledge of an app
11
+ * (product value 3). It exists for the two things a cooperative app can do
12
+ * better with it than without:
13
+ *
14
+ * - **Pause while dimmed.** `overlay === 'menu'` means the user is looking at
15
+ * platform chrome, not at you: a good moment to pause a video, an animation,
16
+ * or a polling loop.
17
+ * - **Keep the corner clear.** `tab.edge` says where the platform's tab sits, so
18
+ * a floating control of your own can avoid overlapping it.
19
+ *
20
+ * Baseline capability `chrome:read` — every app may read it. It is a read of the
21
+ * host's own UI state and discloses nothing app-foreign; there is deliberately no
22
+ * counterpart that lets an app *operate* platform chrome.
23
+ *
24
+ * ```ts
25
+ * import { onChromeStateChange } from '@immediately-run/sdk';
26
+ *
27
+ * onChromeStateChange(({ overlay }) => {
28
+ * if (overlay === 'menu') video.pause();
29
+ * });
30
+ * ```
31
+ */
32
+ interface ChromeState {
33
+ /**
34
+ * `'menu'` while the platform menu / bottom sheet (and its scrim) is open over
35
+ * your app; `'none'` at rest. Edit mode reports `'none'` — the workbench chrome
36
+ * is beside your app, not over it.
37
+ */
38
+ overlay: 'none' | 'menu';
39
+ /** Where the platform's pull-down tab sits. Only one edge exists today. */
40
+ tab: {
41
+ edge: 'top-right';
42
+ };
43
+ }
44
+ /** Returns the current chrome state. Poll for a one-off read. */
45
+ declare const getChromeState: () => ChromeState;
46
+ /**
47
+ * Subscribe to chrome-state changes. The listener is invoked immediately with the
48
+ * current value, then again on every change. Returns an unsubscribe fn.
49
+ */
50
+ declare const onChromeStateChange: (listener: (chromeState: ChromeState) => void) => (() => void);
51
+ /** React hook returning the current chrome state, re-rendering on change. */
52
+ declare const useChromeState: () => ChromeState;
53
+
54
+ export { type ChromeState, getChromeState, onChromeStateChange, useChromeState };
@@ -0,0 +1,54 @@
1
+ /**
2
+ * What the immediately.run host's own chrome is currently doing over your app
3
+ * (PRESENT_MODE_CHROME_SPEC §6). In run ("present") mode the platform shows a
4
+ * single pull-down tab in one corner; activating it opens the platform menu —
5
+ * an anchored panel on desktop, a bottom sheet on mobile — and the host dims
6
+ * and slightly insets your app behind it.
7
+ *
8
+ * Reading this is **entirely optional**. No platform behavior depends on your
9
+ * app consuming it, and an app that never reads it behaves identically
10
+ * (R-PMC-18) — the platform never requires immediately.run knowledge of an app
11
+ * (product value 3). It exists for the two things a cooperative app can do
12
+ * better with it than without:
13
+ *
14
+ * - **Pause while dimmed.** `overlay === 'menu'` means the user is looking at
15
+ * platform chrome, not at you: a good moment to pause a video, an animation,
16
+ * or a polling loop.
17
+ * - **Keep the corner clear.** `tab.edge` says where the platform's tab sits, so
18
+ * a floating control of your own can avoid overlapping it.
19
+ *
20
+ * Baseline capability `chrome:read` — every app may read it. It is a read of the
21
+ * host's own UI state and discloses nothing app-foreign; there is deliberately no
22
+ * counterpart that lets an app *operate* platform chrome.
23
+ *
24
+ * ```ts
25
+ * import { onChromeStateChange } from '@immediately-run/sdk';
26
+ *
27
+ * onChromeStateChange(({ overlay }) => {
28
+ * if (overlay === 'menu') video.pause();
29
+ * });
30
+ * ```
31
+ */
32
+ interface ChromeState {
33
+ /**
34
+ * `'menu'` while the platform menu / bottom sheet (and its scrim) is open over
35
+ * your app; `'none'` at rest. Edit mode reports `'none'` — the workbench chrome
36
+ * is beside your app, not over it.
37
+ */
38
+ overlay: 'none' | 'menu';
39
+ /** Where the platform's pull-down tab sits. Only one edge exists today. */
40
+ tab: {
41
+ edge: 'top-right';
42
+ };
43
+ }
44
+ /** Returns the current chrome state. Poll for a one-off read. */
45
+ declare const getChromeState: () => ChromeState;
46
+ /**
47
+ * Subscribe to chrome-state changes. The listener is invoked immediately with the
48
+ * current value, then again on every change. Returns an unsubscribe fn.
49
+ */
50
+ declare const onChromeStateChange: (listener: (chromeState: ChromeState) => void) => (() => void);
51
+ /** React hook returning the current chrome state, re-rendering on change. */
52
+ declare const useChromeState: () => ChromeState;
53
+
54
+ export { type ChromeState, getChromeState, onChromeStateChange, useChromeState };
@@ -0,0 +1,23 @@
1
+ import "./chunk-VHAA22YE.js";
2
+ import { createPushChannel } from "./pushChannel";
3
+ import { CHROME_STATE, REQUEST_CHROME_STATE } from "./generated/protocol";
4
+ const DEFAULT_CHROME_STATE = { overlay: "none", tab: { edge: "top-right" } };
5
+ const isChromeState = (v) => {
6
+ const c = v;
7
+ return !!c && (c.overlay === "none" || c.overlay === "menu") && !!c.tab && typeof c.tab === "object" && c.tab.edge === "top-right";
8
+ };
9
+ const channel = createPushChannel({
10
+ pushType: CHROME_STATE,
11
+ requestType: REQUEST_CHROME_STATE,
12
+ initial: DEFAULT_CHROME_STATE,
13
+ parse: (msg) => isChromeState(msg.chromeState) ? msg.chromeState : void 0
14
+ });
15
+ const getChromeState = () => channel.get();
16
+ const onChromeStateChange = (listener) => channel.onChange(listener);
17
+ const useChromeState = () => channel.use();
18
+ export {
19
+ getChromeState,
20
+ onChromeStateChange,
21
+ useChromeState
22
+ };
23
+ //# sourceMappingURL=chromeState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chromeState.ts"],"sourcesContent":["import { createPushChannel } from './pushChannel';\nimport { CHROME_STATE, REQUEST_CHROME_STATE } from './generated/protocol';\n\n/**\n * What the immediately.run host's own chrome is currently doing over your app\n * (PRESENT_MODE_CHROME_SPEC §6). In run (\"present\") mode the platform shows a\n * single pull-down tab in one corner; activating it opens the platform menu —\n * an anchored panel on desktop, a bottom sheet on mobile — and the host dims\n * and slightly insets your app behind it.\n *\n * Reading this is **entirely optional**. No platform behavior depends on your\n * app consuming it, and an app that never reads it behaves identically\n * (R-PMC-18) — the platform never requires immediately.run knowledge of an app\n * (product value 3). It exists for the two things a cooperative app can do\n * better with it than without:\n *\n * - **Pause while dimmed.** `overlay === 'menu'` means the user is looking at\n * platform chrome, not at you: a good moment to pause a video, an animation,\n * or a polling loop.\n * - **Keep the corner clear.** `tab.edge` says where the platform's tab sits, so\n * a floating control of your own can avoid overlapping it.\n *\n * Baseline capability `chrome:read` — every app may read it. It is a read of the\n * host's own UI state and discloses nothing app-foreign; there is deliberately no\n * counterpart that lets an app *operate* platform chrome.\n *\n * ```ts\n * import { onChromeStateChange } from '@immediately-run/sdk';\n *\n * onChromeStateChange(({ overlay }) => {\n * if (overlay === 'menu') video.pause();\n * });\n * ```\n */\nexport interface ChromeState {\n /**\n * `'menu'` while the platform menu / bottom sheet (and its scrim) is open over\n * your app; `'none'` at rest. Edit mode reports `'none'` — the workbench chrome\n * is beside your app, not over it.\n */\n overlay: 'none' | 'menu';\n /** Where the platform's pull-down tab sits. Only one edge exists today. */\n tab: { edge: 'top-right' };\n}\n\n/**\n * Assumed before the host reports — and the value that stands forever on a host\n * that never pushes this channel (an older host, or one that does not paint\n * present-mode chrome at all). \"Nothing is over you\" is the safe default: an app\n * that gates a pause on it simply never pauses.\n */\nconst DEFAULT_CHROME_STATE: ChromeState = { overlay: 'none', tab: { edge: 'top-right' } };\n\nconst isChromeState = (v: unknown): v is ChromeState => {\n const c = v as Partial<ChromeState> | null;\n return (\n !!c &&\n (c.overlay === 'none' || c.overlay === 'menu') &&\n !!c.tab &&\n typeof c.tab === 'object' &&\n (c.tab as ChromeState['tab']).edge === 'top-right'\n );\n};\n\n// Read over the transport (SDK_PACKAGING_SPEC §4): the host pushes `chrome-state`\n// and answers `request-chrome-state` (wire format: site-main channelBridge.ts).\nconst channel = createPushChannel<ChromeState>({\n pushType: CHROME_STATE,\n requestType: REQUEST_CHROME_STATE,\n initial: DEFAULT_CHROME_STATE,\n parse: (msg) => (isChromeState(msg.chromeState) ? (msg.chromeState as ChromeState) : undefined),\n});\n\n/** Returns the current chrome state. Poll for a one-off read. */\nexport const getChromeState = (): ChromeState => channel.get();\n\n/**\n * Subscribe to chrome-state changes. The listener is invoked immediately with the\n * current value, then again on every change. Returns an unsubscribe fn.\n */\nexport const onChromeStateChange = (listener: (chromeState: ChromeState) => void): (() => void) =>\n channel.onChange(listener);\n\n/** React hook returning the current chrome state, re-rendering on change. */\nexport const useChromeState = (): ChromeState => channel.use();\n"],"mappings":";AAAA,SAAS,yBAAyB;AAClC,SAAS,cAAc,4BAA4B;AAkDnD,MAAM,uBAAoC,EAAE,SAAS,QAAQ,KAAK,EAAE,MAAM,YAAY,EAAE;AAExF,MAAM,gBAAgB,CAAC,MAAiC;AACtD,QAAM,IAAI;AACV,SACE,CAAC,CAAC,MACD,EAAE,YAAY,UAAU,EAAE,YAAY,WACvC,CAAC,CAAC,EAAE,OACJ,OAAO,EAAE,QAAQ,YAChB,EAAE,IAA2B,SAAS;AAE3C;AAIA,MAAM,UAAU,kBAA+B;AAAA,EAC7C,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,EACT,OAAO,CAAC,QAAS,cAAc,IAAI,WAAW,IAAK,IAAI,cAA8B;AACvF,CAAC;AAGM,MAAM,iBAAiB,MAAmB,QAAQ,IAAI;AAMtD,MAAM,sBAAsB,CAAC,aAClC,QAAQ,SAAS,QAAQ;AAGpB,MAAM,iBAAiB,MAAmB,QAAQ,IAAI;","names":[]}
package/dist/feed.cjs ADDED
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var feed_exports = {};
20
+ __export(feed_exports, {
21
+ feedFetch: () => feedFetch
22
+ });
23
+ module.exports = __toCommonJS(feed_exports);
24
+ var import_sandboxUtils = require("./sandboxUtils");
25
+ var import_protocolSchemes = require("./protocolSchemes");
26
+ var import_protocol = require("./generated/protocol");
27
+ const feedFetch = async (instanceId, params = {}) => {
28
+ const res = await (0, import_sandboxUtils.protocolRequest)(import_protocolSchemes.SCHEMES[import_protocol.PROTOCOL_FEED], "fetch", [{ instanceId, params }]);
29
+ if (!res || res.ok !== true) {
30
+ const err = new Error(res?.message ?? "feedFetch failed");
31
+ err.code = (res && "code" in res ? res.code : void 0) ?? "unknown";
32
+ throw err;
33
+ }
34
+ return res.data;
35
+ };
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ feedFetch
39
+ });
40
+ //# sourceMappingURL=feed.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/feed.ts"],"sourcesContent":["// feedFetch — the connector's egress, and the difference between it and `hostFetch`\n// is the whole of D2 (`reckoner/docs/specs/CONNECTOR_EGRESS_FIXING_SPEC.md` §2).\n//\n// `hostFetch(url, init)` takes a URL. The host checks it against your effective\n// allowlist, but *within* that allowlist your app picks which host, which path and\n// what body, on every call. That is fine for an app whose logic you control.\n//\n// It is not fine for a **connector** — an app whose job is to pump bytes from a feed\n// into a document, where the bytes it fetched are, in effect, a program steering it\n// (`REPORTING_SPREADSHEET §3.2` RB-1). An allowlist bounds the host *set*; it does\n// nothing about per-call choice inside that set, and nothing at all about the body.\n//\n// So `feedFetch` does not take a URL. It takes a **feed-instance id** and a typed\n// **param object**, and the host constructs the request from a template it compiled,\n// at grant time, from your app's trusted feed configuration. Your code cannot name a\n// target, so content your code just read cannot name one either.\n//\n// What that means in practice when you write a connector:\n//\n// • the origin, path and method come from your manifest's `feed:fetch` config —\n// not from this call, and not from anything you fetched;\n// • `params` fill only the slots the template declared, and each is typed\n// (an ISO-8601 instant, a bounded integer, or one of a declared enum). A value\n// that is not what the slot declared is rejected — including, incidentally,\n// anything URL-shaped;\n// • **pagination is not yours.** The host mints the cursor, keeps it, and spends it;\n// you neither supply nor receive one. A cursor you round-tripped would be either\n// bytes you authored or a function of bytes you fetched, and both are exactly what\n// this surface exists to prevent;\n// • a `POST`/body feed's body comes from the template too. There is no parameter\n// that carries body bytes.\n//\n// Hold `feed:fetch` **instead of** `net:fetch`, not alongside it. An app holding\n// `net:fetch` has the URL surface back regardless of any template it was also given,\n// which is why they are two capabilities and not one with a flag.\n\nimport { protocolRequest } from './sandboxUtils';\nimport { SCHEMES } from './protocolSchemes';\nimport { PROTOCOL_FEED } from './generated/protocol';\n\n/** Values a feed template's declared slots accept. The host validates each against\n * the slot's declared type; anything else is `invalid-params`. */\nexport type FeedParams = Record<string, string | number>;\n\n/** The serialized response from {@link feedFetch} — the same shape `hostFetch`\n * returns, because reading a feed should feel like reading a fetch. The difference\n * is entirely in what you may ASK for. */\nexport interface FeedFetchResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n /** True if the body hit the host's size cap and was truncated. */\n truncated: boolean;\n}\n\n/**\n * Fire one of your app's configured feeds through the host.\n *\n * ```ts\n * // `instanceId` comes from the host when the feed is launched — it is opaque,\n * // host-minted, and bound to your app; you never construct one.\n * const res = await feedFetch(instanceId, { since: '2026-08-01T00:00:00Z' });\n * const rows = JSON.parse(res.body);\n * ```\n *\n * A reachable server's reply — including a non-2xx status — RESOLVES; inspect\n * `.status`. Everything else REJECTS with an {@link Error} carrying a machine `.code`:\n *\n * - `forbidden` — you do not hold `feed:fetch`, or `instanceId` is not one of yours.\n * **The two are deliberately indistinguishable**, so this is not an oracle for which\n * feeds exist.\n * - `invalid-params` — a param the template does not declare, a value that is not what\n * its slot declared, or a body that would exceed the template's cap. Naming a cursor\n * slot lands here too: the cursor is the host's, not a parameter.\n * - `budget` — this instance's request budget is spent. It bounds runaway loops; it is\n * a tripwire, not containment.\n * - `unsupported` — the host's pinned egress path is unavailable. `feedFetch`\n * deliberately has **no fallback**: the alternative path does no DNS resolution and no\n * socket pinning, and silently downgrading a credentialed feed onto it is the hazard\n * this whole mechanism removes. A connector that cannot use the pinned path does not\n * fetch.\n * - `blocked` / `redirect` / `too-large` / `network` — the same server-side SSRF,\n * per-hop redirect and size guards every proxied fetch meets.\n */\n// The parameter is spelled structurally rather than as `FeedParams`, deliberately: the\n// wire descriptor in `@immediately-run/sandbox-protocol` records the type that actually\n// crosses the boundary, and an SDK-local alias name in a CROSS-REPO wire contract would\n// describe this package rather than the protocol. `FeedParams` stays exported as the\n// name callers write.\nexport const feedFetch = async (\n instanceId: string,\n params: Record<string, string | number> = {},\n): Promise<FeedFetchResponse> => {\n const res = (await protocolRequest(SCHEMES[PROTOCOL_FEED], 'fetch', [{ instanceId, params }])) as\n | { ok: true; data: FeedFetchResponse }\n | { ok: false; code?: string; message?: string }\n | undefined;\n if (!res || res.ok !== true) {\n const err = new Error(res?.message ?? 'feedFetch failed') as Error & { code?: string };\n err.code = (res && 'code' in res ? res.code : undefined) ?? 'unknown';\n throw err;\n }\n return res.data;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoCA,0BAAgC;AAChC,6BAAwB;AACxB,sBAA8B;AAoDvB,MAAM,YAAY,OACvB,YACA,SAA0C,CAAC,MACZ;AAC/B,QAAM,MAAO,UAAM,qCAAgB,+BAAQ,6BAAa,GAAG,SAAS,CAAC,EAAE,YAAY,OAAO,CAAC,CAAC;AAI5F,MAAI,CAAC,OAAO,IAAI,OAAO,MAAM;AAC3B,UAAM,MAAM,IAAI,MAAM,KAAK,WAAW,kBAAkB;AACxD,QAAI,QAAQ,OAAO,UAAU,MAAM,IAAI,OAAO,WAAc;AAC5D,UAAM;AAAA,EACR;AACA,SAAO,IAAI;AACb;","names":[]}
@@ -0,0 +1,46 @@
1
+ /** Values a feed template's declared slots accept. The host validates each against
2
+ * the slot's declared type; anything else is `invalid-params`. */
3
+ type FeedParams = Record<string, string | number>;
4
+ /** The serialized response from {@link feedFetch} — the same shape `hostFetch`
5
+ * returns, because reading a feed should feel like reading a fetch. The difference
6
+ * is entirely in what you may ASK for. */
7
+ interface FeedFetchResponse {
8
+ status: number;
9
+ statusText: string;
10
+ headers: Record<string, string>;
11
+ body: string;
12
+ /** True if the body hit the host's size cap and was truncated. */
13
+ truncated: boolean;
14
+ }
15
+ /**
16
+ * Fire one of your app's configured feeds through the host.
17
+ *
18
+ * ```ts
19
+ * // `instanceId` comes from the host when the feed is launched — it is opaque,
20
+ * // host-minted, and bound to your app; you never construct one.
21
+ * const res = await feedFetch(instanceId, { since: '2026-08-01T00:00:00Z' });
22
+ * const rows = JSON.parse(res.body);
23
+ * ```
24
+ *
25
+ * A reachable server's reply — including a non-2xx status — RESOLVES; inspect
26
+ * `.status`. Everything else REJECTS with an {@link Error} carrying a machine `.code`:
27
+ *
28
+ * - `forbidden` — you do not hold `feed:fetch`, or `instanceId` is not one of yours.
29
+ * **The two are deliberately indistinguishable**, so this is not an oracle for which
30
+ * feeds exist.
31
+ * - `invalid-params` — a param the template does not declare, a value that is not what
32
+ * its slot declared, or a body that would exceed the template's cap. Naming a cursor
33
+ * slot lands here too: the cursor is the host's, not a parameter.
34
+ * - `budget` — this instance's request budget is spent. It bounds runaway loops; it is
35
+ * a tripwire, not containment.
36
+ * - `unsupported` — the host's pinned egress path is unavailable. `feedFetch`
37
+ * deliberately has **no fallback**: the alternative path does no DNS resolution and no
38
+ * socket pinning, and silently downgrading a credentialed feed onto it is the hazard
39
+ * this whole mechanism removes. A connector that cannot use the pinned path does not
40
+ * fetch.
41
+ * - `blocked` / `redirect` / `too-large` / `network` — the same server-side SSRF,
42
+ * per-hop redirect and size guards every proxied fetch meets.
43
+ */
44
+ declare const feedFetch: (instanceId: string, params?: Record<string, string | number>) => Promise<FeedFetchResponse>;
45
+
46
+ export { type FeedFetchResponse, type FeedParams, feedFetch };
package/dist/feed.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ /** Values a feed template's declared slots accept. The host validates each against
2
+ * the slot's declared type; anything else is `invalid-params`. */
3
+ type FeedParams = Record<string, string | number>;
4
+ /** The serialized response from {@link feedFetch} — the same shape `hostFetch`
5
+ * returns, because reading a feed should feel like reading a fetch. The difference
6
+ * is entirely in what you may ASK for. */
7
+ interface FeedFetchResponse {
8
+ status: number;
9
+ statusText: string;
10
+ headers: Record<string, string>;
11
+ body: string;
12
+ /** True if the body hit the host's size cap and was truncated. */
13
+ truncated: boolean;
14
+ }
15
+ /**
16
+ * Fire one of your app's configured feeds through the host.
17
+ *
18
+ * ```ts
19
+ * // `instanceId` comes from the host when the feed is launched — it is opaque,
20
+ * // host-minted, and bound to your app; you never construct one.
21
+ * const res = await feedFetch(instanceId, { since: '2026-08-01T00:00:00Z' });
22
+ * const rows = JSON.parse(res.body);
23
+ * ```
24
+ *
25
+ * A reachable server's reply — including a non-2xx status — RESOLVES; inspect
26
+ * `.status`. Everything else REJECTS with an {@link Error} carrying a machine `.code`:
27
+ *
28
+ * - `forbidden` — you do not hold `feed:fetch`, or `instanceId` is not one of yours.
29
+ * **The two are deliberately indistinguishable**, so this is not an oracle for which
30
+ * feeds exist.
31
+ * - `invalid-params` — a param the template does not declare, a value that is not what
32
+ * its slot declared, or a body that would exceed the template's cap. Naming a cursor
33
+ * slot lands here too: the cursor is the host's, not a parameter.
34
+ * - `budget` — this instance's request budget is spent. It bounds runaway loops; it is
35
+ * a tripwire, not containment.
36
+ * - `unsupported` — the host's pinned egress path is unavailable. `feedFetch`
37
+ * deliberately has **no fallback**: the alternative path does no DNS resolution and no
38
+ * socket pinning, and silently downgrading a credentialed feed onto it is the hazard
39
+ * this whole mechanism removes. A connector that cannot use the pinned path does not
40
+ * fetch.
41
+ * - `blocked` / `redirect` / `too-large` / `network` — the same server-side SSRF,
42
+ * per-hop redirect and size guards every proxied fetch meets.
43
+ */
44
+ declare const feedFetch: (instanceId: string, params?: Record<string, string | number>) => Promise<FeedFetchResponse>;
45
+
46
+ export { type FeedFetchResponse, type FeedParams, feedFetch };
package/dist/feed.js ADDED
@@ -0,0 +1,17 @@
1
+ import "./chunk-VHAA22YE.js";
2
+ import { protocolRequest } from "./sandboxUtils";
3
+ import { SCHEMES } from "./protocolSchemes";
4
+ import { PROTOCOL_FEED } from "./generated/protocol";
5
+ const feedFetch = async (instanceId, params = {}) => {
6
+ const res = await protocolRequest(SCHEMES[PROTOCOL_FEED], "fetch", [{ instanceId, params }]);
7
+ if (!res || res.ok !== true) {
8
+ const err = new Error(res?.message ?? "feedFetch failed");
9
+ err.code = (res && "code" in res ? res.code : void 0) ?? "unknown";
10
+ throw err;
11
+ }
12
+ return res.data;
13
+ };
14
+ export {
15
+ feedFetch
16
+ };
17
+ //# sourceMappingURL=feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/feed.ts"],"sourcesContent":["// feedFetch — the connector's egress, and the difference between it and `hostFetch`\n// is the whole of D2 (`reckoner/docs/specs/CONNECTOR_EGRESS_FIXING_SPEC.md` §2).\n//\n// `hostFetch(url, init)` takes a URL. The host checks it against your effective\n// allowlist, but *within* that allowlist your app picks which host, which path and\n// what body, on every call. That is fine for an app whose logic you control.\n//\n// It is not fine for a **connector** — an app whose job is to pump bytes from a feed\n// into a document, where the bytes it fetched are, in effect, a program steering it\n// (`REPORTING_SPREADSHEET §3.2` RB-1). An allowlist bounds the host *set*; it does\n// nothing about per-call choice inside that set, and nothing at all about the body.\n//\n// So `feedFetch` does not take a URL. It takes a **feed-instance id** and a typed\n// **param object**, and the host constructs the request from a template it compiled,\n// at grant time, from your app's trusted feed configuration. Your code cannot name a\n// target, so content your code just read cannot name one either.\n//\n// What that means in practice when you write a connector:\n//\n// • the origin, path and method come from your manifest's `feed:fetch` config —\n// not from this call, and not from anything you fetched;\n// • `params` fill only the slots the template declared, and each is typed\n// (an ISO-8601 instant, a bounded integer, or one of a declared enum). A value\n// that is not what the slot declared is rejected — including, incidentally,\n// anything URL-shaped;\n// • **pagination is not yours.** The host mints the cursor, keeps it, and spends it;\n// you neither supply nor receive one. A cursor you round-tripped would be either\n// bytes you authored or a function of bytes you fetched, and both are exactly what\n// this surface exists to prevent;\n// • a `POST`/body feed's body comes from the template too. There is no parameter\n// that carries body bytes.\n//\n// Hold `feed:fetch` **instead of** `net:fetch`, not alongside it. An app holding\n// `net:fetch` has the URL surface back regardless of any template it was also given,\n// which is why they are two capabilities and not one with a flag.\n\nimport { protocolRequest } from './sandboxUtils';\nimport { SCHEMES } from './protocolSchemes';\nimport { PROTOCOL_FEED } from './generated/protocol';\n\n/** Values a feed template's declared slots accept. The host validates each against\n * the slot's declared type; anything else is `invalid-params`. */\nexport type FeedParams = Record<string, string | number>;\n\n/** The serialized response from {@link feedFetch} — the same shape `hostFetch`\n * returns, because reading a feed should feel like reading a fetch. The difference\n * is entirely in what you may ASK for. */\nexport interface FeedFetchResponse {\n status: number;\n statusText: string;\n headers: Record<string, string>;\n body: string;\n /** True if the body hit the host's size cap and was truncated. */\n truncated: boolean;\n}\n\n/**\n * Fire one of your app's configured feeds through the host.\n *\n * ```ts\n * // `instanceId` comes from the host when the feed is launched — it is opaque,\n * // host-minted, and bound to your app; you never construct one.\n * const res = await feedFetch(instanceId, { since: '2026-08-01T00:00:00Z' });\n * const rows = JSON.parse(res.body);\n * ```\n *\n * A reachable server's reply — including a non-2xx status — RESOLVES; inspect\n * `.status`. Everything else REJECTS with an {@link Error} carrying a machine `.code`:\n *\n * - `forbidden` — you do not hold `feed:fetch`, or `instanceId` is not one of yours.\n * **The two are deliberately indistinguishable**, so this is not an oracle for which\n * feeds exist.\n * - `invalid-params` — a param the template does not declare, a value that is not what\n * its slot declared, or a body that would exceed the template's cap. Naming a cursor\n * slot lands here too: the cursor is the host's, not a parameter.\n * - `budget` — this instance's request budget is spent. It bounds runaway loops; it is\n * a tripwire, not containment.\n * - `unsupported` — the host's pinned egress path is unavailable. `feedFetch`\n * deliberately has **no fallback**: the alternative path does no DNS resolution and no\n * socket pinning, and silently downgrading a credentialed feed onto it is the hazard\n * this whole mechanism removes. A connector that cannot use the pinned path does not\n * fetch.\n * - `blocked` / `redirect` / `too-large` / `network` — the same server-side SSRF,\n * per-hop redirect and size guards every proxied fetch meets.\n */\n// The parameter is spelled structurally rather than as `FeedParams`, deliberately: the\n// wire descriptor in `@immediately-run/sandbox-protocol` records the type that actually\n// crosses the boundary, and an SDK-local alias name in a CROSS-REPO wire contract would\n// describe this package rather than the protocol. `FeedParams` stays exported as the\n// name callers write.\nexport const feedFetch = async (\n instanceId: string,\n params: Record<string, string | number> = {},\n): Promise<FeedFetchResponse> => {\n const res = (await protocolRequest(SCHEMES[PROTOCOL_FEED], 'fetch', [{ instanceId, params }])) as\n | { ok: true; data: FeedFetchResponse }\n | { ok: false; code?: string; message?: string }\n | undefined;\n if (!res || res.ok !== true) {\n const err = new Error(res?.message ?? 'feedFetch failed') as Error & { code?: string };\n err.code = (res && 'code' in res ? res.code : undefined) ?? 'unknown';\n throw err;\n }\n return res.data;\n};\n"],"mappings":";AAoCA,SAAS,uBAAuB;AAChC,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAoDvB,MAAM,YAAY,OACvB,YACA,SAA0C,CAAC,MACZ;AAC/B,QAAM,MAAO,MAAM,gBAAgB,QAAQ,aAAa,GAAG,SAAS,CAAC,EAAE,YAAY,OAAO,CAAC,CAAC;AAI5F,MAAI,CAAC,OAAO,IAAI,OAAO,MAAM;AAC3B,UAAM,MAAM,IAAI,MAAM,KAAK,WAAW,kBAAkB;AACxD,QAAI,QAAQ,OAAO,UAAU,MAAM,IAAI,OAAO,WAAc;AAC5D,UAAM;AAAA,EACR;AACA,SAAO,IAAI;AACb;","names":[]}
package/dist/index.cjs CHANGED
@@ -43,6 +43,7 @@ __reExport(index_exports, require("./theme"), module.exports);
43
43
  __reExport(index_exports, require("./editorContext"), module.exports);
44
44
  __reExport(index_exports, require("./editor"), module.exports);
45
45
  __reExport(index_exports, require("./formFactor"), module.exports);
46
+ __reExport(index_exports, require("./chromeState"), module.exports);
46
47
  __reExport(index_exports, require("./hostAttention"), module.exports);
47
48
  __reExport(index_exports, require("./region"), module.exports);
48
49
  __reExport(index_exports, require("./mounts"), module.exports);
@@ -52,6 +53,7 @@ __reExport(index_exports, require("./catalog"), module.exports);
52
53
  __reExport(index_exports, require("./ipc"), module.exports);
53
54
  __reExport(index_exports, require("./dnd"), module.exports);
54
55
  __reExport(index_exports, require("./netFetch"), module.exports);
56
+ __reExport(index_exports, require("./feed"), module.exports);
55
57
  __reExport(index_exports, require("./secrets"), module.exports);
56
58
  __reExport(index_exports, require("./llm"), module.exports);
57
59
  __reExport(index_exports, require("./diagnostics"), module.exports);
@@ -91,6 +93,7 @@ __reExport(index_exports, require("./safeContent"), module.exports);
91
93
  ...require("./editorContext"),
92
94
  ...require("./editor"),
93
95
  ...require("./formFactor"),
96
+ ...require("./chromeState"),
94
97
  ...require("./hostAttention"),
95
98
  ...require("./region"),
96
99
  ...require("./mounts"),
@@ -100,6 +103,7 @@ __reExport(index_exports, require("./safeContent"), module.exports);
100
103
  ...require("./ipc"),
101
104
  ...require("./dnd"),
102
105
  ...require("./netFetch"),
106
+ ...require("./feed"),
103
107
  ...require("./secrets"),
104
108
  ...require("./llm"),
105
109
  ...require("./diagnostics"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './MDXProvider';\nexport * from './routing';\nexport * from './boot';\nexport * from './components/Include';\n// Only the component is public. `stripFrontmatter`/`appMountRelative` are module-level\n// exports so they can be unit-tested directly, NOT public API — the SDK's surface is\n// backwards-compatible forever, so an internal helper exported for a test's convenience is a\n// permanent commitment made for the wrong reason.\nexport { SafeInclude } from './components/SafeInclude';\nexport * from './sourceCache';\nexport * from './components/MDXComponents';\nexport * from './linkSpace';\nexport * from './corpus';\nexport * from './components/MountImage';\nexport * from './components/Routes';\nexport * from './hooks';\n// R3-276: the supported way for a viewer app to provide its own metadata store,\n// replacing a wholesale re-provision of `TinkerableContext` in app code.\nexport * from './metadataSource';\n// The deprecated injected-bundler adapters, re-exported so their deprecation notices\n// are visible in the published docs (R3-278; the window only narrows).\nexport { getInjectedMetadataEmitter, getInjectedMetadataSnapshot } from './injectedBundler';\nexport * from './auth';\nexport * from './theme';\nexport * from './editorContext';\nexport * from './editor';\nexport * from './formFactor';\nexport * from './hostAttention';\nexport * from './region';\nexport * from './mounts';\nexport * from './analytics';\nexport * from './contribute';\nexport * from './catalog';\nexport * from './ipc';\nexport * from './dnd';\nexport * from './netFetch';\nexport * from './secrets';\nexport * from './llm';\nexport * from './diagnostics';\nexport * from './vcs';\nexport * from './onFsChange';\nexport * from './fs';\nexport * from './debug';\nexport * from './tasks';\nexport * from './launch';\nexport * from './runtime';\nexport * from './irMarkers';\nexport * from './ready';\nexport * from './loading';\nexport * from './protocolStream';\nexport * from './protocolDeadline';\nexport * from './sandboxTypes';\nexport * from './safeContent';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAc,0BAAd;AACA,0BAAc,sBADd;AAEA,0BAAc,mBAFd;AAGA,0BAAc,iCAHd;AAQA,yBAA4B;AAC5B,0BAAc,0BATd;AAUA,0BAAc,uCAVd;AAWA,0BAAc,wBAXd;AAYA,0BAAc,qBAZd;AAaA,0BAAc,oCAbd;AAcA,0BAAc,gCAdd;AAeA,0BAAc,oBAfd;AAkBA,0BAAc,6BAlBd;AAqBA,6BAAwE;AACxE,0BAAc,mBAtBd;AAuBA,0BAAc,oBAvBd;AAwBA,0BAAc,4BAxBd;AAyBA,0BAAc,qBAzBd;AA0BA,0BAAc,yBA1Bd;AA2BA,0BAAc,4BA3Bd;AA4BA,0BAAc,qBA5Bd;AA6BA,0BAAc,qBA7Bd;AA8BA,0BAAc,wBA9Bd;AA+BA,0BAAc,yBA/Bd;AAgCA,0BAAc,sBAhCd;AAiCA,0BAAc,kBAjCd;AAkCA,0BAAc,kBAlCd;AAmCA,0BAAc,uBAnCd;AAoCA,0BAAc,sBApCd;AAqCA,0BAAc,kBArCd;AAsCA,0BAAc,0BAtCd;AAuCA,0BAAc,kBAvCd;AAwCA,0BAAc,yBAxCd;AAyCA,0BAAc,iBAzCd;AA0CA,0BAAc,oBA1Cd;AA2CA,0BAAc,oBA3Cd;AA4CA,0BAAc,qBA5Cd;AA6CA,0BAAc,sBA7Cd;AA8CA,0BAAc,wBA9Cd;AA+CA,0BAAc,oBA/Cd;AAgDA,0BAAc,sBAhDd;AAiDA,0BAAc,6BAjDd;AAkDA,0BAAc,+BAlDd;AAmDA,0BAAc,2BAnDd;AAoDA,0BAAc,0BApDd;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './MDXProvider';\nexport * from './routing';\nexport * from './boot';\nexport * from './components/Include';\n// Only the component is public. `stripFrontmatter`/`appMountRelative` are module-level\n// exports so they can be unit-tested directly, NOT public API — the SDK's surface is\n// backwards-compatible forever, so an internal helper exported for a test's convenience is a\n// permanent commitment made for the wrong reason.\nexport { SafeInclude } from './components/SafeInclude';\nexport * from './sourceCache';\nexport * from './components/MDXComponents';\nexport * from './linkSpace';\nexport * from './corpus';\nexport * from './components/MountImage';\nexport * from './components/Routes';\nexport * from './hooks';\n// R3-276: the supported way for a viewer app to provide its own metadata store,\n// replacing a wholesale re-provision of `TinkerableContext` in app code.\nexport * from './metadataSource';\n// The deprecated injected-bundler adapters, re-exported so their deprecation notices\n// are visible in the published docs (R3-278; the window only narrows).\nexport { getInjectedMetadataEmitter, getInjectedMetadataSnapshot } from './injectedBundler';\nexport * from './auth';\nexport * from './theme';\nexport * from './editorContext';\nexport * from './editor';\nexport * from './formFactor';\nexport * from './chromeState';\nexport * from './hostAttention';\nexport * from './region';\nexport * from './mounts';\nexport * from './analytics';\nexport * from './contribute';\nexport * from './catalog';\nexport * from './ipc';\nexport * from './dnd';\nexport * from './netFetch';\nexport * from './feed';\nexport * from './secrets';\nexport * from './llm';\nexport * from './diagnostics';\nexport * from './vcs';\nexport * from './onFsChange';\nexport * from './fs';\nexport * from './debug';\nexport * from './tasks';\nexport * from './launch';\nexport * from './runtime';\nexport * from './irMarkers';\nexport * from './ready';\nexport * from './loading';\nexport * from './protocolStream';\nexport * from './protocolDeadline';\nexport * from './sandboxTypes';\nexport * from './safeContent';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAc,0BAAd;AACA,0BAAc,sBADd;AAEA,0BAAc,mBAFd;AAGA,0BAAc,iCAHd;AAQA,yBAA4B;AAC5B,0BAAc,0BATd;AAUA,0BAAc,uCAVd;AAWA,0BAAc,wBAXd;AAYA,0BAAc,qBAZd;AAaA,0BAAc,oCAbd;AAcA,0BAAc,gCAdd;AAeA,0BAAc,oBAfd;AAkBA,0BAAc,6BAlBd;AAqBA,6BAAwE;AACxE,0BAAc,mBAtBd;AAuBA,0BAAc,oBAvBd;AAwBA,0BAAc,4BAxBd;AAyBA,0BAAc,qBAzBd;AA0BA,0BAAc,yBA1Bd;AA2BA,0BAAc,0BA3Bd;AA4BA,0BAAc,4BA5Bd;AA6BA,0BAAc,qBA7Bd;AA8BA,0BAAc,qBA9Bd;AA+BA,0BAAc,wBA/Bd;AAgCA,0BAAc,yBAhCd;AAiCA,0BAAc,sBAjCd;AAkCA,0BAAc,kBAlCd;AAmCA,0BAAc,kBAnCd;AAoCA,0BAAc,uBApCd;AAqCA,0BAAc,mBArCd;AAsCA,0BAAc,sBAtCd;AAuCA,0BAAc,kBAvCd;AAwCA,0BAAc,0BAxCd;AAyCA,0BAAc,kBAzCd;AA0CA,0BAAc,yBA1Cd;AA2CA,0BAAc,iBA3Cd;AA4CA,0BAAc,oBA5Cd;AA6CA,0BAAc,oBA7Cd;AA8CA,0BAAc,qBA9Cd;AA+CA,0BAAc,sBA/Cd;AAgDA,0BAAc,wBAhDd;AAiDA,0BAAc,oBAjDd;AAkDA,0BAAc,sBAlDd;AAmDA,0BAAc,6BAnDd;AAoDA,0BAAc,+BApDd;AAqDA,0BAAc,2BArDd;AAsDA,0BAAc,0BAtDd;","names":[]}
package/dist/index.d.cts CHANGED
@@ -17,6 +17,7 @@ export { HostTheme, getHostTheme, onHostThemeChange, setHostTheme, useHostTheme
17
17
  export { EditorContext, getEditorContext, onEditorContextChange, useEditorContext } from './editorContext.cjs';
18
18
  export { EditTarget, EditorOpenError, EditorSessionError, EditorWriteError, RequestEditError, closeFile, createFile, createFolder, deleteEntry, openInEditor, renameEntry, requestEdit, setActiveFile, uploadFile } from './editor.cjs';
19
19
  export { FormFactor, FormFactorClass, Orientation, getFormFactor, onFormFactorChange, useFormFactor } from './formFactor.cjs';
20
+ export { ChromeState, getChromeState, onChromeStateChange, useChromeState } from './chromeState.cjs';
20
21
  export { HostAttention, HostAttentionKind, NO_HOST_ATTENTION, getHostAttention, onHostAttentionChange, useHostAttention } from './hostAttention.cjs';
21
22
  export { getRegion, useRegion } from './region.cjs';
22
23
  export { Invite, MountQuery, MountRemoveReason, MountRule, RemovedMount, SandboxMount, SessionMount, SpaceError, acceptInvite, awaitMatchingMount, createSpace, declineInvite, findMount, getAppMountPath, getInvites, getMounts, getSessionMounts, importSettingsFromParent, listMyInvites, listPendingInvites, listSettingsApps, makeContentRef, mount, mountSpace, onInvitesChange, onMountsChange, onSessionMountsChange, openSettings, openSettingsOf, requestMount, requestSpace, resolveContentRef, resolveContentRefs, revokeInvite, unmountSpace, useInvites, useMounts, useSessionMounts, waitForMount } from './mounts.cjs';
@@ -26,6 +27,7 @@ export { ApiMethod, getCatalog, invoke, invokeStream, onCatalogChange, useCatalo
26
27
  export { RegionMessage, onRegionMessage, postToRegion, revealRegion, useRegionMessage } from './ipc.cjs';
27
28
  export { DraggableItem, DroppedItem, ItemDragError, cancelItemDrag, onItemDrop, startItemDrag, useDroppedItem } from './dnd.cjs';
28
29
  export { HostFetchInit, HostFetchResponse, HostFetchStreamEvent, HostFetchStreamResult, hostFetch, hostFetchStream } from './netFetch.cjs';
30
+ export { FeedFetchResponse, FeedParams, feedFetch } from './feed.cjs';
29
31
  export { SecretError, SecretGrant, SecretHints, SecretQuery, SecretType, SecretView, getSecrets, onSecretsChange, requestAddSecret, requestSecret, revokeSecret, useSecrets } from './secrets.cjs';
30
32
  export { ChatDelta, ChatFeatures, ChatMessage, ChatProviderInfo, ChatProviderState, ChatRequest, ChatResult, ChatRole, ChatStopReason, ContentPart, ToolDef, chat, describeChat, describeChatState, normalizeProviderInfo, onChatProviderChange, onChatProviderStateChange, useChatProvider, useChatProviderState } from './llm.cjs';
31
33
  export { BuildError, ConsoleEntry, ConsoleLevel, Diagnostics, DiagnosticsProvenance, getDiagnostics, onDiagnosticsChange, useDiagnostics } from './diagnostics.cjs';
package/dist/index.d.ts CHANGED
@@ -17,6 +17,7 @@ export { HostTheme, getHostTheme, onHostThemeChange, setHostTheme, useHostTheme
17
17
  export { EditorContext, getEditorContext, onEditorContextChange, useEditorContext } from './editorContext.js';
18
18
  export { EditTarget, EditorOpenError, EditorSessionError, EditorWriteError, RequestEditError, closeFile, createFile, createFolder, deleteEntry, openInEditor, renameEntry, requestEdit, setActiveFile, uploadFile } from './editor.js';
19
19
  export { FormFactor, FormFactorClass, Orientation, getFormFactor, onFormFactorChange, useFormFactor } from './formFactor.js';
20
+ export { ChromeState, getChromeState, onChromeStateChange, useChromeState } from './chromeState.js';
20
21
  export { HostAttention, HostAttentionKind, NO_HOST_ATTENTION, getHostAttention, onHostAttentionChange, useHostAttention } from './hostAttention.js';
21
22
  export { getRegion, useRegion } from './region.js';
22
23
  export { Invite, MountQuery, MountRemoveReason, MountRule, RemovedMount, SandboxMount, SessionMount, SpaceError, acceptInvite, awaitMatchingMount, createSpace, declineInvite, findMount, getAppMountPath, getInvites, getMounts, getSessionMounts, importSettingsFromParent, listMyInvites, listPendingInvites, listSettingsApps, makeContentRef, mount, mountSpace, onInvitesChange, onMountsChange, onSessionMountsChange, openSettings, openSettingsOf, requestMount, requestSpace, resolveContentRef, resolveContentRefs, revokeInvite, unmountSpace, useInvites, useMounts, useSessionMounts, waitForMount } from './mounts.js';
@@ -26,6 +27,7 @@ export { ApiMethod, getCatalog, invoke, invokeStream, onCatalogChange, useCatalo
26
27
  export { RegionMessage, onRegionMessage, postToRegion, revealRegion, useRegionMessage } from './ipc.js';
27
28
  export { DraggableItem, DroppedItem, ItemDragError, cancelItemDrag, onItemDrop, startItemDrag, useDroppedItem } from './dnd.js';
28
29
  export { HostFetchInit, HostFetchResponse, HostFetchStreamEvent, HostFetchStreamResult, hostFetch, hostFetchStream } from './netFetch.js';
30
+ export { FeedFetchResponse, FeedParams, feedFetch } from './feed.js';
29
31
  export { SecretError, SecretGrant, SecretHints, SecretQuery, SecretType, SecretView, getSecrets, onSecretsChange, requestAddSecret, requestSecret, revokeSecret, useSecrets } from './secrets.js';
30
32
  export { ChatDelta, ChatFeatures, ChatMessage, ChatProviderInfo, ChatProviderState, ChatRequest, ChatResult, ChatRole, ChatStopReason, ContentPart, ToolDef, chat, describeChat, describeChatState, normalizeProviderInfo, onChatProviderChange, onChatProviderStateChange, useChatProvider, useChatProviderState } from './llm.js';
31
33
  export { BuildError, ConsoleEntry, ConsoleLevel, Diagnostics, DiagnosticsProvenance, getDiagnostics, onDiagnosticsChange, useDiagnostics } from './diagnostics.js';
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ export * from "./theme";
18
18
  export * from "./editorContext";
19
19
  export * from "./editor";
20
20
  export * from "./formFactor";
21
+ export * from "./chromeState";
21
22
  export * from "./hostAttention";
22
23
  export * from "./region";
23
24
  export * from "./mounts";
@@ -27,6 +28,7 @@ export * from "./catalog";
27
28
  export * from "./ipc";
28
29
  export * from "./dnd";
29
30
  export * from "./netFetch";
31
+ export * from "./feed";
30
32
  export * from "./secrets";
31
33
  export * from "./llm";
32
34
  export * from "./diagnostics";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './MDXProvider';\nexport * from './routing';\nexport * from './boot';\nexport * from './components/Include';\n// Only the component is public. `stripFrontmatter`/`appMountRelative` are module-level\n// exports so they can be unit-tested directly, NOT public API — the SDK's surface is\n// backwards-compatible forever, so an internal helper exported for a test's convenience is a\n// permanent commitment made for the wrong reason.\nexport { SafeInclude } from './components/SafeInclude';\nexport * from './sourceCache';\nexport * from './components/MDXComponents';\nexport * from './linkSpace';\nexport * from './corpus';\nexport * from './components/MountImage';\nexport * from './components/Routes';\nexport * from './hooks';\n// R3-276: the supported way for a viewer app to provide its own metadata store,\n// replacing a wholesale re-provision of `TinkerableContext` in app code.\nexport * from './metadataSource';\n// The deprecated injected-bundler adapters, re-exported so their deprecation notices\n// are visible in the published docs (R3-278; the window only narrows).\nexport { getInjectedMetadataEmitter, getInjectedMetadataSnapshot } from './injectedBundler';\nexport * from './auth';\nexport * from './theme';\nexport * from './editorContext';\nexport * from './editor';\nexport * from './formFactor';\nexport * from './hostAttention';\nexport * from './region';\nexport * from './mounts';\nexport * from './analytics';\nexport * from './contribute';\nexport * from './catalog';\nexport * from './ipc';\nexport * from './dnd';\nexport * from './netFetch';\nexport * from './secrets';\nexport * from './llm';\nexport * from './diagnostics';\nexport * from './vcs';\nexport * from './onFsChange';\nexport * from './fs';\nexport * from './debug';\nexport * from './tasks';\nexport * from './launch';\nexport * from './runtime';\nexport * from './irMarkers';\nexport * from './ready';\nexport * from './loading';\nexport * from './protocolStream';\nexport * from './protocolDeadline';\nexport * from './sandboxTypes';\nexport * from './safeContent';\n"],"mappings":";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAKd,SAAS,mBAAmB;AAC5B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAGd,SAAS,4BAA4B,mCAAmC;AACxE,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './MDXProvider';\nexport * from './routing';\nexport * from './boot';\nexport * from './components/Include';\n// Only the component is public. `stripFrontmatter`/`appMountRelative` are module-level\n// exports so they can be unit-tested directly, NOT public API — the SDK's surface is\n// backwards-compatible forever, so an internal helper exported for a test's convenience is a\n// permanent commitment made for the wrong reason.\nexport { SafeInclude } from './components/SafeInclude';\nexport * from './sourceCache';\nexport * from './components/MDXComponents';\nexport * from './linkSpace';\nexport * from './corpus';\nexport * from './components/MountImage';\nexport * from './components/Routes';\nexport * from './hooks';\n// R3-276: the supported way for a viewer app to provide its own metadata store,\n// replacing a wholesale re-provision of `TinkerableContext` in app code.\nexport * from './metadataSource';\n// The deprecated injected-bundler adapters, re-exported so their deprecation notices\n// are visible in the published docs (R3-278; the window only narrows).\nexport { getInjectedMetadataEmitter, getInjectedMetadataSnapshot } from './injectedBundler';\nexport * from './auth';\nexport * from './theme';\nexport * from './editorContext';\nexport * from './editor';\nexport * from './formFactor';\nexport * from './chromeState';\nexport * from './hostAttention';\nexport * from './region';\nexport * from './mounts';\nexport * from './analytics';\nexport * from './contribute';\nexport * from './catalog';\nexport * from './ipc';\nexport * from './dnd';\nexport * from './netFetch';\nexport * from './feed';\nexport * from './secrets';\nexport * from './llm';\nexport * from './diagnostics';\nexport * from './vcs';\nexport * from './onFsChange';\nexport * from './fs';\nexport * from './debug';\nexport * from './tasks';\nexport * from './launch';\nexport * from './runtime';\nexport * from './irMarkers';\nexport * from './ready';\nexport * from './loading';\nexport * from './protocolStream';\nexport * from './protocolDeadline';\nexport * from './sandboxTypes';\nexport * from './safeContent';\n"],"mappings":";AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAKd,SAAS,mBAAmB;AAC5B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AAGd,SAAS,4BAA4B,mCAAmC;AACxE,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
@@ -29,6 +29,7 @@ const SCHEMES = {
29
29
  [import_protocol.PROTOCOL_CONTRIBUTE]: schemeOf(import_protocol.PROTOCOL_CONTRIBUTE),
30
30
  [import_protocol.PROTOCOL_DND]: schemeOf(import_protocol.PROTOCOL_DND),
31
31
  [import_protocol.PROTOCOL_EDITOR]: schemeOf(import_protocol.PROTOCOL_EDITOR),
32
+ [import_protocol.PROTOCOL_FEED]: schemeOf(import_protocol.PROTOCOL_FEED),
32
33
  [import_protocol.PROTOCOL_FETCH]: schemeOf(import_protocol.PROTOCOL_FETCH),
33
34
  [import_protocol.PROTOCOL_IPC]: schemeOf(import_protocol.PROTOCOL_IPC),
34
35
  [import_protocol.PROTOCOL_LAUNCH]: schemeOf(import_protocol.PROTOCOL_LAUNCH),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/protocolSchemes.ts"],"sourcesContent":["// The `protocol-<scheme>` SCHEMES, derived from the wire names.\n//\n// `protocolRequest(scheme, method, params)` takes the scheme — `'theme'` — while the\n// wire name the frame dispatches on is `'protocol-theme'`; the frame adds the prefix.\n// So the typed service wrappers cannot pass the published `PROTOCOL_*` constant\n// directly, and spelling the scheme inline would put a second, unguarded copy of the\n// name back in the tree — exactly what R3-274c removes.\n//\n// Instead the schemes are *derived* from the wire names, keyed BY the wire name:\n//\n// protocolRequest(SCHEMES[PROTOCOL_THEME], 'set', [{ theme }])\n//\n// Keying by the constant is what makes the derivation unfalsifiable — there is no\n// second place to name the family, so there is no pair to get wrong. `schemeOf`\n// returns a template-literal conditional, so each value has a literal type (`'theme'`),\n// which buys two more things:\n//\n// - a wire name that stops matching `protocol-*` stops compiling here, rather than\n// silently producing an empty scheme at runtime;\n// - `check-protocol-snapshot.mjs` resolves `SCHEMES[PROTOCOL_THEME]` through the type\n// checker exactly like a plain literal, so the call sites stay visible to the gate.\n//\n// One export, deliberately: `./*` is a public subpath, so every name added here is\n// public API forever (ways_of_working §6, additive-only).\n//\n// This module is NOT generated — the derivation is the content — so it lives outside\n// `src/generated/`.\nimport {\n PROTOCOL_ANALYTICS,\n PROTOCOL_CONTRIBUTE,\n PROTOCOL_DND,\n PROTOCOL_EDITOR,\n PROTOCOL_FETCH,\n PROTOCOL_IPC,\n PROTOCOL_LAUNCH,\n PROTOCOL_LLM,\n PROTOCOL_SECRETS,\n PROTOCOL_SETTINGS,\n PROTOCOL_SPACES,\n PROTOCOL_TASK,\n PROTOCOL_THEME,\n PROTOCOL_VCS,\n} from './generated/protocol';\n\nconst PREFIX = 'protocol-';\n\n/** The scheme half of a `protocol-<scheme>` wire name. */\ntype SchemeOf<N extends string> = N extends `${typeof PREFIX}${infer S}` ? S : never;\n\n/**\n * `'protocol-theme'` → `'theme'`, as a literal type.\n *\n * The cast is the only place the derivation is asserted rather than computed; the\n * `N extends \\`protocol-${string}\\`` bound is what makes it sound — a wire name that is\n * not scheme-shaped is a compile error at the call, not a `never` at runtime.\n */\nconst schemeOf = <N extends `${typeof PREFIX}${string}`>(name: N): SchemeOf<N> =>\n name.slice(PREFIX.length) as SchemeOf<N>;\n\n/** Every `protocol-*` scheme the SDK speaks, keyed by its wire name. */\nexport const SCHEMES = {\n [PROTOCOL_ANALYTICS]: schemeOf(PROTOCOL_ANALYTICS),\n [PROTOCOL_CONTRIBUTE]: schemeOf(PROTOCOL_CONTRIBUTE),\n [PROTOCOL_DND]: schemeOf(PROTOCOL_DND),\n [PROTOCOL_EDITOR]: schemeOf(PROTOCOL_EDITOR),\n [PROTOCOL_FETCH]: schemeOf(PROTOCOL_FETCH),\n [PROTOCOL_IPC]: schemeOf(PROTOCOL_IPC),\n [PROTOCOL_LAUNCH]: schemeOf(PROTOCOL_LAUNCH),\n [PROTOCOL_LLM]: schemeOf(PROTOCOL_LLM),\n [PROTOCOL_SECRETS]: schemeOf(PROTOCOL_SECRETS),\n [PROTOCOL_SETTINGS]: schemeOf(PROTOCOL_SETTINGS),\n [PROTOCOL_SPACES]: schemeOf(PROTOCOL_SPACES),\n [PROTOCOL_TASK]: schemeOf(PROTOCOL_TASK),\n [PROTOCOL_THEME]: schemeOf(PROTOCOL_THEME),\n [PROTOCOL_VCS]: schemeOf(PROTOCOL_VCS),\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA,sBAeO;AAEP,MAAM,SAAS;AAYf,MAAM,WAAW,CAAwC,SACvD,KAAK,MAAM,OAAO,MAAM;AAGnB,MAAM,UAAU;AAAA,EACrB,CAAC,kCAAkB,GAAG,SAAS,kCAAkB;AAAA,EACjD,CAAC,mCAAmB,GAAG,SAAS,mCAAmB;AAAA,EACnD,CAAC,4BAAY,GAAG,SAAS,4BAAY;AAAA,EACrC,CAAC,+BAAe,GAAG,SAAS,+BAAe;AAAA,EAC3C,CAAC,8BAAc,GAAG,SAAS,8BAAc;AAAA,EACzC,CAAC,4BAAY,GAAG,SAAS,4BAAY;AAAA,EACrC,CAAC,+BAAe,GAAG,SAAS,+BAAe;AAAA,EAC3C,CAAC,4BAAY,GAAG,SAAS,4BAAY;AAAA,EACrC,CAAC,gCAAgB,GAAG,SAAS,gCAAgB;AAAA,EAC7C,CAAC,iCAAiB,GAAG,SAAS,iCAAiB;AAAA,EAC/C,CAAC,+BAAe,GAAG,SAAS,+BAAe;AAAA,EAC3C,CAAC,6BAAa,GAAG,SAAS,6BAAa;AAAA,EACvC,CAAC,8BAAc,GAAG,SAAS,8BAAc;AAAA,EACzC,CAAC,4BAAY,GAAG,SAAS,4BAAY;AACvC;","names":[]}
1
+ {"version":3,"sources":["../src/protocolSchemes.ts"],"sourcesContent":["// The `protocol-<scheme>` SCHEMES, derived from the wire names.\n//\n// `protocolRequest(scheme, method, params)` takes the scheme — `'theme'` — while the\n// wire name the frame dispatches on is `'protocol-theme'`; the frame adds the prefix.\n// So the typed service wrappers cannot pass the published `PROTOCOL_*` constant\n// directly, and spelling the scheme inline would put a second, unguarded copy of the\n// name back in the tree — exactly what R3-274c removes.\n//\n// Instead the schemes are *derived* from the wire names, keyed BY the wire name:\n//\n// protocolRequest(SCHEMES[PROTOCOL_THEME], 'set', [{ theme }])\n//\n// Keying by the constant is what makes the derivation unfalsifiable — there is no\n// second place to name the family, so there is no pair to get wrong. `schemeOf`\n// returns a template-literal conditional, so each value has a literal type (`'theme'`),\n// which buys two more things:\n//\n// - a wire name that stops matching `protocol-*` stops compiling here, rather than\n// silently producing an empty scheme at runtime;\n// - `check-protocol-snapshot.mjs` resolves `SCHEMES[PROTOCOL_THEME]` through the type\n// checker exactly like a plain literal, so the call sites stay visible to the gate.\n//\n// One export, deliberately: `./*` is a public subpath, so every name added here is\n// public API forever (ways_of_working §6, additive-only).\n//\n// This module is NOT generated — the derivation is the content — so it lives outside\n// `src/generated/`.\nimport {\n PROTOCOL_ANALYTICS,\n PROTOCOL_CONTRIBUTE,\n PROTOCOL_DND,\n PROTOCOL_EDITOR,\n PROTOCOL_FEED,\n PROTOCOL_FETCH,\n PROTOCOL_IPC,\n PROTOCOL_LAUNCH,\n PROTOCOL_LLM,\n PROTOCOL_SECRETS,\n PROTOCOL_SETTINGS,\n PROTOCOL_SPACES,\n PROTOCOL_TASK,\n PROTOCOL_THEME,\n PROTOCOL_VCS,\n} from './generated/protocol';\n\nconst PREFIX = 'protocol-';\n\n/** The scheme half of a `protocol-<scheme>` wire name. */\ntype SchemeOf<N extends string> = N extends `${typeof PREFIX}${infer S}` ? S : never;\n\n/**\n * `'protocol-theme'` → `'theme'`, as a literal type.\n *\n * The cast is the only place the derivation is asserted rather than computed; the\n * `N extends \\`protocol-${string}\\`` bound is what makes it sound — a wire name that is\n * not scheme-shaped is a compile error at the call, not a `never` at runtime.\n */\nconst schemeOf = <N extends `${typeof PREFIX}${string}`>(name: N): SchemeOf<N> =>\n name.slice(PREFIX.length) as SchemeOf<N>;\n\n/** Every `protocol-*` scheme the SDK speaks, keyed by its wire name. */\nexport const SCHEMES = {\n [PROTOCOL_ANALYTICS]: schemeOf(PROTOCOL_ANALYTICS),\n [PROTOCOL_CONTRIBUTE]: schemeOf(PROTOCOL_CONTRIBUTE),\n [PROTOCOL_DND]: schemeOf(PROTOCOL_DND),\n [PROTOCOL_EDITOR]: schemeOf(PROTOCOL_EDITOR),\n [PROTOCOL_FEED]: schemeOf(PROTOCOL_FEED),\n [PROTOCOL_FETCH]: schemeOf(PROTOCOL_FETCH),\n [PROTOCOL_IPC]: schemeOf(PROTOCOL_IPC),\n [PROTOCOL_LAUNCH]: schemeOf(PROTOCOL_LAUNCH),\n [PROTOCOL_LLM]: schemeOf(PROTOCOL_LLM),\n [PROTOCOL_SECRETS]: schemeOf(PROTOCOL_SECRETS),\n [PROTOCOL_SETTINGS]: schemeOf(PROTOCOL_SETTINGS),\n [PROTOCOL_SPACES]: schemeOf(PROTOCOL_SPACES),\n [PROTOCOL_TASK]: schemeOf(PROTOCOL_TASK),\n [PROTOCOL_THEME]: schemeOf(PROTOCOL_THEME),\n [PROTOCOL_VCS]: schemeOf(PROTOCOL_VCS),\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BA,sBAgBO;AAEP,MAAM,SAAS;AAYf,MAAM,WAAW,CAAwC,SACvD,KAAK,MAAM,OAAO,MAAM;AAGnB,MAAM,UAAU;AAAA,EACrB,CAAC,kCAAkB,GAAG,SAAS,kCAAkB;AAAA,EACjD,CAAC,mCAAmB,GAAG,SAAS,mCAAmB;AAAA,EACnD,CAAC,4BAAY,GAAG,SAAS,4BAAY;AAAA,EACrC,CAAC,+BAAe,GAAG,SAAS,+BAAe;AAAA,EAC3C,CAAC,6BAAa,GAAG,SAAS,6BAAa;AAAA,EACvC,CAAC,8BAAc,GAAG,SAAS,8BAAc;AAAA,EACzC,CAAC,4BAAY,GAAG,SAAS,4BAAY;AAAA,EACrC,CAAC,+BAAe,GAAG,SAAS,+BAAe;AAAA,EAC3C,CAAC,4BAAY,GAAG,SAAS,4BAAY;AAAA,EACrC,CAAC,gCAAgB,GAAG,SAAS,gCAAgB;AAAA,EAC7C,CAAC,iCAAiB,GAAG,SAAS,iCAAiB;AAAA,EAC/C,CAAC,+BAAe,GAAG,SAAS,+BAAe;AAAA,EAC3C,CAAC,6BAAa,GAAG,SAAS,6BAAa;AAAA,EACvC,CAAC,8BAAc,GAAG,SAAS,8BAAc;AAAA,EACzC,CAAC,4BAAY,GAAG,SAAS,4BAAY;AACvC;","names":[]}
@@ -4,6 +4,7 @@ declare const SCHEMES: {
4
4
  readonly "protocol-contribute": "contribute";
5
5
  readonly "protocol-dnd": "dnd";
6
6
  readonly "protocol-editor": "editor";
7
+ readonly "protocol-feed": "feed";
7
8
  readonly "protocol-fetch": "fetch";
8
9
  readonly "protocol-ipc": "ipc";
9
10
  readonly "protocol-launch": "launch";
@@ -4,6 +4,7 @@ declare const SCHEMES: {
4
4
  readonly "protocol-contribute": "contribute";
5
5
  readonly "protocol-dnd": "dnd";
6
6
  readonly "protocol-editor": "editor";
7
+ readonly "protocol-feed": "feed";
7
8
  readonly "protocol-fetch": "fetch";
8
9
  readonly "protocol-ipc": "ipc";
9
10
  readonly "protocol-launch": "launch";
@@ -4,6 +4,7 @@ import {
4
4
  PROTOCOL_CONTRIBUTE,
5
5
  PROTOCOL_DND,
6
6
  PROTOCOL_EDITOR,
7
+ PROTOCOL_FEED,
7
8
  PROTOCOL_FETCH,
8
9
  PROTOCOL_IPC,
9
10
  PROTOCOL_LAUNCH,
@@ -22,6 +23,7 @@ const SCHEMES = {
22
23
  [PROTOCOL_CONTRIBUTE]: schemeOf(PROTOCOL_CONTRIBUTE),
23
24
  [PROTOCOL_DND]: schemeOf(PROTOCOL_DND),
24
25
  [PROTOCOL_EDITOR]: schemeOf(PROTOCOL_EDITOR),
26
+ [PROTOCOL_FEED]: schemeOf(PROTOCOL_FEED),
25
27
  [PROTOCOL_FETCH]: schemeOf(PROTOCOL_FETCH),
26
28
  [PROTOCOL_IPC]: schemeOf(PROTOCOL_IPC),
27
29
  [PROTOCOL_LAUNCH]: schemeOf(PROTOCOL_LAUNCH),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/protocolSchemes.ts"],"sourcesContent":["// The `protocol-<scheme>` SCHEMES, derived from the wire names.\n//\n// `protocolRequest(scheme, method, params)` takes the scheme — `'theme'` — while the\n// wire name the frame dispatches on is `'protocol-theme'`; the frame adds the prefix.\n// So the typed service wrappers cannot pass the published `PROTOCOL_*` constant\n// directly, and spelling the scheme inline would put a second, unguarded copy of the\n// name back in the tree — exactly what R3-274c removes.\n//\n// Instead the schemes are *derived* from the wire names, keyed BY the wire name:\n//\n// protocolRequest(SCHEMES[PROTOCOL_THEME], 'set', [{ theme }])\n//\n// Keying by the constant is what makes the derivation unfalsifiable — there is no\n// second place to name the family, so there is no pair to get wrong. `schemeOf`\n// returns a template-literal conditional, so each value has a literal type (`'theme'`),\n// which buys two more things:\n//\n// - a wire name that stops matching `protocol-*` stops compiling here, rather than\n// silently producing an empty scheme at runtime;\n// - `check-protocol-snapshot.mjs` resolves `SCHEMES[PROTOCOL_THEME]` through the type\n// checker exactly like a plain literal, so the call sites stay visible to the gate.\n//\n// One export, deliberately: `./*` is a public subpath, so every name added here is\n// public API forever (ways_of_working §6, additive-only).\n//\n// This module is NOT generated — the derivation is the content — so it lives outside\n// `src/generated/`.\nimport {\n PROTOCOL_ANALYTICS,\n PROTOCOL_CONTRIBUTE,\n PROTOCOL_DND,\n PROTOCOL_EDITOR,\n PROTOCOL_FETCH,\n PROTOCOL_IPC,\n PROTOCOL_LAUNCH,\n PROTOCOL_LLM,\n PROTOCOL_SECRETS,\n PROTOCOL_SETTINGS,\n PROTOCOL_SPACES,\n PROTOCOL_TASK,\n PROTOCOL_THEME,\n PROTOCOL_VCS,\n} from './generated/protocol';\n\nconst PREFIX = 'protocol-';\n\n/** The scheme half of a `protocol-<scheme>` wire name. */\ntype SchemeOf<N extends string> = N extends `${typeof PREFIX}${infer S}` ? S : never;\n\n/**\n * `'protocol-theme'` → `'theme'`, as a literal type.\n *\n * The cast is the only place the derivation is asserted rather than computed; the\n * `N extends \\`protocol-${string}\\`` bound is what makes it sound — a wire name that is\n * not scheme-shaped is a compile error at the call, not a `never` at runtime.\n */\nconst schemeOf = <N extends `${typeof PREFIX}${string}`>(name: N): SchemeOf<N> =>\n name.slice(PREFIX.length) as SchemeOf<N>;\n\n/** Every `protocol-*` scheme the SDK speaks, keyed by its wire name. */\nexport const SCHEMES = {\n [PROTOCOL_ANALYTICS]: schemeOf(PROTOCOL_ANALYTICS),\n [PROTOCOL_CONTRIBUTE]: schemeOf(PROTOCOL_CONTRIBUTE),\n [PROTOCOL_DND]: schemeOf(PROTOCOL_DND),\n [PROTOCOL_EDITOR]: schemeOf(PROTOCOL_EDITOR),\n [PROTOCOL_FETCH]: schemeOf(PROTOCOL_FETCH),\n [PROTOCOL_IPC]: schemeOf(PROTOCOL_IPC),\n [PROTOCOL_LAUNCH]: schemeOf(PROTOCOL_LAUNCH),\n [PROTOCOL_LLM]: schemeOf(PROTOCOL_LLM),\n [PROTOCOL_SECRETS]: schemeOf(PROTOCOL_SECRETS),\n [PROTOCOL_SETTINGS]: schemeOf(PROTOCOL_SETTINGS),\n [PROTOCOL_SPACES]: schemeOf(PROTOCOL_SPACES),\n [PROTOCOL_TASK]: schemeOf(PROTOCOL_TASK),\n [PROTOCOL_THEME]: schemeOf(PROTOCOL_THEME),\n [PROTOCOL_VCS]: schemeOf(PROTOCOL_VCS),\n} as const;\n"],"mappings":";AA2BA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,SAAS;AAYf,MAAM,WAAW,CAAwC,SACvD,KAAK,MAAM,OAAO,MAAM;AAGnB,MAAM,UAAU;AAAA,EACrB,CAAC,kBAAkB,GAAG,SAAS,kBAAkB;AAAA,EACjD,CAAC,mBAAmB,GAAG,SAAS,mBAAmB;AAAA,EACnD,CAAC,YAAY,GAAG,SAAS,YAAY;AAAA,EACrC,CAAC,eAAe,GAAG,SAAS,eAAe;AAAA,EAC3C,CAAC,cAAc,GAAG,SAAS,cAAc;AAAA,EACzC,CAAC,YAAY,GAAG,SAAS,YAAY;AAAA,EACrC,CAAC,eAAe,GAAG,SAAS,eAAe;AAAA,EAC3C,CAAC,YAAY,GAAG,SAAS,YAAY;AAAA,EACrC,CAAC,gBAAgB,GAAG,SAAS,gBAAgB;AAAA,EAC7C,CAAC,iBAAiB,GAAG,SAAS,iBAAiB;AAAA,EAC/C,CAAC,eAAe,GAAG,SAAS,eAAe;AAAA,EAC3C,CAAC,aAAa,GAAG,SAAS,aAAa;AAAA,EACvC,CAAC,cAAc,GAAG,SAAS,cAAc;AAAA,EACzC,CAAC,YAAY,GAAG,SAAS,YAAY;AACvC;","names":[]}
1
+ {"version":3,"sources":["../src/protocolSchemes.ts"],"sourcesContent":["// The `protocol-<scheme>` SCHEMES, derived from the wire names.\n//\n// `protocolRequest(scheme, method, params)` takes the scheme — `'theme'` — while the\n// wire name the frame dispatches on is `'protocol-theme'`; the frame adds the prefix.\n// So the typed service wrappers cannot pass the published `PROTOCOL_*` constant\n// directly, and spelling the scheme inline would put a second, unguarded copy of the\n// name back in the tree — exactly what R3-274c removes.\n//\n// Instead the schemes are *derived* from the wire names, keyed BY the wire name:\n//\n// protocolRequest(SCHEMES[PROTOCOL_THEME], 'set', [{ theme }])\n//\n// Keying by the constant is what makes the derivation unfalsifiable — there is no\n// second place to name the family, so there is no pair to get wrong. `schemeOf`\n// returns a template-literal conditional, so each value has a literal type (`'theme'`),\n// which buys two more things:\n//\n// - a wire name that stops matching `protocol-*` stops compiling here, rather than\n// silently producing an empty scheme at runtime;\n// - `check-protocol-snapshot.mjs` resolves `SCHEMES[PROTOCOL_THEME]` through the type\n// checker exactly like a plain literal, so the call sites stay visible to the gate.\n//\n// One export, deliberately: `./*` is a public subpath, so every name added here is\n// public API forever (ways_of_working §6, additive-only).\n//\n// This module is NOT generated — the derivation is the content — so it lives outside\n// `src/generated/`.\nimport {\n PROTOCOL_ANALYTICS,\n PROTOCOL_CONTRIBUTE,\n PROTOCOL_DND,\n PROTOCOL_EDITOR,\n PROTOCOL_FEED,\n PROTOCOL_FETCH,\n PROTOCOL_IPC,\n PROTOCOL_LAUNCH,\n PROTOCOL_LLM,\n PROTOCOL_SECRETS,\n PROTOCOL_SETTINGS,\n PROTOCOL_SPACES,\n PROTOCOL_TASK,\n PROTOCOL_THEME,\n PROTOCOL_VCS,\n} from './generated/protocol';\n\nconst PREFIX = 'protocol-';\n\n/** The scheme half of a `protocol-<scheme>` wire name. */\ntype SchemeOf<N extends string> = N extends `${typeof PREFIX}${infer S}` ? S : never;\n\n/**\n * `'protocol-theme'` → `'theme'`, as a literal type.\n *\n * The cast is the only place the derivation is asserted rather than computed; the\n * `N extends \\`protocol-${string}\\`` bound is what makes it sound — a wire name that is\n * not scheme-shaped is a compile error at the call, not a `never` at runtime.\n */\nconst schemeOf = <N extends `${typeof PREFIX}${string}`>(name: N): SchemeOf<N> =>\n name.slice(PREFIX.length) as SchemeOf<N>;\n\n/** Every `protocol-*` scheme the SDK speaks, keyed by its wire name. */\nexport const SCHEMES = {\n [PROTOCOL_ANALYTICS]: schemeOf(PROTOCOL_ANALYTICS),\n [PROTOCOL_CONTRIBUTE]: schemeOf(PROTOCOL_CONTRIBUTE),\n [PROTOCOL_DND]: schemeOf(PROTOCOL_DND),\n [PROTOCOL_EDITOR]: schemeOf(PROTOCOL_EDITOR),\n [PROTOCOL_FEED]: schemeOf(PROTOCOL_FEED),\n [PROTOCOL_FETCH]: schemeOf(PROTOCOL_FETCH),\n [PROTOCOL_IPC]: schemeOf(PROTOCOL_IPC),\n [PROTOCOL_LAUNCH]: schemeOf(PROTOCOL_LAUNCH),\n [PROTOCOL_LLM]: schemeOf(PROTOCOL_LLM),\n [PROTOCOL_SECRETS]: schemeOf(PROTOCOL_SECRETS),\n [PROTOCOL_SETTINGS]: schemeOf(PROTOCOL_SETTINGS),\n [PROTOCOL_SPACES]: schemeOf(PROTOCOL_SPACES),\n [PROTOCOL_TASK]: schemeOf(PROTOCOL_TASK),\n [PROTOCOL_THEME]: schemeOf(PROTOCOL_THEME),\n [PROTOCOL_VCS]: schemeOf(PROTOCOL_VCS),\n} as const;\n"],"mappings":";AA2BA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,SAAS;AAYf,MAAM,WAAW,CAAwC,SACvD,KAAK,MAAM,OAAO,MAAM;AAGnB,MAAM,UAAU;AAAA,EACrB,CAAC,kBAAkB,GAAG,SAAS,kBAAkB;AAAA,EACjD,CAAC,mBAAmB,GAAG,SAAS,mBAAmB;AAAA,EACnD,CAAC,YAAY,GAAG,SAAS,YAAY;AAAA,EACrC,CAAC,eAAe,GAAG,SAAS,eAAe;AAAA,EAC3C,CAAC,aAAa,GAAG,SAAS,aAAa;AAAA,EACvC,CAAC,cAAc,GAAG,SAAS,cAAc;AAAA,EACzC,CAAC,YAAY,GAAG,SAAS,YAAY;AAAA,EACrC,CAAC,eAAe,GAAG,SAAS,eAAe;AAAA,EAC3C,CAAC,YAAY,GAAG,SAAS,YAAY;AAAA,EACrC,CAAC,gBAAgB,GAAG,SAAS,gBAAgB;AAAA,EAC7C,CAAC,iBAAiB,GAAG,SAAS,iBAAiB;AAAA,EAC/C,CAAC,eAAe,GAAG,SAAS,eAAe;AAAA,EAC3C,CAAC,aAAa,GAAG,SAAS,aAAa;AAAA,EACvC,CAAC,cAAc,GAAG,SAAS,cAAc;AAAA,EACzC,CAAC,YAAY,GAAG,SAAS,YAAY;AACvC;","names":[]}
package/dist/version.cjs CHANGED
@@ -21,7 +21,7 @@ __export(version_exports, {
21
21
  SDK_VERSION: () => SDK_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(version_exports);
24
- const SDK_VERSION = "0.52.0";
24
+ const SDK_VERSION = "0.54.0";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  SDK_VERSION
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts"],"sourcesContent":["// GENERATED by scripts/gen-version.mjs from package.json — do not edit by hand.\n// Regenerated on every build (prebuild); kept honest by version.test.ts.\n\n/** This SDK's package version, baked from package.json at build (SP2-6). */\nexport const SDK_VERSION = '0.52.0';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,MAAM,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/version.ts"],"sourcesContent":["// GENERATED by scripts/gen-version.mjs from package.json — do not edit by hand.\n// Regenerated on every build (prebuild); kept honest by version.test.ts.\n\n/** This SDK's package version, baked from package.json at build (SP2-6). */\nexport const SDK_VERSION = '0.54.0';\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAIO,MAAM,cAAc;","names":[]}
@@ -1,4 +1,4 @@
1
1
  /** This SDK's package version, baked from package.json at build (SP2-6). */
2
- declare const SDK_VERSION = "0.52.0";
2
+ declare const SDK_VERSION = "0.54.0";
3
3
 
4
4
  export { SDK_VERSION };
package/dist/version.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  /** This SDK's package version, baked from package.json at build (SP2-6). */
2
- declare const SDK_VERSION = "0.52.0";
2
+ declare const SDK_VERSION = "0.54.0";
3
3
 
4
4
  export { SDK_VERSION };
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./chunk-VHAA22YE.js";
2
- const SDK_VERSION = "0.52.0";
2
+ const SDK_VERSION = "0.54.0";
3
3
  export {
4
4
  SDK_VERSION
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts"],"sourcesContent":["// GENERATED by scripts/gen-version.mjs from package.json — do not edit by hand.\n// Regenerated on every build (prebuild); kept honest by version.test.ts.\n\n/** This SDK's package version, baked from package.json at build (SP2-6). */\nexport const SDK_VERSION = '0.52.0';\n"],"mappings":";AAIO,MAAM,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/version.ts"],"sourcesContent":["// GENERATED by scripts/gen-version.mjs from package.json — do not edit by hand.\n// Regenerated on every build (prebuild); kept honest by version.test.ts.\n\n/** This SDK's package version, baked from package.json at build (SP2-6). */\nexport const SDK_VERSION = '0.54.0';\n"],"mappings":";AAIO,MAAM,cAAc;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@immediately-run/sdk",
3
- "version": "0.52.0",
3
+ "version": "0.54.0",
4
4
  "description": "Runtime SDK for code executing inside an immediately.run sandbox.",
5
5
  "license": "MIT",
6
6
  "repository": "github:immediately-run/immediately-run-sdk",
@@ -33,12 +33,15 @@
33
33
  "format:check": "prettier --check \"src/**/*.{ts,tsx,js,mjs,json}\" \"test/**/*.{ts,mjs}\" \"scripts/**/*.mjs\"",
34
34
  "check:circular": "node scripts/check-circular.mjs",
35
35
  "api:check": "node scripts/check-api-stability.mjs",
36
+ "api:selftest": "node scripts/check-api-stability.mjs --self-test",
36
37
  "protocol:check": "node scripts/check-protocol-snapshot.mjs",
37
38
  "verify:codegen-parity": "node scripts/codegen-prototype/verify-drift.mjs --self-test && node scripts/codegen-prototype/verify-drift.mjs && node scripts/codegen-prototype/verify.streams.mjs --self-test && node scripts/codegen-prototype/verify.streams.mjs",
38
39
  "api:update": "node scripts/check-api-stability.mjs --update",
39
- "verify": "npm run format:check && npm run check:circular && npm run check:bundler:selftest && npm run check:bundler && npm run build && npm test && npm run test:safe-content && npm run test:metadata-e2e && npm run api:check && npm run compat:selftest && npm run compat:previous && npm run protocol:check && npm run protocol:selftest && npm run check:ambient:selftest && npm run check:ambient && npm run check:selfhost:selftest && npm run check:selfhost && npm run verify:codegen-parity",
40
+ "check:pins": "node scripts/check-dependency-pins.mjs --self-test && node scripts/check-dependency-pins.mjs",
41
+ "check:publish-version": "node scripts/check-publish-version.mjs --self-test && node scripts/check-publish-version.mjs",
42
+ "verify": "npm run check:pins && npm run check:publish-version && npm run format:check && npm run check:circular && npm run check:bundler:selftest && npm run check:bundler && npm run build && npm test && npm run test:safe-content && npm run test:metadata-e2e && npm run api:selftest && npm run api:check && npm run compat:selftest && npm run compat:previous && npm run protocol:check && npm run protocol:selftest && npm run check:ambient:selftest && npm run check:ambient && npm run check:selfhost:selftest && npm run check:selfhost && npm run verify:codegen-parity",
40
43
  "docs": "typedoc --json docs/api.json && node scripts/gen-llms.mjs",
41
- "prepublishOnly": "npm run check:circular && npm run build && npm run api:check",
44
+ "prepublishOnly": "npm run check:circular && npm run build && npm run api:selftest && npm run api:check",
42
45
  "test:safe-content": "node scripts/build-safecontent-e2e.mjs && node --test test/safeContent.e2e.mjs",
43
46
  "test:metadata-e2e": "node --test test/metadataHooks.e2e.mjs",
44
47
  "protocol:selftest": "node scripts/check-protocol-snapshot.mjs --self-test",
@@ -58,7 +61,7 @@
58
61
  },
59
62
  "dependencies": {
60
63
  "@immediately-run/platform-constants": "0.2.0",
61
- "@immediately-run/sandbox-protocol": "0.5.0",
64
+ "@immediately-run/sandbox-protocol": "0.7.1",
62
65
  "react-error-boundary": "^6.0.0",
63
66
  "@immediately-run/safe-content": "0.1.0",
64
67
  "@immediately-run/mdx-plugins": "0.5.0"