@ikenga/contract 0.14.1 → 0.16.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.
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAE5D,gFAAgF;;YA/BhF,4DAA4D;;YAE5D,0DAA0D;;;;;;;;;QA+B1D;;;;;;WAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaH,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,eAAO,MAAM,mBAAmB;IAC9B,qBAAqB;;IAErB,qBAAqB;;IAErB;;;;;OAKG;;IAEH,4EAA4E;;IAE5E,2EAA2E;;IAE3E;;;;OAIG;;IAEH;;;;;;;OAOG;;;;;;;;;;;;;;;;;;EAEH,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,mBAAmB;;IAE9B,wDAAwD;;;QAnCxD,qBAAqB;;QAErB,qBAAqB;;QAErB;;;;;WAKG;;QAEH,4EAA4E;;QAE5E,2EAA2E;;QAE3E;;;;WAIG;;QAEH;;;;;;;WAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUH,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIhE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAE5D,gFAAgF;;YA/BhF,4DAA4D;;YAE5D,0DAA0D;;;;;;;;;QA+B1D;;;;;;WAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaH,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD,eAAO,MAAM,mBAAmB;IAC9B,qBAAqB;;IAErB,qBAAqB;;IAErB;;;;;OAKG;;IAEH,4EAA4E;;IAE5E,2EAA2E;;IAE3E;;;;OAIG;;IAEH;;;;;;;OAOG;;;;;;;;;;;;;;;;;;EAEH,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,mBAAmB;;IAE9B,wDAAwD;;;QAnCxD,qBAAqB;;QAErB,qBAAqB;;QAErB;;;;;WAKG;;QAEH,4EAA4E;;QAE5E,2EAA2E;;QAE3E;;;;WAIG;;QAEH;;;;;;;WAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUH,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIhE;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD"}
package/dist/registry.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // Ikenga registry schema — the static JSON catalog served by
2
- // `Royalti-io/ikenga-registry` over GitHub Pages.
2
+ // `ikenga-hq/ikenga-registry` over GitHub Pages.
3
3
  //
4
4
  // Shape: a small root `index.json` lists every pkg with its latest version
5
5
  // and a pointer to a per-pkg detail file (`pkgs/<short-name>.json`).
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/dist/window.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // Multi-window contract — mirrors the Rust source-of-truth in
2
- // `royalti-io/ikenga` at `src-tauri/src/window/{descriptor,events}.rs`.
2
+ // `ikenga-hq/ikenga` at `src-tauri/src/window/{descriptor,events}.rs`.
3
3
  //
4
4
  // This is the `G-WINDOW-MODEL` freeze-gate output (plans/multi-window WP-02).
5
5
  // It has TWO co-equal halves: the `WindowDescriptor` (what a window IS) and the
@@ -1 +1 @@
1
- {"version":3,"file":"window.js","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,wEAAwE;AACxE,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,yEAAyE;AAEzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,yEAAyE;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAU,CAAC;AAElD,yCAAyC;AAEzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACtC,SAAS;IACT,gBAAgB;IAChB,UAAU;IACV,WAAW;CACX,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACrC,MAAM,CAAC;IACP,yEAAyE;IACzE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,gBAAgB;IACtB,sDAAsD;IACtD,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,0EAA0E;IAC1E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C;;;OAGG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B,CAAC;KACD,MAAM,EAAE,CAAC;AAGX,oDAAoD;AAEpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IACnE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IACnD,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1E,CAAC,CAAC;AAGH;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACxC,MAAM,CAAC;IACP,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACrC,4CAA4C;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,0DAA0D;IAC1D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC;KACD,MAAM,EAAE,CAAC;AAGX,oEAAoE;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,iBAAiB;IACzB,YAAY,EAAE,wBAAwB;CAC7B,CAAC;AAGX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC,sBAAsB;IACtB,uBAAuB;IACvB,yBAAyB;CAChB,CAAC"}
1
+ {"version":3,"file":"window.js","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,uEAAuE;AACvE,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,yEAAyE;AAEzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,yEAAyE;AACzE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAU,CAAC;AAElD,yCAAyC;AAEzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC;IACtC,SAAS;IACT,gBAAgB;IAChB,UAAU;IACV,WAAW;CACX,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACrC,MAAM,CAAC;IACP,yEAAyE;IACzE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,EAAE,gBAAgB;IACtB,sDAAsD;IACtD,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,0EAA0E;IAC1E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C;;;OAGG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B,CAAC;KACD,MAAM,EAAE,CAAC;AAGX,oDAAoD;AAEpD;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IACnE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IACnD,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1E,CAAC,CAAC;AAGH;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACxC,MAAM,CAAC;IACP,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACrC,4CAA4C;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,0DAA0D;IAC1D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,MAAM,EAAE,uBAAuB;IAC/B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC;KACD,MAAM,EAAE,CAAC;AAGX,oEAAoE;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,MAAM,EAAE,iBAAiB;IACzB,MAAM,EAAE,iBAAiB;IACzB,YAAY,EAAE,wBAAwB;CAC7B,CAAC;AAGX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC,sBAAsB;IACtB,uBAAuB;IACvB,yBAAyB;CAChB,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@ikenga/contract",
3
- "version": "0.14.1",
3
+ "version": "0.16.0",
4
4
  "description": "Shared contract for the Ikenga pkg system: manifest schema, RPC types, Engine interface, capability scopes.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "git+https://github.com/Royalti-io/ikenga-contract.git"
8
+ "url": "git+https://github.com/ikenga-hq/ikenga-contract.git"
9
9
  },
