@cotal-ai/core 0.79.0 → 0.81.1
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/dist/channels.d.ts +9 -3
- package/dist/channels.d.ts.map +1 -1
- package/dist/channels.js +33 -15
- package/dist/channels.js.map +1 -1
- package/dist/connector.d.ts +7 -4
- package/dist/connector.d.ts.map +1 -1
- package/dist/connector.js.map +1 -1
- package/dist/endpoint-binding.d.ts +6 -0
- package/dist/endpoint-binding.d.ts.map +1 -1
- package/dist/endpoint-binding.js +14 -9
- package/dist/endpoint-binding.js.map +1 -1
- package/dist/endpoint-serve-kv.d.ts +2 -1
- package/dist/endpoint-serve-kv.d.ts.map +1 -1
- package/dist/endpoint-serve-kv.js +2 -1
- package/dist/endpoint-serve-kv.js.map +1 -1
- package/dist/endpoint-service.d.ts +2 -0
- package/dist/endpoint-service.d.ts.map +1 -1
- package/dist/endpoint-service.js.map +1 -1
- package/dist/endpoint.d.ts +2 -2
- package/dist/endpoint.d.ts.map +1 -1
- package/dist/endpoint.js +5 -5
- package/dist/endpoint.js.map +1 -1
- package/dist/environment-manager-grants.d.ts +19 -0
- package/dist/environment-manager-grants.d.ts.map +1 -0
- package/dist/environment-manager-grants.js +68 -0
- package/dist/environment-manager-grants.js.map +1 -0
- 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/lifecycle-state.d.ts +3 -0
- package/dist/lifecycle-state.d.ts.map +1 -1
- package/dist/lifecycle-state.js +3 -1
- package/dist/lifecycle-state.js.map +1 -1
- package/dist/provision.d.ts +5 -1
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +32 -3
- package/dist/provision.js.map +1 -1
- package/dist/schema-profile.d.ts.map +1 -1
- package/dist/schema-profile.js +2 -0
- package/dist/schema-profile.js.map +1 -1
- package/dist/startup-confirm.d.ts +25 -13
- package/dist/startup-confirm.d.ts.map +1 -1
- package/dist/startup-confirm.js +69 -17
- package/dist/startup-confirm.js.map +1 -1
- package/package.json +6 -3
package/dist/startup-confirm.js
CHANGED
|
@@ -2,37 +2,89 @@ const CSI = /\x1b\[[0-?]*[ -/]*[@-~]/g;
|
|
|
2
2
|
const OSC = /\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g;
|
|
3
3
|
const ESC = /\x1b(?:.|$)/g;
|
|
4
4
|
const POLL_MS = 250;
|
|
5
|
-
/** How long a runtime waits for a {@link LaunchSpec.confirm} prompt before it ends the seat. */
|
|
6
5
|
const CONFIRM_TIMEOUT_MS = 15_000;
|
|
7
|
-
/** Normalize terminal text according to {@link LaunchSpec.confirm}: ignore ANSI control sequences and whitespace. */
|
|
8
6
|
function normalizeConfirmText(value) {
|
|
9
7
|
return value.replace(OSC, "").replace(CSI, "").replace(ESC, "").replace(/\s+/g, "");
|
|
10
8
|
}
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
9
|
+
/** The seat package repeats this small matcher because it has no core dependency. Both operate on
|
|
10
|
+
* current screen snapshots, never scrollback accumulated from an earlier dialog. */
|
|
11
|
+
export class StartupConfirmSequence {
|
|
12
|
+
#final;
|
|
13
|
+
#before;
|
|
14
|
+
#step = 0;
|
|
15
|
+
#stable = false;
|
|
16
|
+
#done = false;
|
|
17
|
+
constructor(prompt, before = []) {
|
|
18
|
+
this.#final = normalizeConfirmText(prompt);
|
|
19
|
+
if (!this.#final)
|
|
20
|
+
throw new Error("startup confirmation prompt is empty after ANSI and whitespace normalization");
|
|
21
|
+
if (!Array.isArray(before) || before.length > 8)
|
|
22
|
+
throw new Error("invalid startup choices");
|
|
23
|
+
this.#before = before.map((reply) => {
|
|
24
|
+
if (!reply || typeof reply.prompt !== "string" || reply.prompt.length > 1024 || !["Down", "Enter"].includes(reply.key))
|
|
25
|
+
throw new Error("invalid startup choice");
|
|
26
|
+
const normalized = reply.prompt.split(/\r?\n/).map(normalizeConfirmText).filter(Boolean).join("\n");
|
|
27
|
+
if (!normalized)
|
|
28
|
+
throw new Error("startup choice prompt is empty after normalization");
|
|
29
|
+
return { prompt: normalized, key: reply.key };
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
observe(screen) {
|
|
33
|
+
if (this.#done)
|
|
34
|
+
return undefined;
|
|
35
|
+
const lines = screen.split(/\r?\n/).map(normalizeConfirmText).filter(Boolean);
|
|
36
|
+
const matches = (prompt) => {
|
|
37
|
+
const expected = prompt.split("\n");
|
|
38
|
+
return lines.some((_, start) => expected.every((line, offset) => lines[start + offset] === line));
|
|
39
|
+
};
|
|
40
|
+
const step = this.#before[this.#step];
|
|
41
|
+
// Workspace paths can contain the warning text. Prefer a real menu over that text and match
|
|
42
|
+
// whole visible lines, rather than a substring in the displayed path.
|
|
43
|
+
if (!step || !matches(step.prompt)) {
|
|
44
|
+
this.#stable = false;
|
|
45
|
+
const final = this.#before.length ? matches(this.#final) : normalizeConfirmText(screen).includes(this.#final);
|
|
46
|
+
if (!final)
|
|
47
|
+
return undefined;
|
|
48
|
+
this.#done = true;
|
|
49
|
+
return { key: "Enter", done: true };
|
|
50
|
+
}
|
|
51
|
+
// A partial first paint is not an interactive menu yet. Require the same choice on two
|
|
52
|
+
// consecutive snapshots; a changed screen clears the observation instead of receiving a key.
|
|
53
|
+
if (!this.#stable) {
|
|
54
|
+
this.#stable = true;
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
this.#step++;
|
|
58
|
+
this.#stable = false;
|
|
59
|
+
return { key: step.key, done: false };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** Honor {@link LaunchSpec.confirm} and its optional preceding choices within one startup bound.
|
|
63
|
+
* No key is sent for an unrelated dialog, after exit, or after the final confirmation. */
|
|
64
|
+
export function confirmWatch(prompt, before = []) {
|
|
65
|
+
// Validate before a runtime starts a child, but allocate mutable state per watch.
|
|
66
|
+
new StartupConfirmSequence(prompt, before);
|
|
22
67
|
return (pane) => {
|
|
68
|
+
const sequence = new StartupConfirmSequence(prompt, before);
|
|
23
69
|
const deadline = Date.now() + CONFIRM_TIMEOUT_MS;
|
|
24
70
|
const poll = () => {
|
|
25
71
|
let failure = `Cotal startup confirmation failed: prompt ${JSON.stringify(prompt)} did not appear within ${CONFIRM_TIMEOUT_MS}ms.`;
|
|
26
72
|
try {
|
|
27
|
-
// A read blocks the event loop, so none starts past the deadline, and none that returns past
|
|
28
|
-
// it is acted on.
|
|
29
73
|
if (Date.now() < deadline) {
|
|
30
74
|
const screen = pane.read();
|
|
31
75
|
if (screen === undefined)
|
|
32
76
|
return;
|
|
33
77
|
if (Date.now() < deadline) {
|
|
34
|
-
|
|
35
|
-
|
|
78
|
+
const action = sequence.observe(screen);
|
|
79
|
+
if (action?.key === "Down") {
|
|
80
|
+
if (!pane.down)
|
|
81
|
+
throw new Error("this runtime cannot answer a Down startup choice");
|
|
82
|
+
pane.down();
|
|
83
|
+
}
|
|
84
|
+
else if (action)
|
|
85
|
+
pane.enter();
|
|
86
|
+
if (action?.done)
|
|
87
|
+
return;
|
|
36
88
|
setTimeout(poll, POLL_MS);
|
|
37
89
|
return;
|
|
38
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup-confirm.js","sourceRoot":"","sources":["../src/startup-confirm.ts"],"names":[],"mappings":"AAEA,MAAM,GAAG,GAAG,0BAA0B,CAAC;AACvC,MAAM,GAAG,GAAG,oCAAoC,CAAC;AACjD,MAAM,GAAG,GAAG,cAAc,CAAC;AAC3B,MAAM,OAAO,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"startup-confirm.js","sourceRoot":"","sources":["../src/startup-confirm.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cotal-ai/core",
|
|
3
3
|
"description": "The Cotal protocol: endpoint, subjects, message types, the NATS client layer, and the extension contracts.",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.81.1",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"cotal",
|
|
@@ -65,8 +65,11 @@
|
|
|
65
65
|
"scripts": {
|
|
66
66
|
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.smoke.json",
|
|
67
67
|
"build": "tsc -p tsconfig.json",
|
|
68
|
-
"test": "tsx smoke/resolve.smoke.ts && tsx smoke/backup.smoke.ts && tsx smoke/space-auth.smoke.ts",
|
|
68
|
+
"test": "tsx smoke/resolve.smoke.ts && tsx smoke/backup.smoke.ts && tsx smoke/space-auth.smoke.ts && pnpm smoke:schema-own-properties && pnpm smoke:schema-own-properties-controls",
|
|
69
69
|
"smoke:backup": "tsx smoke/backup.smoke.ts",
|
|
70
|
-
"smoke:backup:live": "tsx smoke/backup-live.smoke.ts"
|
|
70
|
+
"smoke:backup:live": "tsx smoke/backup-live.smoke.ts",
|
|
71
|
+
"smoke:schema-own-properties": "node smoke/schema-own-properties.public.mjs --gate partial",
|
|
72
|
+
"smoke:schema-own-properties-controls": "node smoke/schema-own-properties.public.mjs --gate controls",
|
|
73
|
+
"smoke:schema-conformance-20": "node smoke/schema-own-properties.public.mjs --gate full"
|
|
71
74
|
}
|
|
72
75
|
}
|