agenthub-multiagent-mcp 1.75.0 → 1.76.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.
Files changed (112) hide show
  1. package/dist/client.d.ts +19 -1
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +31 -0
  4. package/dist/client.js.map +1 -1
  5. package/dist/commands/setup-shell.js +11 -11
  6. package/dist/currentCaptureSession.d.ts +31 -0
  7. package/dist/currentCaptureSession.d.ts.map +1 -0
  8. package/dist/currentCaptureSession.js +54 -0
  9. package/dist/currentCaptureSession.js.map +1 -0
  10. package/dist/currentCaptureSession.test.d.ts +2 -0
  11. package/dist/currentCaptureSession.test.d.ts.map +1 -0
  12. package/dist/currentCaptureSession.test.js +55 -0
  13. package/dist/currentCaptureSession.test.js.map +1 -0
  14. package/dist/employee.d.ts +11 -0
  15. package/dist/employee.d.ts.map +1 -1
  16. package/dist/employee.js +64 -1
  17. package/dist/employee.js.map +1 -1
  18. package/dist/employee.test.js +88 -1
  19. package/dist/employee.test.js.map +1 -1
  20. package/dist/goshtiChannel/client.d.ts +9 -0
  21. package/dist/goshtiChannel/client.d.ts.map +1 -0
  22. package/dist/goshtiChannel/client.js +63 -0
  23. package/dist/goshtiChannel/client.js.map +1 -0
  24. package/dist/goshtiChannel/config.d.ts +42 -0
  25. package/dist/goshtiChannel/config.d.ts.map +1 -0
  26. package/dist/goshtiChannel/config.js +129 -0
  27. package/dist/goshtiChannel/config.js.map +1 -0
  28. package/dist/goshtiChannel/config.test.d.ts +2 -0
  29. package/dist/goshtiChannel/config.test.d.ts.map +1 -0
  30. package/dist/goshtiChannel/config.test.js +73 -0
  31. package/dist/goshtiChannel/config.test.js.map +1 -0
  32. package/dist/goshtiChannel/core.d.ts +63 -0
  33. package/dist/goshtiChannel/core.d.ts.map +1 -0
  34. package/dist/goshtiChannel/core.js +237 -0
  35. package/dist/goshtiChannel/core.js.map +1 -0
  36. package/dist/goshtiChannel/core.test.d.ts +2 -0
  37. package/dist/goshtiChannel/core.test.d.ts.map +1 -0
  38. package/dist/goshtiChannel/core.test.js +250 -0
  39. package/dist/goshtiChannel/core.test.js.map +1 -0
  40. package/dist/goshtiChannel/credential.d.ts +29 -0
  41. package/dist/goshtiChannel/credential.d.ts.map +1 -0
  42. package/dist/goshtiChannel/credential.js +160 -0
  43. package/dist/goshtiChannel/credential.js.map +1 -0
  44. package/dist/goshtiChannel/credential.test.d.ts +2 -0
  45. package/dist/goshtiChannel/credential.test.d.ts.map +1 -0
  46. package/dist/goshtiChannel/credential.test.js +127 -0
  47. package/dist/goshtiChannel/credential.test.js.map +1 -0
  48. package/dist/goshtiChannel/e2e.test.d.ts +2 -0
  49. package/dist/goshtiChannel/e2e.test.d.ts.map +1 -0
  50. package/dist/goshtiChannel/e2e.test.js +163 -0
  51. package/dist/goshtiChannel/e2e.test.js.map +1 -0
  52. package/dist/goshtiChannel/policy.d.ts +154 -0
  53. package/dist/goshtiChannel/policy.d.ts.map +1 -0
  54. package/dist/goshtiChannel/policy.js +240 -0
  55. package/dist/goshtiChannel/policy.js.map +1 -0
  56. package/dist/goshtiChannel/policy.test.d.ts +2 -0
  57. package/dist/goshtiChannel/policy.test.d.ts.map +1 -0
  58. package/dist/goshtiChannel/policy.test.js +263 -0
  59. package/dist/goshtiChannel/policy.test.js.map +1 -0
  60. package/dist/goshtiChannel/setup.d.ts +15 -0
  61. package/dist/goshtiChannel/setup.d.ts.map +1 -0
  62. package/dist/goshtiChannel/setup.js +125 -0
  63. package/dist/goshtiChannel/setup.js.map +1 -0
  64. package/dist/goshtiChannel/setup.test.d.ts +2 -0
  65. package/dist/goshtiChannel/setup.test.d.ts.map +1 -0
  66. package/dist/goshtiChannel/setup.test.js +96 -0
  67. package/dist/goshtiChannel/setup.test.js.map +1 -0
  68. package/dist/goshtiChannel/stream.d.ts +39 -0
  69. package/dist/goshtiChannel/stream.d.ts.map +1 -0
  70. package/dist/goshtiChannel/stream.js +174 -0
  71. package/dist/goshtiChannel/stream.js.map +1 -0
  72. package/dist/goshtiChannel/stream.test.d.ts +2 -0
  73. package/dist/goshtiChannel/stream.test.d.ts.map +1 -0
  74. package/dist/goshtiChannel/stream.test.js +164 -0
  75. package/dist/goshtiChannel/stream.test.js.map +1 -0
  76. package/dist/goshtiChannel.d.ts +22 -0
  77. package/dist/goshtiChannel.d.ts.map +1 -0
  78. package/dist/goshtiChannel.js +193 -0
  79. package/dist/goshtiChannel.js.map +1 -0
  80. package/dist/state.d.ts +2 -0
  81. package/dist/state.d.ts.map +1 -1
  82. package/dist/state.js.map +1 -1
  83. package/dist/tools/brainWriteCheck.test.d.ts +10 -0
  84. package/dist/tools/brainWriteCheck.test.d.ts.map +1 -0
  85. package/dist/tools/brainWriteCheck.test.js +67 -0
  86. package/dist/tools/brainWriteCheck.test.js.map +1 -0
  87. package/dist/tools/employeeTraining.d.ts +46 -0
  88. package/dist/tools/employeeTraining.d.ts.map +1 -0
  89. package/dist/tools/employeeTraining.js +329 -0
  90. package/dist/tools/employeeTraining.js.map +1 -0
  91. package/dist/tools/employeeTraining.test.d.ts +7 -0
  92. package/dist/tools/employeeTraining.test.d.ts.map +1 -0
  93. package/dist/tools/employeeTraining.test.js +190 -0
  94. package/dist/tools/employeeTraining.test.js.map +1 -0
  95. package/dist/tools/index.d.ts.map +1 -1
  96. package/dist/tools/index.js +155 -5
  97. package/dist/tools/index.js.map +1 -1
  98. package/dist/tools/runs.d.ts +43 -0
  99. package/dist/tools/runs.d.ts.map +1 -0
  100. package/dist/tools/runs.js +280 -0
  101. package/dist/tools/runs.js.map +1 -0
  102. package/dist/tools/runs.test.d.ts +9 -0
  103. package/dist/tools/runs.test.d.ts.map +1 -0
  104. package/dist/tools/runs.test.js +114 -0
  105. package/dist/tools/runs.test.js.map +1 -0
  106. package/dist/tools/tools.test.js +82 -2
  107. package/dist/tools/tools.test.js.map +1 -1
  108. package/package.json +79 -78
  109. package/skills/catalog.json +104 -102
  110. package/skills/commands/close-session.md +2 -2
  111. package/skills/commands/start-session.md +2 -2
  112. package/skills/manifest.json +67 -65