10
10
  "type": "module",
11
11
  "main": "./dist/index.js",
@@ -67,6 +67,10 @@
67
67
  "./host-context": {
68
68
  "types": "./dist/host-context.d.ts",
69
69
  "import": "./dist/host-context.js"
70
+ },
71
+ "./app-bridge": {
72
+ "types": "./dist/app-bridge.d.ts",
73
+ "import": "./dist/app-bridge.js"
70
74
  }
71
75
  },
72
76
  "files": [
@@ -2,7 +2,7 @@
2
2
  // Atelier skill *action*'s YAML frontmatter (the block between the leading
3
3
  // `---` fences of an `actions/*.md` file).
4
4
  //
5
- // The Rust loader in `royalti-io/ikenga` at
5
+ // The Rust loader in `ikenga-hq/ikenga` at
6
6
  // `src-tauri/src/pkg/skill_actions.rs` mirrors this schema. Field changes MUST
7
7
  // be made in lockstep with that Rust struct — same convention as
8
8
  // manifest.ts ↔ manifest.rs.
@@ -0,0 +1,158 @@
1
+ // `repo.changed` — the push a pkg's long-lived MCP server emits so its iframe
2
+ // learns that a git repo moved on disk, without polling.
3
+ //
4
+ // ─── Why this file is about an MCP notification, not a sidecar event ───────
5
+ //
6
+ // An earlier draft of this module described a `host-sidecar-event` push fed by
7
+ // `manifest.sidecars[]`. That path does not exist. Verified in shell source:
8
+ //
9
+ // • `manifest.sidecars[]` entries are NOT supervised — `src-tauri/src/pkg/
10
+ // registries/sidecars.rs` only resolves their binary paths.
11
+ // • `host.pkgSidecarCall` → `pkg_sidecar_call` spawns a FRESH process per
12
+ // call; it is one-shot request/response, with no stdout event stream.
13
+ // • The `pkg://sidecar/{pkgId}/{name}/message` Tauri event is emitted only
14
+ // by the lazy-spawn `pkg_sidecar_rpc_send` path, which no `host.*` verb
15
+ // reaches — so nothing an iframe can call ever produces one.
16
+ // • The only supervised long-lived child is a `manifest.mcp[]` entry with
17
+ // `lifecycle: "long-lived"` (`src-tauri/src/pkg/lifecycle.rs`).
18
+ //
19
+ // So the real push channel is the MCP notification relay that already ships:
20
+ //
21
+ // pkg MCP server shell (Rust) pkg iframe
22
+ // ────────────── ──────────── ──────────
23
+ // server.sendLoggingMessage( read loop matches AppBridge
24
+ // { level, logger, → `notifications/message` → notification
25
+ // data: <envelope> }) (lifecycle.rs:160), rate- handler for
26
+ // caps, emits the Tauri LoggingMessage-
27
+ // event `pkg-mcp-notification` Notification
28
+ // `{pkg_id, method, params}`
29
+ // (lifecycle.rs:154, ~1440-1460)
30
+ // ↓
31
+ // `shell/src/components/pkg/pkg-iframe-host.tsx`
32
+ // Step 3b filters on `pkg_id` and forwards
33
+ // `{method, params}` VERBATIM onto the bridge.
34
+ //
35
+ // The relayed top-level `method` is therefore always the literal string
36
+ // `notifications/message` — never `repo.changed`. The MCP spec's logging
37
+ // params are `{ level, logger, data }`, and `data` is free-form, so the pkg's
38
+ // own routing discriminant has to live inside `data`. `com.ikenga.git` puts a
39
+ // JSON-RPC-shaped envelope there:
40
+ //
41
+ // { level: 'info', logger: 'git-mcp/watcher',
42
+ // data: { method: 'repo.changed',
43
+ // params: { repo, seq, coalesced, at } } }
44
+ //
45
+ // (Same convention Studio already uses for its render events — see
46
+ // `ikenga-pkgs/packages/apps/studio/mcp/src/index.ts` `sendLoggingMessage` and
47
+ // the demux in `studio/src/studio/bridge.ts`.)
48
+ //
49
+ // This module types that envelope and gives the iframe a guard that accepts
50
+ // either the whole relayed frame or a bare `data` envelope, so a consumer
51
+ // doesn't have to hand-write the `params.data.method` reach.
52
+
53
+ import { z } from 'zod';
54
+
55
+ /** The `method` discriminant carried inside the logging frame's `data`. */
56
+ export const REPO_CHANGED_METHOD = 'repo.changed' as const;
57
+
58
+ /**
59
+ * Per-pkg relay budget enforced by the Rust supervisor's MCP read loop.
60
+ *
61
+ * Mirrors `MCP_NOTIFICATION_MAX_PER_SEC` in
62
+ * `shell/src-tauri/src/pkg/lifecycle.rs:166` — this is a re-declaration for
63
+ * pkg authors, NOT a second enforcement point. The shell drops (never queues)
64
+ * frames past the cap, so an over-cap burst loses the middle of the run, not
65
+ * the tail.
66
+ *
67
+ * The window is **TUMBLING, not rolling**: the loop resets `window_start` to
68
+ * `now` and zeroes the counter the first time a frame arrives ≥1s after the
69
+ * window opened (`lifecycle.rs:~1427-1439`). A burst can therefore straddle
70
+ * two windows and land up to 2× this many frames inside one arbitrary
71
+ * one-second span — that is expected, not a leak.
72
+ *
73
+ * Practical consequence for a watcher: coalesce ruthlessly before sending.
74
+ * `repo.changed` carries `coalesced` precisely so one frame can stand for many
75
+ * filesystem events.
76
+ */
77
+ export const HOST_NOTIFICATION_MAX_PER_SEC = 20;
78
+
79
+ /** Zod schema for the `repo.changed` payload. */
80
+ export const RepoChangedParamsSchema = z.object({
81
+ /** Absolute path to the repo's toplevel (the `git rev-parse --show-toplevel`
82
+ * value), which is the same key the pkg's RPC surface uses for `repo`. */
83
+ repo: z.string().min(1),
84
+ /** Monotonic per-repo sequence, starting at 1, incremented once per emitted
85
+ * frame. Lets a consumer detect frames the relay's rate cap dropped: a gap
86
+ * means "you missed something, re-read the snapshot". */
87
+ seq: z.number().int().nonnegative(),
88
+ /** How many raw filesystem events this frame stands for (≥1). A large value
89
+ * is normal during a rebase or a branch switch. */
90
+ coalesced: z.number().int().positive(),
91
+ /** `Date.now()` at emit time, in the MCP server's process. */
92
+ at: z.number().int().nonnegative(),
93
+ });
94
+
95
+ /** The `repo.changed` payload — what a consumer actually wants. */
96
+ export type RepoChangedParams = z.infer<typeof RepoChangedParamsSchema>;
97
+
98
+ /** The JSON-RPC-shaped envelope the pkg's MCP server places in the logging
99
+ * frame's `data` field. */
100
+ export interface RepoChangedEnvelope {
101
+ method: typeof REPO_CHANGED_METHOD;
102
+ params: RepoChangedParams;
103
+ }
104
+
105
+ /** Zod schema for that envelope. */
106
+ export const RepoChangedEnvelopeSchema = z.object({
107
+ method: z.literal(REPO_CHANGED_METHOD),
108
+ params: RepoChangedParamsSchema,
109
+ });
110
+
111
+ /**
112
+ * Pull the `repo.changed` params out of anything the iframe might hand us,
113
+ * or return `null` if this isn't a `repo.changed` frame.
114
+ *
115
+ * Accepts three shapes, so a caller can pass whatever their notification
116
+ * handler gave them without unwrapping first:
117
+ *
118
+ * 1. the full relayed frame — `{ method: 'notifications/message',
119
+ * params: { level, logger, data: <envelope> } }`
120
+ * 2. the logging params alone — `{ level, logger, data: <envelope> }`
121
+ * (this is what `setNotificationHandler(LoggingMessageNotificationSchema,
122
+ * n => …)` hands you as `n.params`)
123
+ * 3. the bare envelope — `{ method: 'repo.changed', params: {…} }`
124
+ *
125
+ * Returns `null` for anything else, including a well-formed logging frame for
126
+ * a different topic. Never throws.
127
+ */
128
+ export function readRepoChangedParams(value: unknown): RepoChangedParams | null {
129
+ if (typeof value !== 'object' || value === null) return null;
130
+ const v = value as Record<string, unknown>;
131
+
132
+ // Shape 3 — bare envelope.
133
+ const bare = RepoChangedEnvelopeSchema.safeParse(v);
134
+ if (bare.success) return bare.data.params;
135
+
136
+ // Shape 1 — full frame: descend into `params` and retry as shape 2.
137
+ if (v.method === 'notifications/message') {
138
+ return readRepoChangedParams(v.params);
139
+ }
140
+
141
+ // Shape 2 — logging params: the envelope is in `data`.
142
+ if ('data' in v) {
143
+ const inner = RepoChangedEnvelopeSchema.safeParse(v.data);
144
+ if (inner.success) return inner.data.params;
145
+ }
146
+
147
+ return null;
148
+ }
149
+
150
+ /**
151
+ * Type guard over the same three shapes `readRepoChangedParams` accepts.
152
+ * Narrows only to "this carries a valid `repo.changed`" — call
153
+ * `readRepoChangedParams` to get the payload, since the guard cannot narrow
154
+ * through the outer wrapper.
155
+ */
156
+ export function isRepoChangedNotification(value: unknown): boolean {
157
+ return readRepoChangedParams(value) !== null;
158
+ }
@@ -60,7 +60,7 @@ export interface McpServerSpec {
60
60
  /**
61
61
  * Capability flags every engine adapter advertises. This is the canonical
62
62
  * shape consumed by both the shell-side ChatAdapter layer and any pkg that
63
- * needs to reason about adapter features (wizard, settings UI, telemetry).
63
+ * needs to reason about adapter features (wizard, settings UI, sidecar health).
64
64
  *
65
65
  * Fields are intentionally a *superset* of what any single adapter
66
66
  * supports — an adapter sets the ones it implements to `true` and the
package/src/index.ts CHANGED
@@ -11,6 +11,7 @@ export * from './pa-actions.js';
11
11
  export * from './window.js';
12
12
  export * from './action-frontmatter.js';
13
13
  export * from './host-context.js';
14
+ export * from './app-bridge.js';
14
15
 
15
16
  /** This package's own version. */
16
17
  export const CONTRACT_PACKAGE_VERSION = '0.5.0' as const;
@@ -89,8 +89,8 @@ test('Manifest: requires defaults to [] when absent (pre-Phase-4 manifest)', ()
89
89
 
90
90
  // ─── WP-01 — trusted-cap tier (ADR-017): http / secrets / invoke + signature ─
91
91
 
92
- test('IKENGA_API_VERSION is 3 (ADR-017 soft bump)', () => {
93
- assert.equal(IKENGA_API_VERSION, 3);
92
+ test('IKENGA_API_VERSION is 4 (WP-01 Manifest v4)', () => {
93
+ assert.equal(IKENGA_API_VERSION, 4);
94
94
  });
95
95
 
96
96
  test('HttpCapability: auth_header defaults to Authorization; auth_secret optional', () => {
@@ -177,6 +177,26 @@ test('Manifest: api=1 manifest without new fields parses (back-compat)', () => {
177
177
  assert.equal(m.capabilities, undefined);
178
178
  });
179
179
 
180
+ test('Manifest: webview capability and partition route parses', () => {
181
+ const m = ManifestSchema.parse({
182
+ ...BASE,
183
+ ui: {
184
+ routes: [
185
+ { path: '/test', kind: 'webview', source: 'https://example.com', partition: 'test-part' }
186
+ ]
187
+ },
188
+ capabilities: {
189
+ webview: {
190
+ child_webviews: true,
191
+ allowed_origins: ['https://example.com']
192
+ }
193
+ }
194
+ });
195
+ assert.equal(m.ui.routes[0].kind, 'webview');
196
+ assert.equal(m.ui.routes[0].partition, 'test-part');
197
+ assert.deepEqual(m.capabilities?.webview?.allowed_origins, ['https://example.com']);
198
+ });
199
+
180
200
  test('Manifest: retired bundling fields are no longer part of the type (WP-17)', () => {
181
201
  // ADR-015 decision 4: `skills`/`commands`/`agents` were hard-retired from the
182
202
  // schema (lockstep with the Rust `deny_unknown_fields` Manifest, which REJECTS
@@ -190,3 +210,31 @@ test('Manifest: retired bundling fields are no longer part of the type (WP-17)',
190
210
  assert.equal(m.skills, undefined);
191
211
  assert.equal(m.commands, undefined);
192
212
  });
213
+
214
+ test('Manifest: allowed_origins absent stays absent (not coerced to [])', () => {
215
+ // G-28 — absent must be distinguishable from an explicit deny-all lockdown.
216
+ // A `.default([])` here would silently turn every pre-v4 manifest into one.
217
+ const m = ManifestSchema.parse({
218
+ id: 'com.test.webview',
219
+ name: 'T',
220
+ version: '1.0.0',
221
+ ikenga_api: '4',
222
+ author: { name: 'T' },
223
+ ui: { routes: [{ path: '/', kind: 'webview', source: 'https://example.com' }] },
224
+ capabilities: { webview: { child_webviews: true, partitions: ['default'] } },
225
+ });
226
+ assert.equal(m.capabilities?.webview?.allowed_origins, undefined);
227
+ });
228
+
229
+ test('Manifest: allowed_origins empty array survives as an explicit lockdown', () => {
230
+ const m = ManifestSchema.parse({
231
+ id: 'com.test.webview',
232
+ name: 'T',
233
+ version: '1.0.0',
234
+ ikenga_api: '4',
235
+ author: { name: 'T' },
236
+ ui: { routes: [{ path: '/', kind: 'webview', source: 'https://example.com' }] },
237
+ capabilities: { webview: { child_webviews: true, partitions: ['default'], allowed_origins: [] } },
238
+ });
239
+ assert.deepEqual(m.capabilities?.webview?.allowed_origins, []);
240
+ });
package/src/manifest.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  // Ikenga pkg manifest schema — mirrors the Rust schema in
2
- // `royalti-io/ikenga` at `src-tauri/src/pkg/manifest.rs`.
2
+ // `ikenga-hq/ikenga` at `src-tauri/src/pkg/manifest.rs`.
3
3
  //
4
4
  // Source of truth is the Rust struct. This zod schema is used by the CLI,
5
5
  // registry, and tooling for client-side parse + validation. Field changes
@@ -17,7 +17,7 @@ import { BrowserEngineSchema } from './browser.js';
17
17
  // v3 (ADR-017): added capabilities.http / .secrets / .invoke (trusted-cap tier)
18
18
  // + top-level optional `signature`. All additive; api=1/2 manifests parse
19
19
  // unchanged. Elevated caps are inert unless the pkg is trusted.
20
- export const IKENGA_API_VERSION = 3 as const;
20
+ export const IKENGA_API_VERSION = 4 as const;
21
21
  export const IKENGA_API_MIN_SUPPORTED = 1 as const;
22
22
 
23
23
  // ---------- Sub-schemas ----------
@@ -79,6 +79,13 @@ export const PermissionsSchema = z.object({
79
79
  * (pkgDeclaresScope). Mirrors `Permissions.engine` in the shell's
80
80
  * manifest.rs — keep in lockstep. */
81
81
  engine: z.array(z.string()).default([]),
82
+ /** Notification scopes. `"send"` gates the FE-side `host.notify` verb
83
+ * (pkgDeclaresScope), which raises a real OS notification and therefore
84
+ * reaches the user even when Ikenga is not the focused window — which is
85
+ * why it is gated at all. Mirrors `Permissions.notify` in the shell's
86
+ * manifest.rs — keep in lockstep. */
87
+ notify: z.array(z.string()).default([]),
88
+ events: z.array(z.string()).default([]),
82
89
  }).default({});
83
90
 
84
91
  export const NavEntrySchema = z.object({
@@ -91,10 +98,11 @@ export const NavEntrySchema = z.object({
91
98
 
92
99
  export const UiRouteSchema = z.object({
93
100
  path: z.string(),
94
- /** "iframe" | "component" (component is builtin-only) */
95
- kind: z.enum(['iframe', 'component']),
96
- /** iframe: URL or pkg-relative html path. component: identifier. */
101
+ /** "iframe" | "component" | "webview" (component is builtin-only) */
102
+ kind: z.enum(['iframe', 'component', 'webview']),
103
+ /** iframe/webview: URL or pkg-relative html path. component: identifier. */
97
104
  source: z.string(),
105
+ partition: z.string().optional(),
98
106
  });
99
107
 
100
108
  export const CommandPaletteEntrySchema = z.object({
@@ -110,6 +118,11 @@ export const SidePaneViewerSchema = z.object({
110
118
  route: z.string(),
111
119
  });
112
120
 
121
+ export const ManifestUiSessionSchema = z.object({
122
+ persistence: z.enum(['keep', 'clear-on-exit', 'ask']),
123
+ });
124
+ export type ManifestUiSession = z.infer<typeof ManifestUiSessionSchema>;
125
+
113
126
  export const UiBlockSchema = z.object({
114
127
  nav: z.array(NavEntrySchema).default([]),
115
128
  routes: z.array(UiRouteSchema).default([]),
@@ -119,6 +132,7 @@ export const UiBlockSchema = z.object({
119
132
  csp: z.record(z.array(z.string())).optional(),
120
133
  /** Per-directive Permission-Policy values. */
121
134
  permissions: z.record(z.array(z.string())).optional(),
135
+ session: ManifestUiSessionSchema.optional(),
122
136
  }).default({});
123
137
 
124
138
  export const SettingsFieldSchema = z.object({
@@ -185,6 +199,13 @@ export const WebviewCapabilitySchema = z.object({
185
199
  * own OS window). Defaults to `["webkit"]` so existing manifests are
186
200
  * unchanged. Mirrors `engines` in `WebviewCapability` (manifest.rs). */
187
201
  engines: z.array(BrowserEngineSchema).default(['webkit']),
202
+ /** Origins this pkg's webviews may load. **Absent is permissive** (with a
203
+ * host-side warning) so pre-v4 manifests keep mounting; `[]` is an explicit
204
+ * deny-all; entries match exactly, as `*`, or as a `https://*.example.com`
205
+ * subdomain glob. Mirrors `allowed_origins` in `manifest.rs` — absent and
206
+ * empty are deliberately distinct, so this must stay `.optional()`, never
207
+ * `.default([])`. */
208
+ allowed_origins: z.array(z.string()).optional(),
188
209
  });
189
210
  export type WebviewCapability = z.infer<typeof WebviewCapabilitySchema>;
190
211
 
@@ -314,6 +335,11 @@ export const RequiresEntrySchema = z
314
335
  .strict();
315
336
  export type RequiresEntry = z.infer<typeof RequiresEntrySchema>;
316
337
 
338
+ export const ManifestAuthBridgeSchema = z.object({
339
+ strategy: z.enum(['api-key', 'cdp', 'none']),
340
+ });
341
+ export type ManifestAuthBridge = z.infer<typeof ManifestAuthBridgeSchema>;
342
+
317
343
  // ---------- Manifest ----------
318
344
 
319
345
  export const ManifestSchema = z.object({
@@ -324,6 +350,8 @@ export const ManifestSchema = z.object({
324
350
  /** Numeric string — host accepts versions in [MIN, CURRENT]. */
325
351
  ikenga_api: z.string().regex(/^\d+$/),
326
352
 
353
+ auth_bridge: ManifestAuthBridgeSchema.optional(),
354
+
327
355
  /** Hint, not enforced: "skill" | "embedded" | "windowed" | "engine". */
328
356
  kind: z.string().optional(),
329
357
  author: AuthorSchema.optional(),
package/src/registry.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  // Ikenga registry schema — the static JSON catalog served by
2
- // `Royalti-io/ikenga-registry` over GitHub Pages.
2
+ // `ikenga-hq/ikenga-registry` over GitHub Pages.
3
3
  //
4
4
  // Shape: a small root `index.json` lists every pkg with its latest version
5
5
  // and a pointer to a per-pkg detail file (`pkgs/<short-name>.json`).
package/src/window.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  // Multi-window contract — mirrors the Rust source-of-truth in
2
- // `royalti-io/ikenga` at `src-tauri/src/window/{descriptor,events}.rs`.
2
+ // `ikenga-hq/ikenga` at `src-tauri/src/window/{descriptor,events}.rs`.
3
3
  //
4
4
  // This is the `G-WINDOW-MODEL` freeze-gate output (plans/multi-window WP-02).
5
5
  // It has TWO co-equal halves: the `WindowDescriptor` (what a window IS) and the