@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.
- package/README.md +8 -8
- package/dist/action-frontmatter.js +1 -1
- package/dist/action-frontmatter.js.map +1 -1
- package/dist/app-bridge.d.ts +126 -0
- package/dist/app-bridge.d.ts.map +1 -0
- package/dist/app-bridge.js +141 -0
- package/dist/app-bridge.js.map +1 -0
- package/dist/artifact.d.ts +10 -10
- package/dist/engine/adapter.d.ts +1 -1
- package/dist/engine/adapter.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +232 -41
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +28 -5
- package/dist/manifest.js.map +1 -1
- package/dist/registry.d.ts +206 -34
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +1 -1
- package/dist/registry.js.map +1 -1
- package/dist/window.js +1 -1
- package/dist/window.js.map +1 -1
- package/package.json +6 -2
- package/src/action-frontmatter.ts +1 -1
- package/src/app-bridge.ts +158 -0
- package/src/engine/adapter.ts +1 -1
- package/src/index.ts +1 -0
- package/src/manifest.test.ts +50 -2
- package/src/manifest.ts +33 -5
- package/src/registry.ts +1 -1
- package/src/window.ts +1 -1
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,uBAAuB,EAAG,CAAU,CAAC;AAIlD;;;;GAIG;AACH,eAAO,MAAM,YAAY;IACvB,4DAA4D;;IAE5D,0DAA0D;;;;;;;;EAE1D,CAAC;AACH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;EAGjC,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,gBAAgB;IAC3B,4BAA4B;;IAE5B,iDAAiD;;IAEjD,yEAAyE;;IAEzE,2DAA2D;;IAE3D,mFAAmF;;IAEnF,4DAA4D
|
|
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
|
-
// `
|
|
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/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,
|
|
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
|
-
// `
|
|
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
|
package/dist/window.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"window.js","sourceRoot":"","sources":["../src/window.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,
|
|
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.
|
|
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/
|
|
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 `
|
|
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
|
+
}
|
package/src/engine/adapter.ts
CHANGED
|
@@ -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,
|
|
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;
|
package/src/manifest.test.ts
CHANGED
|
@@ -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
|
|
93
|
-
assert.equal(IKENGA_API_VERSION,
|
|
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
|
-
// `
|
|
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 =
|
|
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
|
-
// `
|
|
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
|
-
// `
|
|
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
|