instar 1.2.83 → 1.3.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/commands/init.js +14 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +86 -4
- package/dist/commands/server.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts +2 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +279 -12
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/installCodexHooks.d.ts.map +1 -1
- package/dist/core/installCodexHooks.js +3 -2
- package/dist/core/installCodexHooks.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +1 -8
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +28 -67
- package/dist/server/routes.js.map +1 -1
- package/dist/server/stopGate.d.ts +8 -2
- package/dist/server/stopGate.d.ts.map +1 -1
- package/dist/server/stopGate.js +42 -2
- package/dist/server/stopGate.js.map +1 -1
- package/dist/threadline/CollaborationSurfacer.d.ts.map +1 -1
- package/dist/threadline/CollaborationSurfacer.js +7 -3
- package/dist/threadline/CollaborationSurfacer.js.map +1 -1
- package/dist/threadline/hubCommands.d.ts +67 -0
- package/dist/threadline/hubCommands.d.ts.map +1 -0
- package/dist/threadline/hubCommands.js +126 -0
- package/dist/threadline/hubCommands.js.map +1 -0
- package/package.json +1 -1
- package/playbook-scripts/build-state.py +39 -1
- package/scripts/analyze-release.js +16 -8
- package/scripts/generate-builtin-manifest.cjs +2 -1
- package/src/data/builtin-manifest.json +74 -65
- package/src/scaffold/templates.ts +1 -8
- package/src/templates/hooks/build-stop-hook.sh +62 -0
- package/src/templates/hooks/settings-template.json +10 -0
- package/upgrades/1.3.0.md +27 -0
- package/upgrades/1.3.1.md +27 -0
- package/upgrades/side-effects/build-stop-hook-session-scoping.md +133 -0
- package/upgrades/side-effects/fresh-session-stop-gate-shadow-wiring.md +35 -0
- package/upgrades/side-effects/threadline-open-this-deterministic.md +45 -0
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* stopGate.ts — UnjustifiedStopGate server infrastructure (PR0a).
|
|
3
3
|
*
|
|
4
|
-
* Provides the read-side API surface that the
|
|
5
|
-
*
|
|
4
|
+
* Provides the read-side API surface that the stop-hook router consumes.
|
|
5
|
+
* Runtime mode persists to disk so shadow-mode rollout survives server
|
|
6
|
+
* restarts; per-session hot-path state remains process-local and is
|
|
7
|
+
* repopulated by hook events.
|
|
6
8
|
*
|
|
7
9
|
* Spec: docs/specs/context-death-pitfall-prevention.md
|
|
8
10
|
*
|
|
@@ -20,6 +22,10 @@
|
|
|
20
22
|
export declare const GATE_ROUTE_VERSION = 1;
|
|
21
23
|
export declare const GATE_ROUTE_MINIMUM_VERSION = 1;
|
|
22
24
|
export type GateMode = 'off' | 'shadow' | 'enforce';
|
|
25
|
+
export declare function configureStopGateState(opts?: {
|
|
26
|
+
modeFilePath?: string;
|
|
27
|
+
defaultMode?: GateMode;
|
|
28
|
+
}): GateMode;
|
|
23
29
|
export declare function getMode(): GateMode;
|
|
24
30
|
export declare function setMode(mode: GateMode): void;
|
|
25
31
|
export declare function getKillSwitch(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stopGate.d.ts","sourceRoot":"","sources":["../../src/server/stopGate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stopGate.d.ts","sourceRoot":"","sources":["../../src/server/stopGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAeH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAS5C,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;AA6CpD,wBAAgB,sBAAsB,CAAC,IAAI,GAAE;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,QAAQ,CAAC;CACnB,GAAG,QAAQ,CAShB;AAED,wBAAgB,OAAO,IAAI,QAAQ,CAElC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAG5C;AAED,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAIrD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAI/E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGlE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAgBD,MAAM,WAAW,sBAAsB;IACrC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;8DAC0D;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,sBAA2B,GAAG,OAAO,CA0B7E;AASD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;8EAE0E;IAC1E,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAoBD,wBAAgB,eAAe,CAAC,IAAI,GAAE,aAAkB,GAAG,YAAY,CAatE"}
|
package/dist/server/stopGate.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* stopGate.ts — UnjustifiedStopGate server infrastructure (PR0a).
|
|
3
3
|
*
|
|
4
|
-
* Provides the read-side API surface that the
|
|
5
|
-
*
|
|
4
|
+
* Provides the read-side API surface that the stop-hook router consumes.
|
|
5
|
+
* Runtime mode persists to disk so shadow-mode rollout survives server
|
|
6
|
+
* restarts; per-session hot-path state remains process-local and is
|
|
7
|
+
* repopulated by hook events.
|
|
6
8
|
*
|
|
7
9
|
* Spec: docs/specs/context-death-pitfall-prevention.md
|
|
8
10
|
*
|
|
@@ -34,13 +36,50 @@ export const GATE_ROUTE_MINIMUM_VERSION = 1;
|
|
|
34
36
|
const state = {
|
|
35
37
|
mode: 'off',
|
|
36
38
|
killSwitch: false,
|
|
39
|
+
modeFilePath: null,
|
|
37
40
|
sessionStartTs: new Map(),
|
|
38
41
|
};
|
|
42
|
+
function readPersistedMode(filePath) {
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
45
|
+
const mode = parsed.mode;
|
|
46
|
+
if (mode === 'off' || mode === 'shadow' || mode === 'enforce')
|
|
47
|
+
return mode;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Missing/unreadable state is not fatal; caller supplies default.
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
function persistMode() {
|
|
55
|
+
if (!state.modeFilePath)
|
|
56
|
+
return;
|
|
57
|
+
try {
|
|
58
|
+
fs.mkdirSync(path.dirname(state.modeFilePath), { recursive: true });
|
|
59
|
+
fs.writeFileSync(state.modeFilePath, JSON.stringify({ mode: state.mode, updatedAt: new Date().toISOString() }, null, 2) + '\n', { mode: 0o600 });
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Fail open. The route still returns the in-memory mode; persistence
|
|
63
|
+
// failure is reported by the caller's normal health/degradation path.
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export function configureStopGateState(opts = {}) {
|
|
67
|
+
if (opts.modeFilePath) {
|
|
68
|
+
state.modeFilePath = opts.modeFilePath;
|
|
69
|
+
state.mode = readPersistedMode(opts.modeFilePath) ?? (opts.defaultMode ?? state.mode);
|
|
70
|
+
persistMode();
|
|
71
|
+
return state.mode;
|
|
72
|
+
}
|
|
73
|
+
if (opts.defaultMode)
|
|
74
|
+
state.mode = opts.defaultMode;
|
|
75
|
+
return state.mode;
|
|
76
|
+
}
|
|
39
77
|
export function getMode() {
|
|
40
78
|
return state.mode;
|
|
41
79
|
}
|
|
42
80
|
export function setMode(mode) {
|
|
43
81
|
state.mode = mode;
|
|
82
|
+
persistMode();
|
|
44
83
|
}
|
|
45
84
|
export function getKillSwitch() {
|
|
46
85
|
return state.killSwitch;
|
|
@@ -83,6 +122,7 @@ export function getSessionStartTs(sessionId) {
|
|
|
83
122
|
export function _resetForTests() {
|
|
84
123
|
state.mode = 'off';
|
|
85
124
|
state.killSwitch = false;
|
|
125
|
+
state.modeFilePath = null;
|
|
86
126
|
state.sessionStartTs.clear();
|
|
87
127
|
}
|
|
88
128
|
// ── Compaction probe (P0.6) ─────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stopGate.js","sourceRoot":"","sources":["../../src/server/stopGate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"stopGate.js","sourceRoot":"","sources":["../../src/server/stopGate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationSurfacer.d.ts","sourceRoot":"","sources":["../../src/threadline/CollaborationSurfacer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxH;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,cAAc,EAAE,OAAO,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sFAAsF;AACtF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAUD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAgC;gBAE/B,MAAM,EAAE,2BAA2B;IAS/C;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IA+B1D;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAkBxD,2DAA2D;IAC3D,aAAa,IAAI,MAAM,GAAG,SAAS;IAInC;;;;OAIG;IACH,iBAAiB,IAAI;QAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;IAOhF,mFAAmF;IACnF,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASjC,wEAAwE;IAClE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAa9B,cAAc;IAO5B,yDAAyD;IACzD,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,YAAY;IAOpB;;;;OAIG;IACH,OAAO,CAAC,IAAI;
|
|
1
|
+
{"version":3,"file":"CollaborationSurfacer.d.ts","sourceRoot":"","sources":["../../src/threadline/CollaborationSurfacer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxH;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,cAAc,EAAE,OAAO,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sFAAsF;AACtF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAUD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAgC;gBAE/B,MAAM,EAAE,2BAA2B;IAS/C;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IA+B1D;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;IAkBxD,2DAA2D;IAC3D,aAAa,IAAI,MAAM,GAAG,SAAS;IAInC;;;;OAIG;IACH,iBAAiB,IAAI;QAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE;IAOhF,mFAAmF;IACnF,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IASjC,wEAAwE;IAClE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAa9B,cAAc;IAO5B,yDAAyD;IACzD,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,YAAY;IAOpB;;;;OAIG;IACH,OAAO,CAAC,IAAI;IA+BZ,OAAO,CAAC,WAAW;CAYpB"}
|
|
@@ -182,11 +182,15 @@ export class CollaborationSurfacer {
|
|
|
182
182
|
return { dedicatedTopicId: data.dedicatedTopicId, surfaced: data.surfaced };
|
|
183
183
|
}
|
|
184
184
|
if (Array.isArray(data.surfacedThreads)) {
|
|
185
|
-
// Legacy → records.
|
|
186
|
-
|
|
185
|
+
// Legacy → records. The legacy array is append-ordered (newest last),
|
|
186
|
+
// so stamp surfacedAt by INDEX (not a constant epoch) to preserve that
|
|
187
|
+
// ordering — otherwise mostRecentUnbound() can't tell legacy entries
|
|
188
|
+
// apart (D3). index+1 ms keeps them all in 1970 (older than any real
|
|
189
|
+
// `new Date()` surfacing) while ordering them by original arrival.
|
|
190
|
+
const surfaced = data.surfacedThreads.map((threadId, index) => ({
|
|
187
191
|
threadId,
|
|
188
192
|
peerName: 'An agent',
|
|
189
|
-
surfacedAt: new Date(
|
|
193
|
+
surfacedAt: new Date(index + 1).toISOString(),
|
|
190
194
|
bound: false,
|
|
191
195
|
}));
|
|
192
196
|
return { dedicatedTopicId: data.dedicatedTopicId, surfaced };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationSurfacer.js","sourceRoot":"","sources":["../../src/threadline/CollaborationSurfacer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CollaborationSurfacer.js","sourceRoot":"","sources":["../../src/threadline/CollaborationSurfacer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threadline hub commands — deterministic "open this" / "tie this to <topic>"
|
|
3
|
+
* (CMT-529). Both the `POST /threadline/hub/bind` route AND the structural
|
|
4
|
+
* intercept in `telegram.onTopicMessage` use `bindHubConversation`, so the
|
|
5
|
+
* behavior is identical regardless of how the message arrived. `parseHubCommand`
|
|
6
|
+
* is a pure, tightly-anchored matcher so ordinary hub chat falls through to the
|
|
7
|
+
* agent.
|
|
8
|
+
*/
|
|
9
|
+
import type { CollaborationSurfacer } from './CollaborationSurfacer.js';
|
|
10
|
+
import type { ConversationStore } from './ConversationStore.js';
|
|
11
|
+
import type { CommitmentTracker } from '../monitoring/CommitmentTracker.js';
|
|
12
|
+
export type HubCommand = {
|
|
13
|
+
action: 'open';
|
|
14
|
+
} | {
|
|
15
|
+
action: 'tie';
|
|
16
|
+
targetTopicId?: number;
|
|
17
|
+
targetTopicName?: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Deterministically classify a hub-topic message. Returns null for anything
|
|
21
|
+
* that isn't *only* a hub command, so "can you open this and explain it?" is
|
|
22
|
+
* left to the conversational agent.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseHubCommand(text: string): HubCommand | null;
|
|
25
|
+
export interface HubBindDeps {
|
|
26
|
+
collaborationSurfacer: CollaborationSurfacer;
|
|
27
|
+
conversationStore: ConversationStore;
|
|
28
|
+
commitmentTracker: CommitmentTracker | null;
|
|
29
|
+
telegram: {
|
|
30
|
+
findOrCreateForumTopic(name: string, iconColor?: number): Promise<{
|
|
31
|
+
topicId: number;
|
|
32
|
+
name: string;
|
|
33
|
+
reused: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
sendToTopic(topicId: number, text: string, options?: {
|
|
36
|
+
silent?: boolean;
|
|
37
|
+
}): Promise<unknown>;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export interface HubBindArgs {
|
|
41
|
+
action: 'open' | 'tie';
|
|
42
|
+
threadId?: string;
|
|
43
|
+
targetTopicId?: number;
|
|
44
|
+
targetTopicName?: string;
|
|
45
|
+
/** When true (the human "open this" intercept), resolve the ambiguous case to
|
|
46
|
+
* the most-recent unbound instead of returning a 409. The API path leaves this
|
|
47
|
+
* false so a scripted caller gets the explicit "specify threadId" error. */
|
|
48
|
+
autoPick?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export type HubBindResult = {
|
|
51
|
+
ok: true;
|
|
52
|
+
action: 'open' | 'tie';
|
|
53
|
+
threadId: string;
|
|
54
|
+
topicId: number;
|
|
55
|
+
topicName: string;
|
|
56
|
+
} | {
|
|
57
|
+
ok: false;
|
|
58
|
+
status: number;
|
|
59
|
+
error: string;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Authoritatively bind a surfaced hub conversation to a topic. Returns a
|
|
63
|
+
* discriminated result — NEVER touches an HTTP response; each caller owns its
|
|
64
|
+
* own response + any extra messaging.
|
|
65
|
+
*/
|
|
66
|
+
export declare function bindHubConversation(deps: HubBindDeps, args: HubBindArgs): Promise<HubBindResult>;
|
|
67
|
+
//# sourceMappingURL=hubCommands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubCommands.d.ts","sourceRoot":"","sources":["../../src/threadline/hubCommands.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAe/D;AAED,MAAM,WAAW,WAAW;IAC1B,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE;QACR,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QACtH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KAC9F,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;gFAE4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC1F;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA+BjD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAmDtG"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Threadline hub commands — deterministic "open this" / "tie this to <topic>"
|
|
3
|
+
* (CMT-529). Both the `POST /threadline/hub/bind` route AND the structural
|
|
4
|
+
* intercept in `telegram.onTopicMessage` use `bindHubConversation`, so the
|
|
5
|
+
* behavior is identical regardless of how the message arrived. `parseHubCommand`
|
|
6
|
+
* is a pure, tightly-anchored matcher so ordinary hub chat falls through to the
|
|
7
|
+
* agent.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Deterministically classify a hub-topic message. Returns null for anything
|
|
11
|
+
* that isn't *only* a hub command, so "can you open this and explain it?" is
|
|
12
|
+
* left to the conversational agent.
|
|
13
|
+
*/
|
|
14
|
+
export function parseHubCommand(text) {
|
|
15
|
+
const t = (text ?? '').trim();
|
|
16
|
+
if (!t)
|
|
17
|
+
return null;
|
|
18
|
+
// "open this" / "open" / "Open This." — the message must be only the command.
|
|
19
|
+
if (/^open(?:\s+this)?\s*[.!]?$/i.test(t))
|
|
20
|
+
return { action: 'open' };
|
|
21
|
+
// "tie this to <topic>" / "bind this to <topic>"
|
|
22
|
+
const tie = t.match(/^(?:tie|bind)\s+this\s+to\s+(.+?)\s*[.!]?$/i);
|
|
23
|
+
if (tie) {
|
|
24
|
+
const target = tie[1].trim();
|
|
25
|
+
// "#1234" or a bare number → topic id; else a topic name (verbatim).
|
|
26
|
+
const idMatch = target.match(/^#?(\d{1,15})$/);
|
|
27
|
+
if (idMatch)
|
|
28
|
+
return { action: 'tie', targetTopicId: Number(idMatch[1]) };
|
|
29
|
+
return { action: 'tie', targetTopicName: target };
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const NAME_MAX = 40; // hard cap (Telegram allows 128; keep it short + low-exposure)
|
|
34
|
+
const CREDENTIAL_RE = /(sk-|xox[bap]-|ghp_|AKIA|-----BEGIN|password|secret|token|api[_-]?key)/i;
|
|
35
|
+
/**
|
|
36
|
+
* Build a readable, scrubbed topic name from the conversation. Falls back to
|
|
37
|
+
* `<peer> · <threadId8>` when there's no usable gist or it looks credential-like
|
|
38
|
+
* (a cold first message could contain a secret — never splash that into a
|
|
39
|
+
* chat-list-visible topic title).
|
|
40
|
+
*/
|
|
41
|
+
function topicNameFor(conv, threadId) {
|
|
42
|
+
const peerRaw = conv?.participants?.peers?.[0] ?? 'agent';
|
|
43
|
+
const peer = peerRaw.replace(/[^\w-]/g, '').slice(0, 24) || 'agent';
|
|
44
|
+
const fallback = `${peer} · ${threadId.slice(0, 8)}`;
|
|
45
|
+
const gistSource = (conv?.subject && conv.subject !== 'Relay message' ? conv.subject : conv?.lastInboundHash) ?? '';
|
|
46
|
+
if (!gistSource || CREDENTIAL_RE.test(gistSource))
|
|
47
|
+
return fallback;
|
|
48
|
+
const slug = gistSource
|
|
49
|
+
.replace(/[^\w\s-]/g, ' ')
|
|
50
|
+
.replace(/\s+/g, ' ')
|
|
51
|
+
.trim()
|
|
52
|
+
.split(' ')
|
|
53
|
+
.slice(0, 6)
|
|
54
|
+
.join(' ')
|
|
55
|
+
.slice(0, NAME_MAX)
|
|
56
|
+
.trim();
|
|
57
|
+
if (!slug || slug.length < 4)
|
|
58
|
+
return fallback;
|
|
59
|
+
return slug;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Authoritatively bind a surfaced hub conversation to a topic. Returns a
|
|
63
|
+
* discriminated result — NEVER touches an HTTP response; each caller owns its
|
|
64
|
+
* own response + any extra messaging.
|
|
65
|
+
*/
|
|
66
|
+
export async function bindHubConversation(deps, args) {
|
|
67
|
+
const { collaborationSurfacer, conversationStore, commitmentTracker, telegram } = deps;
|
|
68
|
+
if (args.action !== 'open' && args.action !== 'tie') {
|
|
69
|
+
return { ok: false, status: 400, error: '"action" must be "open" or "tie"' };
|
|
70
|
+
}
|
|
71
|
+
// Resolve the conversation.
|
|
72
|
+
let threadId = args.threadId;
|
|
73
|
+
if (!threadId) {
|
|
74
|
+
const mru = collaborationSurfacer.mostRecentUnbound();
|
|
75
|
+
if (!mru.record)
|
|
76
|
+
return { ok: false, status: 404, error: 'No unbound Threadline conversation in the hub to open' };
|
|
77
|
+
if (mru.ambiguous && !args.autoPick) {
|
|
78
|
+
return { ok: false, status: 409, error: 'More than one unbound conversation in the hub — specify which threadId to open' };
|
|
79
|
+
}
|
|
80
|
+
threadId = mru.record.threadId; // autoPick (or single) → most-recent
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
let topicId;
|
|
84
|
+
let topicName;
|
|
85
|
+
if (args.action === 'tie') {
|
|
86
|
+
if (typeof args.targetTopicId === 'number') {
|
|
87
|
+
topicId = args.targetTopicId;
|
|
88
|
+
topicName = typeof args.targetTopicName === 'string' ? args.targetTopicName : `topic ${topicId}`;
|
|
89
|
+
}
|
|
90
|
+
else if (typeof args.targetTopicName === 'string' && args.targetTopicName) {
|
|
91
|
+
const t = await telegram.findOrCreateForumTopic(args.targetTopicName);
|
|
92
|
+
topicId = t.topicId;
|
|
93
|
+
topicName = t.name;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return { ok: false, status: 400, error: 'tie requires targetTopicId or targetTopicName' };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const existing = conversationStore.get(threadId);
|
|
101
|
+
const name = topicNameFor(existing ?? null, threadId);
|
|
102
|
+
const t = await telegram.findOrCreateForumTopic(name);
|
|
103
|
+
topicId = t.topicId;
|
|
104
|
+
topicName = t.name;
|
|
105
|
+
}
|
|
106
|
+
// Authoritative bind: conversation + commitment.
|
|
107
|
+
await conversationStore.mutate(threadId, (c) => { c.boundTopicId = topicId; return c; });
|
|
108
|
+
const commitment = commitmentTracker?.findByThreadId(threadId);
|
|
109
|
+
if (commitment && commitmentTracker) {
|
|
110
|
+
try {
|
|
111
|
+
await commitmentTracker.mutate(commitment.id, (c) => { c.topicId = topicId; return c; });
|
|
112
|
+
}
|
|
113
|
+
catch (e) {
|
|
114
|
+
console.warn(`[hub/bind] commitment topicId update failed: ${e instanceof Error ? e.message : e}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
collaborationSurfacer.markBound(threadId);
|
|
118
|
+
await telegram.sendToTopic(topicId, `🧵 This Threadline conversation is now tied to this topic — updates will land here.`).catch(() => { });
|
|
119
|
+
await collaborationSurfacer.noteInHub(`Opened "${topicName}" (conversation ${threadId.slice(0, 8)}).`);
|
|
120
|
+
return { ok: true, action: args.action, threadId, topicId, topicName };
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return { ok: false, status: 500, error: err instanceof Error ? err.message : String(err) };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=hubCommands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubCommands.js","sourceRoot":"","sources":["../../src/threadline/hubCommands.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -206,6 +206,30 @@ def git_run(args, cwd=None):
|
|
|
206
206
|
return result.returncode == 0, result.stdout.strip(), result.stderr.strip()
|
|
207
207
|
|
|
208
208
|
|
|
209
|
+
# ─── Owner identity (BUILD-STOP-HOOK-SESSION-SCOPING-SPEC) ────────────
|
|
210
|
+
# A build is owned by the session that started it. We stamp the owner's stable
|
|
211
|
+
# tmux session name (cwd-independent) at init so the Stop hook can scope its
|
|
212
|
+
# "keep working" block to the OWNER alone — other concurrent sessions of the same
|
|
213
|
+
# agent must approve-exit without draining the owner's reinforcement budget.
|
|
214
|
+
# Test seams (shared with build-stop-hook.sh): INSTAR_HOOK_TMUX_SESSION (if set,
|
|
215
|
+
# even empty, wins) and INSTAR_HOOK_NO_TMUX=1 (forces empty). Best-effort only —
|
|
216
|
+
# resolution failure must never break `init`.
|
|
217
|
+
|
|
218
|
+
def resolve_owner_tmux(explicit=None):
|
|
219
|
+
if explicit:
|
|
220
|
+
return explicit.strip()
|
|
221
|
+
if os.environ.get("INSTAR_HOOK_NO_TMUX") == "1":
|
|
222
|
+
return ""
|
|
223
|
+
if "INSTAR_HOOK_TMUX_SESSION" in os.environ:
|
|
224
|
+
return os.environ["INSTAR_HOOK_TMUX_SESSION"]
|
|
225
|
+
try:
|
|
226
|
+
r = subprocess.run(["tmux", "display-message", "-p", "#S"],
|
|
227
|
+
capture_output=True, text=True, timeout=3)
|
|
228
|
+
return r.stdout.strip() if r.returncode == 0 else ""
|
|
229
|
+
except Exception:
|
|
230
|
+
return ""
|
|
231
|
+
|
|
232
|
+
|
|
209
233
|
# ─── Worktree Commands ──────────────────────────────────────────
|
|
210
234
|
|
|
211
235
|
def cmd_worktree_create(args):
|
|
@@ -329,10 +353,16 @@ def cmd_init(args):
|
|
|
329
353
|
out({"error": "Invalid size. Use SMALL, STANDARD, or LARGE"})
|
|
330
354
|
sys.exit(1)
|
|
331
355
|
|
|
356
|
+
owner = {
|
|
357
|
+
"tmux": resolve_owner_tmux(getattr(args, "owner_tmux", None)),
|
|
358
|
+
"session": (getattr(args, "owner_session", None) or "").strip(),
|
|
359
|
+
"stampedAt": now_iso(),
|
|
360
|
+
}
|
|
332
361
|
state = {
|
|
333
362
|
"task": args.task, "phase": "idle", "size": size,
|
|
334
363
|
"protection": PROTECTION_LEVELS[size],
|
|
335
364
|
"startedAt": now_iso(), "completedAt": None,
|
|
365
|
+
"owner": owner,
|
|
336
366
|
"currentStep": 0, "totalSteps": 0, "steps": [],
|
|
337
367
|
"totalTests": 0, "allPassing": True,
|
|
338
368
|
"fixIterations": 0, "maxFixIterations": 3,
|
|
@@ -341,7 +371,9 @@ def cmd_init(args):
|
|
|
341
371
|
"worktree": None,
|
|
342
372
|
}
|
|
343
373
|
save_state(state)
|
|
344
|
-
append_audit("build.initialized", {
|
|
374
|
+
append_audit("build.initialized", {
|
|
375
|
+
"task": args.task, "size": size,
|
|
376
|
+
"ownerTmux": owner["tmux"], "ownerSession": owner["session"]})
|
|
345
377
|
out({"status": "initialized", "task": args.task, "size": size,
|
|
346
378
|
"protection": PROTECTION_LEVELS[size]["label"],
|
|
347
379
|
"reinforcements": PROTECTION_LEVELS[size]["reinforcements"]})
|
|
@@ -583,6 +615,12 @@ def main():
|
|
|
583
615
|
s.add_argument("task")
|
|
584
616
|
s.add_argument("--size", choices=["SMALL", "STANDARD", "LARGE"],
|
|
585
617
|
default="STANDARD")
|
|
618
|
+
# Owner identity (session-scoping). --owner-session carries the Claude session
|
|
619
|
+
# UUID ($CLAUDE_CODE_SESSION_ID), which child processes don't inherit, so the
|
|
620
|
+
# SKILL passes it explicitly. --owner-tmux is an override seam (tests / unusual
|
|
621
|
+
# launches); normally the tmux name is self-resolved.
|
|
622
|
+
s.add_argument("--owner-session", default="")
|
|
623
|
+
s.add_argument("--owner-tmux", default="")
|
|
586
624
|
|
|
587
625
|
s = sub.add_parser("transition")
|
|
588
626
|
s.add_argument("phase")
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
// safe-git-allow: release analyzer runs before TS source is compiled; read-only git only.
|
|
2
3
|
/**
|
|
3
4
|
* Release Change Analyzer
|
|
4
5
|
*
|
|
@@ -24,11 +25,10 @@
|
|
|
24
25
|
* node scripts/analyze-release.js --recommend-only # Just recommend bump type
|
|
25
26
|
*/
|
|
26
27
|
|
|
27
|
-
import {
|
|
28
|
+
import { execFileSync } from 'node:child_process';
|
|
28
29
|
import fs from 'node:fs';
|
|
29
30
|
import path from 'node:path';
|
|
30
31
|
import { fileURLToPath } from 'node:url';
|
|
31
|
-
import { SafeGitExecutor } from '../src/core/SafeGitExecutor.js';
|
|
32
32
|
|
|
33
33
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
34
34
|
const ROOT = path.resolve(__dirname, '..');
|
|
@@ -43,18 +43,26 @@ function log(msg) {
|
|
|
43
43
|
|
|
44
44
|
// ── Git Helpers ──────────────────────────────────────────────────────
|
|
45
45
|
|
|
46
|
+
function gitRead(args) {
|
|
47
|
+
return execFileSync('git', args, {
|
|
48
|
+
cwd: ROOT,
|
|
49
|
+
encoding: 'utf-8',
|
|
50
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
46
54
|
function getLastReleaseTag() {
|
|
47
55
|
try {
|
|
48
|
-
return
|
|
56
|
+
return gitRead(['describe', '--tags', '--abbrev=0']).trim();
|
|
49
57
|
} catch {
|
|
50
58
|
// No tags at all — diff against the initial commit
|
|
51
|
-
return
|
|
59
|
+
return gitRead(['rev-list', '--max-parents=0', 'HEAD']).trim();
|
|
52
60
|
}
|
|
53
61
|
}
|
|
54
62
|
|
|
55
63
|
function getCommitsSinceTag(tag) {
|
|
56
64
|
try {
|
|
57
|
-
const raw =
|
|
65
|
+
const raw = gitRead(['log', `${tag}..HEAD`, '--oneline', '--no-merges']);
|
|
58
66
|
return raw.trim().split('\n').filter(Boolean).map(line => {
|
|
59
67
|
const [hash, ...rest] = line.split(' ');
|
|
60
68
|
return { hash, message: rest.join(' ') };
|
|
@@ -66,7 +74,7 @@ function getCommitsSinceTag(tag) {
|
|
|
66
74
|
|
|
67
75
|
function getDiffStat(tag) {
|
|
68
76
|
try {
|
|
69
|
-
return
|
|
77
|
+
return gitRead(['diff', `${tag}..HEAD`, '--stat']).trim();
|
|
70
78
|
} catch {
|
|
71
79
|
return '';
|
|
72
80
|
}
|
|
@@ -74,7 +82,7 @@ function getDiffStat(tag) {
|
|
|
74
82
|
|
|
75
83
|
function getChangedFiles(tag) {
|
|
76
84
|
try {
|
|
77
|
-
const raw =
|
|
85
|
+
const raw = gitRead(['diff', `${tag}..HEAD`, '--name-status']);
|
|
78
86
|
return raw.trim().split('\n').filter(Boolean).map(line => {
|
|
79
87
|
const [status, ...pathParts] = line.split('\t');
|
|
80
88
|
return { status: status.charAt(0), file: pathParts.join('\t') };
|
|
@@ -86,7 +94,7 @@ function getChangedFiles(tag) {
|
|
|
86
94
|
|
|
87
95
|
function getFileDiff(tag, file) {
|
|
88
96
|
try {
|
|
89
|
-
return
|
|
97
|
+
return gitRead(['diff', `${tag}..HEAD`, '--', file]);
|
|
90
98
|
} catch {
|
|
91
99
|
return '';
|
|
92
100
|
}
|
|
@@ -43,7 +43,7 @@ function fileExists(filePath) {
|
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Scan hooks from PostUpdateMigrator's migrateHooks method.
|
|
46
|
-
* These are the
|
|
46
|
+
* These are the hook files Instar writes to .instar/hooks/instar/.
|
|
47
47
|
*/
|
|
48
48
|
function scanHooks() {
|
|
49
49
|
const entries = [];
|
|
@@ -63,6 +63,7 @@ function scanHooks() {
|
|
|
63
63
|
{ file: 'free-text-guard.sh', domain: 'safety' },
|
|
64
64
|
{ file: 'claim-intercept.js', domain: 'coherence' },
|
|
65
65
|
{ file: 'claim-intercept-response.js', domain: 'coherence' },
|
|
66
|
+
{ file: 'stop-gate-router.js', domain: 'safety' },
|
|
66
67
|
{ file: 'auto-approve-permissions.js', domain: 'safety' },
|
|
67
68
|
];
|
|
68
69
|
|