@@ -0,0 +1,55 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
2
+ import * as fs from "fs";
3
+ import * as os from "os";
4
+ import * as path from "path";
5
+ import { currentCaptureSessionId } from "./currentCaptureSession.js";
6
+ import { writeActivityMarker } from "./activityMarker.js";
7
+ let tmp;
8
+ let work;
9
+ let grant;
10
+ beforeEach(() => {
11
+ tmp = fs.mkdtempSync(path.join(os.tmpdir(), "agenthub-capsess-"));
12
+ work = path.join(tmp, "work");
13
+ fs.mkdirSync(work);
14
+ grant = path.join(tmp, "claude", "agenthub-capture.json");
15
+ });
16
+ afterEach(() => {
17
+ fs.rmSync(tmp, { recursive: true, force: true });
18
+ });
19
+ function writeState(claudeSid, state) {
20
+ const dir = path.join(path.dirname(grant), "agenthub-capture-state");
21
+ fs.mkdirSync(dir, { recursive: true });
22
+ fs.writeFileSync(path.join(dir, `${claudeSid}.json`), JSON.stringify(state));
23
+ }
24
+ describe("currentCaptureSessionId", () => {
25
+ it("prefers AGENTHUB_SESSION_ID (a daemon shift)", () => {
26
+ writeActivityMarker(work, "editing", { session_id: "claude-1", transcript_path: "/t" });
27
+ writeState("claude-1", { session_id: "from-state" });
28
+ const env = { AGENTHUB_SESSION_ID: " shift-sess ", AGENTHUB_CAPTURE_GRANT: grant };
29
+ expect(currentCaptureSessionId({ env, workingDir: work })).toBe("shift-sess");
30
+ });
31
+ it("reads the capture hook's cached session for the current Claude session", () => {
32
+ writeActivityMarker(work, "editing", { session_id: "claude-1", transcript_path: "/t" });
33
+ writeState("claude-1", { session_id: "cs-uuid-1", notice_text: "x" });
34
+ expect(currentCaptureSessionId({ env: { AGENTHUB_CAPTURE_GRANT: grant }, workingDir: work })).toBe("cs-uuid-1");
35
+ });
36
+ it("answers nothing when capture was refused", () => {
37
+ writeActivityMarker(work, "editing", { session_id: "claude-1", transcript_path: "/t" });
38
+ writeState("claude-1", { denied: true, session_id: "stale" });
39
+ expect(currentCaptureSessionId({ env: { AGENTHUB_CAPTURE_GRANT: grant }, workingDir: work })).toBeUndefined();
40
+ });
41
+ it("answers nothing with no marker, no state file, or no working dir", () => {
42
+ expect(currentCaptureSessionId({ env: { AGENTHUB_CAPTURE_GRANT: grant }, workingDir: work })).toBeUndefined();
43
+ writeActivityMarker(work, "editing", { session_id: "claude-2", transcript_path: "/t" });
44
+ expect(currentCaptureSessionId({ env: { AGENTHUB_CAPTURE_GRANT: grant }, workingDir: work })).toBeUndefined();
45
+ expect(currentCaptureSessionId({ env: {}, workingDir: null })).toBeUndefined();
46
+ });
47
+ it("uses ~/.claude/agenthub-capture.json when no grant path is set", () => {
48
+ const home = path.join(tmp, "home");
49
+ grant = path.join(home, ".claude", "agenthub-capture.json");
50
+ writeActivityMarker(work, "editing", { session_id: "claude-3", transcript_path: "/t" });
51
+ writeState("claude-3", { session_id: "cs-home" });
52
+ expect(currentCaptureSessionId({ env: {}, workingDir: work, homeDir: home })).toBe("cs-home");
53
+ });
54
+ });
55
+ //# sourceMappingURL=currentCaptureSession.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"currentCaptureSession.test.js","sourceRoot":"","sources":["../src/currentCaptureSession.test.ts"],"names":[],"mappings":"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"}
@@ -50,6 +50,17 @@ export interface ShiftTrigger {
50
50
  * is unreachable — the daemon then behaves exactly as it does today.
51
51
  */
52
52
  export declare function fetchEmployee(apiUrl: string, apiKey: string, agentId: string): Promise<EmployeeContext | null>;
53
+ /**
54
+ * add-charter-guardrail-consistency §1 — the capability boundary, generated
55
+ * from the charter's guardrails (the boundary the policy engine enforces), so
56
+ * the model never reads a narrower or wider boundary than the real one. Written
57
+ * prose describes the mission; this block is the authoritative list.
58
+ *
59
+ * Mirrors employees.Resolve: a name outside allowed_capabilities is denied
60
+ * (including one listed as break-glass), "*" allows every capability, and
61
+ * unreadable guardrails deny everything (the server fails closed on them).
62
+ */
63
+ export declare function renderCapabilityBoundary(guardrails: unknown): string;
53
64
  export declare function buildShiftPrompt(ctx: EmployeeContext, trigger: ShiftTrigger): string;
54
65
  /**
55
66
  * buildFastSystemPrompt renders the in-role system prompt for the fast
@@ -1 +1 @@
1
- {"version":3,"file":"employee.d.ts","sourceRoot":"","sources":["../src/employee.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAwBjC;AAoBD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAsEpF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAUlE;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE;IAC7C,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAC7D,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;CAC7D,CAiBA,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;CAcjB,CAAC"}
1
+ {"version":3,"file":"employee.d.ts","sourceRoot":"","sources":["../src/employee.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAwBjC;AA6BD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAkDpE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAyEpF;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAUlE;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE;IAC7C,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAC7D,KAAK,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;CAC7D,CAiBA,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;CAcjB,CAAC"}
package/dist/employee.js CHANGED
@@ -57,6 +57,67 @@ const SLACK_FORMATTING_NOTE = [
57
57
  "- ```slack:status``` with `title:`, `state: success|degraded|down|pending`, then `key: value` lines → a status card.",
58
58
  "- ```slack:callout warning``` (severity info|warning|success|error) → a highlighted note.",
59
59
  ].join("\n");
60
+ function stringList(v) {
61
+ return Array.isArray(v) ? v.filter((x) => typeof x === "string" && x !== "") : [];
62
+ }
63
+ /**
64
+ * add-charter-guardrail-consistency §1 — the capability boundary, generated
65
+ * from the charter's guardrails (the boundary the policy engine enforces), so
66
+ * the model never reads a narrower or wider boundary than the real one. Written
67
+ * prose describes the mission; this block is the authoritative list.
68
+ *
69
+ * Mirrors employees.Resolve: a name outside allowed_capabilities is denied
70
+ * (including one listed as break-glass), "*" allows every capability, and
71
+ * unreadable guardrails deny everything (the server fails closed on them).
72
+ */
73
+ export function renderCapabilityBoundary(guardrails) {
74
+ const header = "CAPABILITY BOUNDARY (generated from your charter's guardrails — this is what the policy engine enforces on capability_invoke and on the governed tools calendar / email / slack_dm / slack_file):";
75
+ let g = null;
76
+ if (typeof guardrails === "string") {
77
+ try {
78
+ g = JSON.parse(guardrails);
79
+ }
80
+ catch {
81
+ g = null;
82
+ }
83
+ }
84
+ else if (guardrails && typeof guardrails === "object" && !Array.isArray(guardrails)) {
85
+ g = guardrails;
86
+ }
87
+ if (!g || typeof g !== "object" || Array.isArray(g)) {
88
+ return [
89
+ header,
90
+ "- Your guardrails could not be read, so every capability is DENIED. Escalate via send_message to your owner.",
91
+ ].join("\n");
92
+ }
93
+ const allowed = stringList(g.allowed_capabilities);
94
+ const breakGlass = stringList(g.break_glass);
95
+ const wildcard = allowed.includes("*");
96
+ const isAllowed = (c) => wildcard || allowed.includes(c);
97
+ const gated = breakGlass.filter(isAllowed);
98
+ const unreachable = breakGlass.filter((c) => !isAllowed(c));
99
+ const free = allowed.filter((c) => c !== "*" && !breakGlass.includes(c));
100
+ const lines = [header];
101
+ if (wildcard) {
102
+ lines.push('- You MAY use: ALL capabilities (allowed_capabilities is "*").');
103
+ }
104
+ else if (allowed.length === 0) {
105
+ lines.push("- You MAY use: none — every capability is DENIED.");
106
+ }
107
+ else {
108
+ lines.push(`- You MAY use: ${free.length ? free.join(", ") : "none without approval"}`);
109
+ }
110
+ lines.push(gated.length
111
+ ? `- These require human approval before use (break-glass — the call returns 202 pending_review): ${gated.join(", ")}`
112
+ : "- No capability is marked break-glass.");
113
+ if (unreachable.length) {
114
+ lines.push(`- Listed as break-glass but not in your allowed list, so they are denied outright: ${unreachable.join(", ")}`);
115
+ }
116
+ if (!wildcard && allowed.length > 0) {
117
+ lines.push("- Everything else is DENIED (403 policy_denied) — if a step needs it, escalate via send_message instead.");
118
+ }
119
+ return lines.join("\n");
120
+ }
60
121
  export function buildShiftPrompt(ctx, trigger) {
61
122
  const c = ctx.charter;
62
123
  const supervised = SUPERVISED_TIERS.has(ctx.tier);
@@ -119,7 +180,9 @@ export function buildShiftPrompt(ctx, trigger) {
119
180
  // Conversational (message) shifts answer humans in Slack — teach the optional
120
181
  // formatting directives. Assigned-task shifts report via tools, not Slack prose.
121
182
  const formatBlock = trigger.kind === "message" ? SLACK_FORMATTING_NOTE : "";
122
- return [charterBlock, rules, triggerBlock, loop, formatBlock].filter(Boolean).join("\n\n");
183
+ // add-charter-guardrail-consistency §1.2 — after the mission/standing rules.
184
+ const boundary = renderCapabilityBoundary(c.guardrails);
185
+ return [charterBlock, rules, boundary, triggerBlock, loop, formatBlock].filter(Boolean).join("\n\n");
123
186
  }
124
187
  /**
125
188
  * buildFastSystemPrompt renders the in-role system prompt for the fast
@@ -1 +1 @@
1
- {"version":3,"file":"employee.js","sourceRoot":"","sources":["../src/employee.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"employee.js","sourceRoot":"","sources":["../src/employee.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
- import { fetchEmployee, buildShiftPrompt, buildFastSystemPrompt, ENG_IC_CHARTER, } from "./employee.js";
2
+ import { fetchEmployee, buildShiftPrompt, buildFastSystemPrompt, ENG_IC_CHARTER, CHARTER_TEMPLATES, renderCapabilityBoundary, } from "./employee.js";
3
3
  // add-ai-agent-employees §1 — the employee layer must (a) never break the
4
4
  // plain daemon when the agent isn't an employee / the feature is off, and
5
5
  // (b) render shift prompts that carry the charter + tier supervision rules.
@@ -132,4 +132,91 @@ describe("buildFastSystemPrompt", () => {
132
132
  expect(p).toMatch(/cannot take actions|handled as a task/i);
133
133
  });
134
134
  });
135
+ // add-charter-guardrail-consistency §1 — the shift prompt carries a boundary
136
+ // block generated from the guardrails, so the model reads what the policy
137
+ // engine enforces rather than what the prose says.
138
+ describe("renderCapabilityBoundary", () => {
139
+ it("lists allowed, break-glass, and denies everything else (spec scenario)", () => {
140
+ const b = renderCapabilityBoundary({
141
+ allowed_capabilities: ["slack_dm", "report_bug"],
142
+ break_glass: ["email"],
143
+ });
144
+ expect(b).toContain("CAPABILITY BOUNDARY");
145
+ expect(b).toMatch(/MAY use: slack_dm, report_bug/);
146
+ expect(b).toMatch(/break-glass[^\n]*email/i);
147
+ expect(b).toMatch(/Everything else is DENIED/);
148
+ });
149
+ it("is honest that a break-glass entry outside the allowed list is denied", () => {
150
+ const b = renderCapabilityBoundary({ allowed_capabilities: ["slack_dm"], break_glass: ["email"] });
151
+ expect(b).toMatch(/break-glass but not in your allowed list, so they are denied outright: email/);
152
+ expect(b).not.toMatch(/require human approval[^\n]*email/i);
153
+ });
154
+ it("marks a break-glass entry inside the allowed list as approval-required", () => {
155
+ const b = renderCapabilityBoundary({
156
+ allowed_capabilities: ["gh-pr-read", "deploy-staging"],
157
+ break_glass: ["deploy-staging"],
158
+ });
159
+ expect(b).toMatch(/MAY use: gh-pr-read\b/);
160
+ expect(b).toMatch(/require human approval[^\n]*deploy-staging/i);
161
+ expect(b).not.toMatch(/deploy-staging[^\n]*denied/i);
162
+ });
163
+ it("renders a wildcard honestly — all capabilities, not a narrower set", () => {
164
+ const b = renderCapabilityBoundary({ allowed_capabilities: ["*"], break_glass: ["deploy-staging"] });
165
+ expect(b).toMatch(/MAY use: ALL capabilities/);
166
+ expect(b).not.toMatch(/Everything else is DENIED/);
167
+ expect(b).toMatch(/require human approval[^\n]*deploy-staging/i);
168
+ });
169
+ it("states an empty allow-list denies everything", () => {
170
+ const b = renderCapabilityBoundary({});
171
+ expect(b).toMatch(/MAY use: none/);
172
+ expect(b).toMatch(/every capability is DENIED/i);
173
+ });
174
+ it("accepts guardrails as a JSON string", () => {
175
+ expect(renderCapabilityBoundary('{"allowed_capabilities":["gh-pr-read"]}')).toMatch(/MAY use: gh-pr-read/);
176
+ });
177
+ it("fails closed on unreadable guardrails, as the policy engine does", () => {
178
+ expect(renderCapabilityBoundary("{not json")).toMatch(/could not be read[^\n]*DENIED/i);
179
+ expect(renderCapabilityBoundary(42)).toMatch(/could not be read/i);
180
+ });
181
+ it("is appended to the shift prompt after the standing rules", () => {
182
+ const c = ctx("junior");
183
+ c.charter.guardrails = { allowed_capabilities: ["gh-pr-read"], break_glass: [] };
184
+ const p = buildShiftPrompt(c, { kind: "task", taskId: "t1", task: "X" });
185
+ const rules = p.indexOf("STANDING RULES");
186
+ const block = p.indexOf("CAPABILITY BOUNDARY");
187
+ const trigger = p.indexOf("TRIGGER");
188
+ expect(rules).toBeGreaterThanOrEqual(0);
189
+ expect(block).toBeGreaterThan(rules);
190
+ expect(trigger).toBeGreaterThan(block);
191
+ expect(p).toMatch(/MAY use: gh-pr-read/);
192
+ });
193
+ it("is on message shifts too", () => {
194
+ const p = buildShiftPrompt(ctx("senior"), {
195
+ kind: "message", fromAgent: "a", subject: "s", body: "b", messageId: "m1",
196
+ });
197
+ expect(p).toContain("CAPABILITY BOUNDARY");
198
+ });
199
+ });
200
+ describe("MCP charter templates are structurally consistent", () => {
201
+ const templates = [
202
+ ["ENG_IC_CHARTER", ENG_IC_CHARTER.guardrails],
203
+ ...Object.entries(CHARTER_TEMPLATES).map(([k, v]) => [k, v.guardrails]),
204
+ ];
205
+ // Known findings awaiting the owner's decision — listed in the PR for
206
+ // add-charter-guardrail-consistency. Remove a name when its template is fixed.
207
+ const knownUnjustifiedWildcards = new Set(["ENG_IC_CHARTER", "Platform Ops", "Coordinator"]);
208
+ it.each(templates)("%s: break_glass ⊆ allowed_capabilities", (_name, g) => {
209
+ const allowed = g.allowed_capabilities ?? [];
210
+ if (allowed.includes("*"))
211
+ return;
212
+ for (const b of g.break_glass ?? [])
213
+ expect(allowed).toContain(b);
214
+ });
215
+ it.each(templates)("%s: a wildcard is justified or a known finding", (name, g) => {
216
+ const wildcard = (g.allowed_capabilities ?? []).includes("*");
217
+ if (!wildcard || (g.wildcard_justification ?? "").trim())
218
+ return;
219
+ expect(knownUnjustifiedWildcards.has(name)).toBe(true);
220
+ });
221
+ });
135
222
  //# sourceMappingURL=employee.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"employee.test.js","sourceRoot":"","sources":["../src/employee.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"employee.test.js","sourceRoot":"","sources":["../src/employee.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,iBAAiB,EACjB,wBAAwB,GAEzB,MAAM,eAAe,CAAC;AAEvB,0EAA0E;AAC1E,0EAA0E;AAC1E,4EAA4E;AAE5E,SAAS,GAAG,CAAC,IAAY;IACvB,OAAO;QACL,OAAO,EAAE,UAAU;QACnB,IAAI;QACJ,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,EAAE,EAAE,MAAM;YACV,SAAS,EAAE,gBAAgB;YAC3B,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,0BAA0B;YACnC,KAAK,EAAE,wBAAwB;YAC/B,UAAU,EAAE,EAAE,oBAAoB,EAAE,CAAC,GAAG,CAAC,EAAE;SAC5C;KACF,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,SAAmC,CAAC;IACxC,UAAU,CAAC,GAAG,EAAE;QACd,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,SAAS,CAAC,iBAAiB,CACzB,IAAI,QAAQ,CACV,IAAI,CAAC,SAAS,CAAC;YACb,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;YACzE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;SAC/E,CAAC,EACF,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CACF,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,kBAAkB,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtD,sBAAsB;QACtB,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACzD,MAAM,CAAE,IAAoB,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,sDAAsD,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAC3F,SAAS,CAAC,iBAAiB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,aAAa,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,SAAS,CAAC,iBAAiB,CACzB,IAAI,QAAQ,CACV,IAAI,CAAC,SAAS,CAAC;YACb,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;YACjD,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;SAClE,CAAC,EACF,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CACF,CAAC;QACF,MAAM,CAAC,MAAM,aAAa,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,SAAS,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,aAAa,CAAC,kBAAkB,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACjG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;QACvE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QACzD,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;YACnD,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YAChE,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YACjF,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACxC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;SACzF,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC5C,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACxC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG;SAC5E,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC1C,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,4EAA4E;AAC5E,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,GAAG,qBAAqB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAChC,4EAA4E;QAC5E,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,GAAG,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACtC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAC7E,0EAA0E;AAC1E,mDAAmD;AACnD,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,GAAG,wBAAwB,CAAC;YACjC,oBAAoB,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC;YAChD,WAAW,EAAE,CAAC,OAAO,CAAC;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QACnD,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC7C,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,GAAG,wBAAwB,CAAC,EAAE,oBAAoB,EAAE,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC;QAClG,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,GAAG,wBAAwB,CAAC;YACjC,oBAAoB,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC;YACtD,WAAW,EAAE,CAAC,gBAAgB,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAC3C,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACjE,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,CAAC,GAAG,wBAAwB,CAAC,EAAE,oBAAoB,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrG,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC/C,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QACnD,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,wBAAwB,CAAC,yCAAyC,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QACxF,MAAM,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE,oBAAoB,EAAE,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QACjF,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACxC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI;SAC1E,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAUH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,MAAM,SAAS,GAAwC;QACrD,CAAC,gBAAgB,EAAE,cAAc,CAAC,UAAgC,CAAC;QACnE,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,GAAG,CACtC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAgC,CAAC,CAClF;KACF,CAAC;IACF,sEAAsE;IACtE,+EAA+E;IAC/E,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IAE7F,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,wCAAwC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACxE,MAAM,OAAO,GAAG,CAAC,CAAC,oBAAoB,IAAI,EAAE,CAAC;QAC7C,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO;QAClC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE;YAAE,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,gDAAgD,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC/E,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAAE,OAAO;QACjE,MAAM,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ChatApi } from "./core.js";
2
+ export declare class GoshtiHttpError extends Error {
3
+ readonly status: number;
4
+ constructor(status: number, what: string);
5
+ }
6
+ type FetchLike = typeof fetch;
7
+ export declare function createApi(baseUrl: string, token: string, fetchImpl?: FetchLike): ChatApi;
8
+ export {};
9
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/goshtiChannel/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,WAAW,CAAC;AAGnD,qBAAa,eAAgB,SAAQ,KAAK;IAEtC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACvB,IAAI,EAAE,MAAM;CAIf;AAED,KAAK,SAAS,GAAG,OAAO,KAAK,CAAC;AAE9B,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,SAAiB,GAAG,OAAO,CAoD/F"}
@@ -0,0 +1,63 @@
1
+ // The chat server's REST API, called as the person with their own token
2
+ // (add-goshti-claude-connector §2.1). Only what the channel needs: who am I,
3
+ // who is this, read a thread, post a reply.
4
+ export class GoshtiHttpError extends Error {
5
+ status;
6
+ constructor(status, what) {
7
+ super(`${what}: HTTP ${status}`);
8
+ this.status = status;
9
+ }
10
+ }
11
+ export function createApi(baseUrl, token, fetchImpl = fetch) {
12
+ const base = baseUrl.replace(/\/+$/, "");
13
+ const call = async (what, path, init = {}) => {
14
+ const resp = await fetchImpl(`${base}/api/v4${path}`, {
15
+ ...init,
16
+ headers: {
17
+ Authorization: `Bearer ${token}`,
18
+ "Content-Type": "application/json",
19
+ "X-Requested-With": "XMLHttpRequest",
20
+ ...(init.headers ?? {}),
21
+ },
22
+ signal: AbortSignal.timeout(15_000),
23
+ });
24
+ if (!resp.ok)
25
+ throw new GoshtiHttpError(resp.status, what);
26
+ return resp.json();
27
+ };
28
+ const asUser = (u) => {
29
+ const o = (u ?? {});
30
+ return {
31
+ id: typeof o.id === "string" ? o.id : "",
32
+ username: typeof o.username === "string" ? o.username : "",
33
+ is_bot: o.is_bot === true,
34
+ };
35
+ };
36
+ return {
37
+ me: async () => asUser(await call("reading your account", "/users/me")),
38
+ user: async (id) => asUser(await call("reading a user", `/users/${encodeURIComponent(id)}`)),
39
+ thread: async (rootId) => {
40
+ const body = (await call("reading the thread", `/posts/${encodeURIComponent(rootId)}/thread`));
41
+ const out = [];
42
+ for (const p of Object.values(body.posts ?? {})) {
43
+ // System messages and deleted posts are not context.
44
+ if (typeof p.type === "string" && p.type !== "")
45
+ continue;
46
+ if (typeof p.delete_at === "number" && p.delete_at > 0)
47
+ continue;
48
+ out.push({
49
+ id: String(p.id ?? ""),
50
+ userId: String(p.user_id ?? ""),
51
+ message: String(p.message ?? ""),
52
+ createAt: typeof p.create_at === "number" ? p.create_at : 0,
53
+ });
54
+ }
55
+ return out;
56
+ },
57
+ createPost: async (p) => {
58
+ const body = (await call("posting the reply", "/posts", { method: "POST", body: JSON.stringify(p) }));
59
+ return { id: String(body.id ?? "") };
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/goshtiChannel/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { Allowlist } from "./policy.js";
2
+ /**
3
+ * The default trigger word (task 2.2). There is no `claude` account on the
4
+ * server, so the server renders it as plain text and notifies nobody; a real
5
+ * mention would need a placeholder account (design open question 2), which
6
+ * this does not create.
7
+ */
8
+ export declare const DEFAULT_TRIGGER = "@claude";
9
+ export interface ChannelConfig {
10
+ url: string;
11
+ trigger: string;
12
+ allow: Allowlist;
13
+ rate: {
14
+ max: number;
15
+ periodSeconds: number;
16
+ };
17
+ context: {
18
+ posts: number;
19
+ chars: number;
20
+ };
21
+ }
22
+ export type LoadResult = {
23
+ ok: true;
24
+ config: ChannelConfig;
25
+ } | {
26
+ ok: false;
27
+ problem: string;
28
+ };
29
+ /** The configuration directory: `GOSHTI_CHANNEL_HOME`, else `~/.goshti-channel`. */
30
+ export declare function configDir(): string;
31
+ /** Normalise and check a server address; null when it is not one. */
32
+ export declare function normaliseUrl(raw: string): string | null;
33
+ export declare function loadConfig(dir?: string): LoadResult;
34
+ /**
35
+ * Write the address and trigger word, keeping everything else in the file (the
36
+ * allowlist above all — setup must never widen or reset it).
37
+ */
38
+ export declare function saveConfig(dir: string, update: {
39
+ url: string;
40
+ trigger?: string;
41
+ }): string;
42
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/goshtiChannel/config.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,eAAe,YAAY,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9F,oFAAoF;AACpF,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAaD,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASvD;AASD,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAoB,GAAG,UAAU,CA4ChE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAsBzF"}
@@ -0,0 +1,129 @@
1
+ // The Goshti channel's local configuration (add-goshti-claude-connector §2.3).
2
+ //
3
+ // One file per person, `~/.goshti-channel/config.json`, holding the server
4
+ // address, the trigger word, the allowlist and the bounds. Never the
5
+ // credential: that is in the OS store or `credentials.json` beside this file
6
+ // (credential.ts), and a config file that carries one is refused, so the
7
+ // address can be copied around or committed without taking the token with it.
8
+ import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
9
+ import { homedir } from "node:os";
10
+ import { join } from "node:path";
11
+ /**
12
+ * The default trigger word (task 2.2). There is no `claude` account on the
13
+ * server, so the server renders it as plain text and notifies nobody; a real
14
+ * mention would need a placeholder account (design open question 2), which
15
+ * this does not create.
16
+ */
17
+ export const DEFAULT_TRIGGER = "@claude";
18
+ /** The configuration directory: `GOSHTI_CHANNEL_HOME`, else `~/.goshti-channel`. */
19
+ export function configDir() {
20
+ return process.env.GOSHTI_CHANNEL_HOME || join(homedir(), ".goshti-channel");
21
+ }
22
+ const CREDENTIAL_KEYS = ["token", "access_token", "personal_access_token", "password", "secret"];
23
+ function clamp(v, lo, hi, dflt) {
24
+ if (typeof v !== "number" || !Number.isFinite(v))
25
+ return dflt;
26
+ return Math.min(hi, Math.max(lo, Math.floor(v)));
27
+ }
28
+ function strings(v) {
29
+ return Array.isArray(v) ? v.filter((s) => typeof s === "string" && s.trim() !== "").map((s) => s.trim()) : [];
30
+ }
31
+ /** Normalise and check a server address; null when it is not one. */
32
+ export function normaliseUrl(raw) {
33
+ let u;
34
+ try {
35
+ u = new URL(raw.trim());
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ if (u.protocol !== "https:" && u.protocol !== "http:")
41
+ return null;
42
+ return `${u.origin}${u.pathname.replace(/\/+$/, "")}`;
43
+ }
44
+ function readRaw(dir) {
45
+ const file = join(dir, "config.json");
46
+ if (!existsSync(file))
47
+ return null;
48
+ const parsed = JSON.parse(readFileSync(file, "utf8"));
49
+ return parsed && typeof parsed === "object" ? parsed : {};
50
+ }
51
+ export function loadConfig(dir = configDir()) {
52
+ let raw;
53
+ try {
54
+ raw = readRaw(dir);
55
+ }
56
+ catch (e) {
57
+ return { ok: false, problem: `${join(dir, "config.json")} is not valid JSON (${e.message}).` };
58
+ }
59
+ if (!raw) {
60
+ return {
61
+ ok: false,
62
+ problem: `No Goshti channel configuration at ${join(dir, "config.json")}. Run \`goshti-channel setup --url <your Goshti address>\`.`,
63
+ };
64
+ }
65
+ const leaked = CREDENTIAL_KEYS.filter((k) => k in raw);
66
+ if (leaked.length > 0) {
67
+ return {
68
+ ok: false,
69
+ problem: `${join(dir, "config.json")} contains a credential (${leaked.join(", ")}). Remove it and run \`goshti-channel setup\`, which keeps the token in the OS credential store.`,
70
+ };
71
+ }
72
+ const url = typeof raw.url === "string" ? normaliseUrl(raw.url) : null;
73
+ if (!url) {
74
+ return { ok: false, problem: `${join(dir, "config.json")} has no valid http(s) "url".` };
75
+ }
76
+ const trigger = typeof raw.trigger === "string" && raw.trigger.trim() ? raw.trigger.trim() : DEFAULT_TRIGGER;
77
+ const allow = (raw.allow ?? {});
78
+ const rate = (raw.rate ?? {});
79
+ const context = (raw.context ?? {});
80
+ return {
81
+ ok: true,
82
+ config: {
83
+ url,
84
+ trigger,
85
+ allow: { users: strings(allow.users), channels: strings(allow.channels) },
86
+ rate: {
87
+ max: clamp(rate.max, 1, 100, 10),
88
+ periodSeconds: clamp(rate.period_seconds, 1, 3600, 60),
89
+ },
90
+ context: {
91
+ posts: clamp(context.posts, 0, 50, 10),
92
+ chars: clamp(context.chars, 0, 20_000, 4000),
93
+ },
94
+ },
95
+ };
96
+ }
97
+ /**
98
+ * Write the address and trigger word, keeping everything else in the file (the
99
+ * allowlist above all — setup must never widen or reset it).
100
+ */
101
+ export function saveConfig(dir, update) {
102
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
103
+ let existing = {};
104
+ try {
105
+ existing = readRaw(dir) ?? {};
106
+ }
107
+ catch {
108
+ existing = {};
109
+ }
110
+ for (const k of CREDENTIAL_KEYS)
111
+ delete existing[k];
112
+ const next = { ...existing, url: update.url };
113
+ if (update.trigger)
114
+ next.trigger = update.trigger;
115
+ if (!next.allow)
116
+ next.allow = { users: [], channels: [] };
117
+ const file = join(dir, "config.json");
118
+ const tmp = `${file}.tmp`;
119
+ writeFileSync(tmp, `${JSON.stringify(next, null, 2)}\n`, { mode: 0o600 });
120
+ renameSync(tmp, file);
121
+ try {
122
+ chmodSync(file, 0o600);
123
+ }
124
+ catch {
125
+ // Windows: the profile directory's ACL is what protects it.
126
+ }
127
+ return file;
128
+ }
129
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/goshtiChannel/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/goshtiChannel/config.test.ts"],"names":[],"mappings":""}