@xemahq/opencode-xema-plugin 0.2.0 → 0.4.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.
Files changed (87) hide show
  1. package/README.md +33 -40
  2. package/dist/.source-stamp.json +2 -2
  3. package/dist/context.d.ts +5 -15
  4. package/dist/context.d.ts.map +1 -1
  5. package/dist/context.js +4 -14
  6. package/dist/context.js.map +1 -1
  7. package/dist/hooks/compaction-invariants.d.ts +8 -0
  8. package/dist/hooks/compaction-invariants.d.ts.map +1 -0
  9. package/dist/hooks/compaction-invariants.js +60 -0
  10. package/dist/hooks/compaction-invariants.js.map +1 -0
  11. package/dist/hooks/root-turn-completion.d.ts +14 -0
  12. package/dist/hooks/root-turn-completion.d.ts.map +1 -0
  13. package/dist/hooks/root-turn-completion.js +84 -0
  14. package/dist/hooks/root-turn-completion.js.map +1 -0
  15. package/dist/hooks/shell-env-hygiene.d.ts +6 -0
  16. package/dist/hooks/shell-env-hygiene.d.ts.map +1 -0
  17. package/dist/hooks/shell-env-hygiene.js +10 -0
  18. package/dist/hooks/shell-env-hygiene.js.map +1 -0
  19. package/dist/hooks/subagent-fanout-ceiling.d.ts +18 -17
  20. package/dist/hooks/subagent-fanout-ceiling.d.ts.map +1 -1
  21. package/dist/hooks/subagent-fanout-ceiling.js +106 -92
  22. package/dist/hooks/subagent-fanout-ceiling.js.map +1 -1
  23. package/dist/hooks/system-overlay.d.ts +6 -0
  24. package/dist/hooks/system-overlay.d.ts.map +1 -0
  25. package/dist/hooks/system-overlay.js +40 -0
  26. package/dist/hooks/system-overlay.js.map +1 -0
  27. package/dist/hooks/tool-surface-observation.d.ts +14 -0
  28. package/dist/hooks/tool-surface-observation.d.ts.map +1 -0
  29. package/dist/hooks/tool-surface-observation.js +30 -0
  30. package/dist/hooks/tool-surface-observation.js.map +1 -0
  31. package/dist/hooks/workspace-listing.js +3 -3
  32. package/dist/hooks/workspace-listing.js.map +1 -1
  33. package/dist/index.d.ts +9 -6
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +9 -81
  36. package/dist/index.js.map +1 -1
  37. package/dist/plugin-id.d.ts +2 -0
  38. package/dist/plugin-id.d.ts.map +1 -0
  39. package/dist/plugin-id.js +2 -0
  40. package/dist/plugin-id.js.map +1 -0
  41. package/dist/plugin.d.ts +4 -0
  42. package/dist/plugin.d.ts.map +1 -0
  43. package/dist/plugin.js +86 -0
  44. package/dist/plugin.js.map +1 -0
  45. package/dist/runtime-events.d.ts +17 -0
  46. package/dist/runtime-events.d.ts.map +1 -0
  47. package/dist/runtime-events.js +39 -0
  48. package/dist/runtime-events.js.map +1 -0
  49. package/package.json +12 -17
  50. package/{plugin.mjs → plugin/xema-runtime-bridge/index.js} +7770 -2857
  51. package/plugin/xema-runtime-bridge/package.json +8 -0
  52. package/dist/hooks/session-idle-autocommit.d.ts +0 -11
  53. package/dist/hooks/session-idle-autocommit.d.ts.map +0 -1
  54. package/dist/hooks/session-idle-autocommit.js +0 -206
  55. package/dist/hooks/session-idle-autocommit.js.map +0 -1
  56. package/dist/hooks/system-prompt-overlay.d.ts +0 -3
  57. package/dist/hooks/system-prompt-overlay.d.ts.map +0 -1
  58. package/dist/hooks/system-prompt-overlay.js +0 -30
  59. package/dist/hooks/system-prompt-overlay.js.map +0 -1
  60. package/dist/opencode-types.d.ts +0 -69
  61. package/dist/opencode-types.d.ts.map +0 -1
  62. package/dist/opencode-types.js +0 -4
  63. package/dist/opencode-types.js.map +0 -1
  64. package/dist/plugin-entry.d.ts +0 -2
  65. package/dist/plugin-entry.d.ts.map +0 -1
  66. package/dist/plugin-entry.js +0 -2
  67. package/dist/plugin-entry.js.map +0 -1
  68. package/dist/session-state.d.ts +0 -20
  69. package/dist/session-state.d.ts.map +0 -1
  70. package/dist/session-state.js +0 -43
  71. package/dist/session-state.js.map +0 -1
  72. package/dist/tools/runtime.d.ts +0 -2
  73. package/dist/tools/runtime.d.ts.map +0 -1
  74. package/dist/tools/runtime.js +0 -2
  75. package/dist/tools/runtime.js.map +0 -1
  76. package/dist/tools/service-token.d.ts +0 -3
  77. package/dist/tools/service-token.d.ts.map +0 -1
  78. package/dist/tools/service-token.js +0 -31
  79. package/dist/tools/service-token.js.map +0 -1
  80. package/dist/tools/shared.d.ts +0 -3
  81. package/dist/tools/shared.d.ts.map +0 -1
  82. package/dist/tools/shared.js +0 -11
  83. package/dist/tools/shared.js.map +0 -1
  84. package/dist/tools/xema-memory.d.ts +0 -31
  85. package/dist/tools/xema-memory.d.ts.map +0 -1
  86. package/dist/tools/xema-memory.js +0 -157
  87. package/dist/tools/xema-memory.js.map +0 -1
@@ -1,8 +1,9 @@
1
- import { info, warn, debug } from '../logger.js';
2
- export const TASK_TOOL_ID = 'task';
1
+ import { debug, info, warn } from '../logger.js';
2
+ export const SUBAGENT_TOOL_ID = 'subagent';
3
3
  export const DEFAULT_SUBAGENT_FANOUT_LIMIT = 8;
4
4
  export const DEFAULT_FANOUT_WAIT_TIMEOUT_MS = 10 * 60 * 1000;
5
- export const DEFAULT_PERMIT_TTL_MS = 30 * 60 * 1000;
5
+ export const DEFAULT_ACTIVE_CHILD_TTL_MS = 30 * 60 * 1000;
6
+ export const DEFAULT_PENDING_SLOT_TTL_MS = 2 * 60 * 1000;
6
7
  export const FANOUT_LIMIT_ENV = 'XEMA_SUBAGENT_FANOUT_LIMIT';
7
8
  export function resolveSubagentFanoutLimit(env = process.env) {
8
9
  const declared = env[FANOUT_LIMIT_ENV];
@@ -12,7 +13,7 @@ export function resolveSubagentFanoutLimit(env = process.env) {
12
13
  const parsed = Number(declared.trim());
13
14
  if (!Number.isInteger(parsed)) {
14
15
  throw new Error(`${FANOUT_LIMIT_ENV}="${declared}" is not an integer. Expected a whole number of ` +
15
- `concurrently executing sub-agent tasks between 1 and ${DEFAULT_SUBAGENT_FANOUT_LIMIT}.`);
16
+ `concurrently running sub-agents between 1 and ${DEFAULT_SUBAGENT_FANOUT_LIMIT}.`);
16
17
  }
17
18
  if (parsed < 1) {
18
19
  throw new Error(`${FANOUT_LIMIT_ENV}="${declared}" is below 1. A ceiling of 0 would park EVERY delegation ` +
@@ -30,15 +31,17 @@ export function resolveSubagentFanoutLimit(env = process.env) {
30
31
  export function createSubagentFanoutCeiling(options) {
31
32
  const limit = options.limit;
32
33
  const waitTimeoutMs = options.waitTimeoutMs ?? DEFAULT_FANOUT_WAIT_TIMEOUT_MS;
33
- const permitTtlMs = options.permitTtlMs ?? DEFAULT_PERMIT_TTL_MS;
34
+ const pendingSlotTtlMs = options.pendingSlotTtlMs ?? DEFAULT_PENDING_SLOT_TTL_MS;
35
+ const activeChildTtlMs = options.activeChildTtlMs ?? DEFAULT_ACTIVE_CHILD_TTL_MS;
34
36
  const now = options.now ?? (() => Date.now());
35
- const held = new Map();
37
+ const pending = [];
38
+ const active = new Map();
36
39
  const waiters = [];
40
+ const armed = new Set();
37
41
  let waitedCount = 0;
38
42
  let timedOutCount = 0;
39
- let sweptCount = 0;
40
- let ttlReclaimedCount = 0;
41
- const armed = new Set();
43
+ let pendingTtlReclaimedCount = 0;
44
+ let activeTtlReclaimedCount = 0;
42
45
  function arm(fn, ms, keepProcessAlive) {
43
46
  const timer = setTimeout(() => {
44
47
  armed.delete(timer);
@@ -55,132 +58,143 @@ export function createSubagentFanoutCeiling(options) {
55
58
  clearTimeout(timer);
56
59
  armed.delete(timer);
57
60
  }
58
- function take(callId, sessionId) {
59
- const ttlTimer = arm(() => {
60
- if (!held.has(callId))
61
+ const occupied = () => pending.length + active.size;
62
+ function reserve(callId, parentSessionId) {
63
+ const slot = { callId, parentSessionId, since: now(), timer: undefined };
64
+ slot.timer = arm(() => {
65
+ const index = pending.indexOf(slot);
66
+ if (index === -1)
67
+ return;
68
+ pending.splice(index, 1);
69
+ pendingTtlReclaimedCount += 1;
70
+ warn(`fanout-ceiling: reserved slot for call=${callId} session=${parentSessionId} never ` +
71
+ `became a child session within ${pendingSlotTtlMs}ms — reclaiming (its ` +
72
+ `execute.after was lost; V2 does not guarantee it on abort).`);
73
+ drain();
74
+ }, pendingSlotTtlMs, false);
75
+ pending.push(slot);
76
+ }
77
+ function activate(childSessionId, parentSessionId) {
78
+ const timer = arm(() => {
79
+ if (!active.has(childSessionId))
61
80
  return;
62
- ttlReclaimedCount += 1;
63
- warn(`fanout-ceiling: permit TTL expired for call=${callId} session=${sessionId} after ` +
64
- `${permitTtlMs}ms — force-releasing. A task held a slot longer than any healthy ` +
65
- `sub-agent turn; the pool would otherwise have shrunk permanently.`);
66
- release(callId, 'ttl');
67
- }, permitTtlMs, false);
68
- held.set(callId, { sessionId, acquiredAt: now(), ttlTimer });
81
+ activeTtlReclaimedCount += 1;
82
+ warn(`fanout-ceiling: child session=${childSessionId} held a slot for ${activeChildTtlMs}ms ` +
83
+ `with no terminal event — force-releasing so the pool cannot shrink permanently.`);
84
+ releaseActive(childSessionId, 'active-ttl');
85
+ }, activeChildTtlMs, false);
86
+ active.set(childSessionId, { childSessionId, parentSessionId, since: now(), timer });
69
87
  }
70
- function release(callId, reason) {
71
- const permit = held.get(callId);
72
- if (permit === undefined)
88
+ function releaseActive(childSessionId, reason) {
89
+ const child = active.get(childSessionId);
90
+ if (child === undefined)
73
91
  return;
74
- disarm(permit.ttlTimer);
75
- held.delete(callId);
76
- if (reason !== 'completed') {
77
- debug(`fanout-ceiling: reclaimed call=${callId} via ${reason} ` +
78
- `(held ${now() - permit.acquiredAt}ms)`);
79
- }
92
+ disarm(child.timer);
93
+ active.delete(childSessionId);
94
+ debug(`fanout-ceiling: released child=${childSessionId} via ${reason} ` +
95
+ `(held ${now() - child.since}ms, occupied=${occupied()}/${limit})`);
80
96
  drain();
81
97
  }
82
98
  function drain() {
83
- while (waiters.length > 0 && held.size < limit) {
99
+ while (waiters.length > 0 && occupied() < limit) {
84
100
  const next = waiters.shift();
85
101
  if (next === undefined)
86
102
  return;
87
103
  disarm(next.timer);
88
- const waitedMs = now() - next.since;
89
104
  waitedCount += 1;
90
- take(next.callId, next.sessionId);
91
- info(`fanout-ceiling: admitted call=${next.callId} session=${next.sessionId} after waiting ` +
92
- `${waitedMs}ms (limit=${limit}, in-flight=${held.size}, still waiting=${waiters.length})`);
105
+ reserve(next.callId, next.parentSessionId);
106
+ info(`fanout-ceiling: admitted call=${next.callId} session=${next.parentSessionId} after ` +
107
+ `waiting ${now() - next.since}ms (limit=${limit}, occupied=${occupied()}, ` +
108
+ `still waiting=${waiters.length})`);
93
109
  next.grant();
94
110
  }
95
111
  }
96
- async function before(input) {
97
- if (input.tool !== TASK_TOOL_ID)
112
+ async function beforeToolCall(input) {
113
+ if (input.tool !== SUBAGENT_TOOL_ID)
98
114
  return;
99
- const { callID: callId, sessionID: sessionId } = input;
100
- if (held.size < limit) {
101
- take(callId, sessionId);
102
- debug(`fanout-ceiling: admitted call=${callId} immediately ` +
103
- `(in-flight=${held.size}/${limit})`);
115
+ const { id: callId, sessionID: parentSessionId } = input;
116
+ if (occupied() < limit) {
117
+ reserve(callId, parentSessionId);
104
118
  return;
105
119
  }
106
120
  const since = now();
107
- warn(`fanout-ceiling: sub-agent fan-out at ceiling — call=${callId} session=${sessionId} is ` +
108
- `WAITING (limit=${limit}, in-flight=${held.size}, already waiting=${waiters.length}). ` +
109
- `This is backpressure, not a refusal: the task will start when a slot frees.`);
121
+ warn(`fanout-ceiling: sub-agent fan-out at ceiling — call=${callId} session=${parentSessionId} ` +
122
+ `is WAITING (limit=${limit}, pending=${pending.length}, active=${active.size}, ` +
123
+ `already waiting=${waiters.length}). Backpressure, not a refusal.`);
110
124
  await new Promise((resolve) => {
111
- const waiter = {
112
- callId,
113
- sessionId,
114
- since,
115
- grant: resolve,
116
- timer: undefined,
117
- };
125
+ const waiter = { callId, parentSessionId, since, grant: resolve, timer: undefined };
118
126
  waiter.timer = arm(() => {
119
- const idx = waiters.indexOf(waiter);
120
- if (idx === -1)
127
+ const index = waiters.indexOf(waiter);
128
+ if (index === -1)
121
129
  return;
122
- waiters.splice(idx, 1);
130
+ waiters.splice(index, 1);
123
131
  timedOutCount += 1;
124
- warn(`fanout-ceiling: call=${callId} session=${sessionId} waited ${waitTimeoutMs}ms and is ` +
125
- `being ADMITTED OVER the ceiling (limit=${limit}, in-flight=${held.size}). The pool ` +
126
- `did not free a slot in that window — suspect a leaked permit or a stuck sub-agent.`);
127
- take(callId, sessionId);
132
+ warn(`fanout-ceiling: call=${callId} session=${parentSessionId} waited ${waitTimeoutMs}ms ` +
133
+ `and is ADMITTED OVER the ceiling (limit=${limit}, occupied=${occupied()}). ` +
134
+ `Suspect a leaked slot or a stuck sub-agent.`);
135
+ reserve(callId, parentSessionId);
128
136
  resolve();
129
137
  }, waitTimeoutMs, true);
130
138
  waiters.push(waiter);
131
139
  });
132
140
  }
133
- function after(input) {
134
- if (input.tool !== TASK_TOOL_ID)
141
+ function afterToolCall(input) {
142
+ if (input.tool !== SUBAGENT_TOOL_ID)
143
+ return;
144
+ const index = pending.findIndex((slot) => slot.callId === input.id);
145
+ if (index === -1)
135
146
  return;
136
- release(input.callID, 'completed');
147
+ const [slot] = pending.splice(index, 1);
148
+ disarm(slot?.timer);
149
+ debug(`fanout-ceiling: call=${input.id} ended before any child existed — slot released`);
150
+ drain();
137
151
  }
138
- function onSessionIdle(sessionId) {
139
- const stale = [];
140
- for (const [callId, permit] of held) {
141
- if (permit.sessionId === sessionId)
142
- stale.push(callId);
143
- }
144
- if (stale.length === 0)
152
+ function onSessionCreated(sessionId, parentId) {
153
+ if (parentId === undefined || active.has(sessionId))
145
154
  return;
146
- sweptCount += stale.length;
147
- warn(`fanout-ceiling: session=${sessionId} went idle still holding ${stale.length} permit(s) ` +
148
- `[${stale.join(', ')}] — reclaiming. These tasks ended without a tool.execute.after, ` +
149
- `which upstream does not fire on the failure path.`);
150
- for (const callId of stale)
151
- release(callId, 'session-idle');
155
+ const index = pending.findIndex((slot) => slot.parentSessionId === parentId);
156
+ if (index === -1) {
157
+ debug(`fanout-ceiling: unreserved child=${sessionId} of parent=${parentId} — counted`);
158
+ }
159
+ else {
160
+ const [slot] = pending.splice(index, 1);
161
+ disarm(slot?.timer);
162
+ }
163
+ activate(sessionId, parentId);
164
+ }
165
+ function onSessionTerminal(sessionId) {
166
+ releaseActive(sessionId, 'terminal');
152
167
  }
153
168
  function dispose() {
154
- const parked = waiters.length;
155
- const outstanding = held.size;
156
169
  while (waiters.length > 0) {
157
- const w = waiters.shift();
158
- if (w === undefined)
170
+ const waiter = waiters.shift();
171
+ if (waiter === undefined)
159
172
  break;
160
- disarm(w.timer);
161
- w.grant();
162
- }
163
- for (const permit of held.values())
164
- disarm(permit.ttlTimer);
165
- held.clear();
166
- if (parked > 0 || outstanding > 0) {
167
- info(`fanout-ceiling: disposed — released ${parked} parked task(s) and disarmed ` +
168
- `${outstanding} permit timer(s).`);
173
+ disarm(waiter.timer);
174
+ waiter.grant();
169
175
  }
176
+ for (const slot of pending)
177
+ disarm(slot.timer);
178
+ pending.length = 0;
179
+ for (const child of active.values())
180
+ disarm(child.timer);
181
+ active.clear();
170
182
  }
171
183
  return {
172
- before,
173
- after,
174
- onSessionIdle,
184
+ beforeToolCall,
185
+ afterToolCall,
186
+ onSessionCreated,
187
+ onSessionTerminal,
175
188
  dispose,
176
189
  stats: () => ({
177
190
  limit,
178
- inFlight: held.size,
191
+ pending: pending.length,
192
+ active: active.size,
179
193
  waiting: waiters.length,
180
194
  waitedCount,
181
195
  timedOutCount,
182
- sweptCount,
183
- ttlReclaimedCount,
196
+ pendingTtlReclaimedCount,
197
+ activeTtlReclaimedCount,
184
198
  armedTimers: armed.size,
185
199
  }),
186
200
  };
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-fanout-ceiling.js","sourceRoot":"","sources":["../../src/hooks/subagent-fanout-ceiling.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent-fanout-ceiling.js","sourceRoot":"","sources":["../../src/hooks/subagent-fanout-ceiling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SessionContext } from '@opencode/plugin/promise/session';
2
+ export type OverlaySystemPart = SessionContext['system'][number];
3
+ export type OverlayContextInput = Pick<SessionContext, 'sessionID' | 'system'>;
4
+ export declare const XEMA_OVERLAY_METADATA_KEY = "xema.system-overlay";
5
+ export declare function buildSystemOverlayHook(directory: string): (input: OverlayContextInput) => void;
6
+ //# sourceMappingURL=system-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-overlay.d.ts","sourceRoot":"","sources":["../../src/hooks/system-overlay.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAQvE,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAGjE,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC;AAM/E,eAAO,MAAM,yBAAyB,wBAAwB,CAAC;AAoC/D,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,IAC9C,OAAO,mBAAmB,KAAG,IAAI,CAmC1C"}
@@ -0,0 +1,40 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { readInvocationContextForHook } from '../context.js';
4
+ import { XemaSystemOverlayMissingError } from '../errors.js';
5
+ import { debug } from '../logger.js';
6
+ import { renderWorkspaceListing } from './workspace-listing.js';
7
+ export const XEMA_OVERLAY_METADATA_KEY = 'xema.system-overlay';
8
+ export function buildSystemOverlayHook(directory) {
9
+ return (input) => {
10
+ const ctx = readInvocationContextForHook(directory, 'session.context');
11
+ if (!ctx) {
12
+ return;
13
+ }
14
+ const overlayPath = join(directory, '.xema', 'system-overlay.md');
15
+ if (!existsSync(overlayPath)) {
16
+ throw new XemaSystemOverlayMissingError(`Xema session ${ctx.invocation.runId ?? 'unknown'} (role=${ctx.invocation.role}, ` +
17
+ `sessionId=${ctx.invocation.sessionId ?? '-'}) is missing /workspace/.xema/system-overlay.md. ` +
18
+ `The platform contract is undefined; refusing the model request. ` +
19
+ `Verify the agent-run-context render flow emitted the system-overlay slot.`);
20
+ }
21
+ const bytes = readFileSync(overlayPath, 'utf8');
22
+ const listing = renderWorkspaceListing(directory);
23
+ const part = {
24
+ type: 'text',
25
+ text: `${bytes}\n\n${listing}`,
26
+ metadata: { [XEMA_OVERLAY_METADATA_KEY]: true },
27
+ };
28
+ const existing = input.system.findIndex((entry) => entry.metadata?.[XEMA_OVERLAY_METADATA_KEY] === true);
29
+ if (existing === -1) {
30
+ input.system.push(part);
31
+ }
32
+ else {
33
+ input.system[existing] = part;
34
+ }
35
+ debug(`session.context: ${existing === -1 ? 'appended' : 'replaced'} overlay part ` +
36
+ `(${bytes.length} overlay + ${listing.length} listing bytes, role=${ctx.invocation.role}, ` +
37
+ `opencodeSession=${input.sessionID})`);
38
+ };
39
+ }
40
+ //# sourceMappingURL=system-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-overlay.js","sourceRoot":"","sources":["../../src/hooks/system-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAYhE,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAC;AAoC/D,MAAM,UAAU,sBAAsB,CAAC,SAAiB;IACtD,OAAO,CAAC,KAA0B,EAAQ,EAAE;QAC1C,MAAM,GAAG,GAAG,4BAA4B,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAClE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,6BAA6B,CACrC,gBAAgB,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,SAAS,UAAU,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI;gBAChF,aAAa,GAAG,CAAC,UAAU,CAAC,SAAS,IAAI,GAAG,mDAAmD;gBAC/F,kEAAkE;gBAClE,2EAA2E,CAC9E,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,IAAI,GAAsB;YAC9B,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,GAAG,KAAK,OAAO,OAAO,EAAE;YAC9B,QAAQ,EAAE,EAAE,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE;SAChD,CAAC;QACF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CACrC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,yBAAyB,CAAC,KAAK,IAAI,CAChE,CAAC;QACF,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,KAAK,CACH,oBAAoB,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,gBAAgB;YAC3E,IAAI,KAAK,CAAC,MAAM,cAAc,OAAO,CAAC,MAAM,wBAAwB,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI;YAC3F,mBAAmB,KAAK,CAAC,SAAS,GAAG,CACxC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const TOOL_SURFACE_FILE = "opencode-tool-surface.json";
2
+ export declare const DEFAULT_RUNTIME_STATE_DIR = "/run/xema/runtime";
3
+ export declare const RUNTIME_STATE_DIR_ENV = "XEMA_RUNTIME_STATE_DIR";
4
+ export interface ToolSurfaceDocument {
5
+ readonly observedAt: number;
6
+ readonly tools: readonly string[];
7
+ }
8
+ export declare function resolveRuntimeStateDir(env?: Readonly<Record<string, string | undefined>>): string;
9
+ export declare function observeToolSurface(options: {
10
+ readonly listToolIds: () => Promise<readonly string[]>;
11
+ readonly stateDir: string;
12
+ readonly now?: () => number;
13
+ }): Promise<ToolSurfaceDocument | undefined>;
14
+ //# sourceMappingURL=tool-surface-observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-surface-observation.d.ts","sourceRoot":"","sources":["../../src/hooks/tool-surface-observation.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAC9D,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAC7D,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAE9D,MAAM,WAAW,mBAAmB;IAElC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAe,GAC9D,MAAM,CAGR;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,QAAQ,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAmB3C"}
@@ -0,0 +1,30 @@
1
+ import { mkdirSync, renameSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { debug, warn } from '../logger.js';
4
+ export const TOOL_SURFACE_FILE = 'opencode-tool-surface.json';
5
+ export const DEFAULT_RUNTIME_STATE_DIR = '/run/xema/runtime';
6
+ export const RUNTIME_STATE_DIR_ENV = 'XEMA_RUNTIME_STATE_DIR';
7
+ export function resolveRuntimeStateDir(env = process.env) {
8
+ const declared = env[RUNTIME_STATE_DIR_ENV];
9
+ return declared !== undefined && declared.trim() !== '' ? declared : DEFAULT_RUNTIME_STATE_DIR;
10
+ }
11
+ export async function observeToolSurface(options) {
12
+ try {
13
+ const observedAt = (options.now ?? Date.now)();
14
+ const ids = [...(await options.listToolIds())].sort();
15
+ const doc = { observedAt, tools: ids };
16
+ mkdirSync(options.stateDir, { recursive: true });
17
+ const target = join(options.stateDir, TOOL_SURFACE_FILE);
18
+ const temp = `${target}.${process.pid}.tmp`;
19
+ writeFileSync(temp, `${JSON.stringify(doc)}\n`, 'utf8');
20
+ renameSync(temp, target);
21
+ debug(`tool-surface: observed ${ids.length} tool(s) → ${target}`);
22
+ return doc;
23
+ }
24
+ catch (err) {
25
+ warn(`tool-surface: observation failed (observation only — no authority is affected): ` +
26
+ (err instanceof Error ? err.message : String(err)));
27
+ return undefined;
28
+ }
29
+ }
30
+ //# sourceMappingURL=tool-surface-observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-surface-observation.js","sourceRoot":"","sources":["../../src/hooks/tool-surface-observation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAiB3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAC9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,mBAAmB,CAAC;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAQ9D,MAAM,UAAU,sBAAsB,CACpC,MAAoD,OAAO,CAAC,GAAG;IAE/D,MAAM,QAAQ,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC5C,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC;AACjG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAIxC;IACC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,GAAG,GAAwB,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC5D,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QAC5C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxD,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzB,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,cAAc,MAAM,EAAE,CAAC,CAAC;QAClE,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CACF,kFAAkF;YAChF,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACrD,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -19,7 +19,7 @@ export function renderWorkspaceListing(workspaceRoot) {
19
19
  const lines = [
20
20
  '## Current workspace contents (depth 1)',
21
21
  '',
22
- 'This is a snapshot of `/workspace/` taken at the start of this turn. Use it to orient before reaching for `glob`, `list`, or `read`. Hidden: platform-private slots (`.xema/`, `.opencode/`).',
22
+ 'This is a snapshot of `/workspace/` taken at the start of this turn. Use it to orient before reaching for `glob` or `read`. Hidden: platform-private slots (`.xema/`, `.opencode/`).',
23
23
  '',
24
24
  ];
25
25
  let topLevel;
@@ -48,7 +48,7 @@ function renderTopLevelEntry(workspaceRoot, entry) {
48
48
  }
49
49
  if (SKIP_CHILD_EXPANSION_TOP_LEVEL.has(entry.name)) {
50
50
  return [
51
- `- \`/workspace/${relPath}/\` _(children omitted: known implicit/noisy directory — use \`glob\`/\`list\` if needed)_`,
51
+ `- \`/workspace/${relPath}/\` _(children omitted: known implicit/noisy directory — use \`glob\` if needed)_`,
52
52
  ];
53
53
  }
54
54
  let children;
@@ -68,7 +68,7 @@ function renderTopLevelEntry(workspaceRoot, entry) {
68
68
  });
69
69
  const overflow = children.length - shown.length;
70
70
  const overflowLine = overflow > 0
71
- ? [` - _(${overflow} more entr${overflow === 1 ? 'y' : 'ies'} — use \`glob\`/\`list\` to enumerate)_`]
71
+ ? [` - _(${overflow} more entr${overflow === 1 ? 'y' : 'ies'} — use \`glob\` to enumerate)_`]
72
72
  : [];
73
73
  return [`- \`/workspace/${relPath}/\``, ...childLines, ...overflowLine];
74
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-listing.js","sourceRoot":"","sources":["../../src/hooks/workspace-listing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-listing.js","sourceRoot":"","sources":["../../src/hooks/workspace-listing.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,13 @@
1
- import type { Plugin } from './opencode-types.js';
2
- export declare const XemaPlugin: Plugin;
3
- export declare function __resetBootCacheForTests(): void;
4
- export default XemaPlugin;
5
- export { createSubagentFanoutCeiling, resolveSubagentFanoutLimit, DEFAULT_SUBAGENT_FANOUT_LIMIT, DEFAULT_FANOUT_WAIT_TIMEOUT_MS, DEFAULT_PERMIT_TTL_MS, FANOUT_LIMIT_ENV, TASK_TOOL_ID, type SubagentFanoutCeiling, type FanoutCeilingOptions, type FanoutCeilingStats, } from './hooks/subagent-fanout-ceiling.js';
1
+ export { default } from './plugin.js';
2
+ export { XEMA_RUNTIME_BRIDGE_PLUGIN_ID } from './plugin-id.js';
3
+ export { createSubagentFanoutCeiling, resolveSubagentFanoutLimit, DEFAULT_SUBAGENT_FANOUT_LIMIT, DEFAULT_FANOUT_WAIT_TIMEOUT_MS, DEFAULT_ACTIVE_CHILD_TTL_MS, DEFAULT_PENDING_SLOT_TTL_MS, FANOUT_LIMIT_ENV, SUBAGENT_TOOL_ID, type SubagentFanoutCeiling, type FanoutCeilingOptions, type FanoutCeilingStats, } from './hooks/subagent-fanout-ceiling.js';
4
+ export { buildSystemOverlayHook, XEMA_OVERLAY_METADATA_KEY, } from './hooks/system-overlay.js';
5
+ export { buildCompactionInvariantsHook, renderCompactionInvariants, MAX_COMPACTION_INVARIANTS_CHARS, XEMA_COMPACTION_METADATA_KEY, } from './hooks/compaction-invariants.js';
6
+ export { createRootTurnCompletion, TURN_COMPLETED_PATH, WORKSPACE_PROXY_URL_ENV, SERVER_PASSWORD_ENV, } from './hooks/root-turn-completion.js';
7
+ export { observeToolSurface, resolveRuntimeStateDir, TOOL_SURFACE_FILE, DEFAULT_RUNTIME_STATE_DIR, RUNTIME_STATE_DIR_ENV, type ToolSurfaceDocument, } from './hooks/tool-surface-observation.js';
8
+ export { scrubShellEnv, SERVER_PASSWORD_ENV_KEYS } from './hooks/shell-env-hygiene.js';
9
+ export { parseRuntimeSessionEvent, SessionExecutionOutcome } from './runtime-events.js';
6
10
  export { readInvocationContext } from './context.js';
7
11
  export type { InvocationContext, InvocationRole } from './context.js';
8
12
  export * from './errors.js';
9
- export { loadSessionState, loadSessionStateForTool, ensureRoleAllowed, ContextMissingError, RoleNotAllowedError, type SessionState, } from './session-state.js';
10
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkEA,OAAO,KAAK,EAIV,MAAM,EAEP,MAAM,qBAAqB,CAAC;AAuB7B,eAAO,MAAM,UAAU,EAAE,MAgBxB,CAAC;AAgFF,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAyBD,eAAe,UAAU,CAAC;AAG1B,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,EAC9B,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACtE,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,EAC9B,2BAA2B,EAC3B,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACxB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACtE,cAAc,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,84 +1,12 @@
1
- import { existsSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { buildSessionIdleAutocommit } from './hooks/session-idle-autocommit.js';
4
- import { createSubagentFanoutCeiling, resolveSubagentFanoutLimit, } from './hooks/subagent-fanout-ceiling.js';
5
- import { buildSystemPromptOverlay } from './hooks/system-prompt-overlay.js';
6
- import { info, isDebug, warn } from './logger.js';
7
- import { buildXemaMemoryGetTool, buildXemaMemorySetTool, } from './tools/xema-memory.js';
8
- const bootCache = new Map();
9
- export const XemaPlugin = async (ctx) => {
10
- const { directory } = ctx;
11
- const cached = bootCache.get(directory);
12
- if (cached !== undefined) {
13
- return cached;
14
- }
15
- const booting = doBoot(directory);
16
- bootCache.set(directory, booting);
17
- try {
18
- return await booting;
19
- }
20
- catch (err) {
21
- bootCache.delete(directory);
22
- throw err;
23
- }
24
- };
25
- async function doBoot(directory) {
26
- const tools = buildAllTools(directory);
27
- const toolNames = Object.keys(tools).sort((a, b) => a.localeCompare(b));
28
- const contextPath = join(directory, 'context.json');
29
- const contextPresentAtBoot = existsSync(contextPath);
30
- info(`boot: directory=${directory} tools=${toolNames.length} [${toolNames.join(', ')}] ` +
31
- `context.json=${contextPresentAtBoot ? 'present' : 'absent'} ` +
32
- `debug=${isDebug() ? 'on' : 'off'}`);
33
- const fanoutLimit = resolveSubagentFanoutLimit();
34
- const fanout = createSubagentFanoutCeiling({ limit: fanoutLimit });
35
- const autocommit = buildSessionIdleAutocommit(directory);
36
- info(`boot: subagent fan-out ceiling active (limit=${fanoutLimit} concurrent task calls ` +
37
- `per worker; tighten with XEMA_SUBAGENT_FANOUT_LIMIT)`);
38
- const hooks = {
39
- tool: tools,
40
- 'experimental.chat.system.transform': buildSystemPromptOverlay(directory),
41
- 'tool.execute.before': async (input) => {
42
- await fanout.before(input);
43
- },
44
- 'tool.execute.after': (input) => {
45
- fanout.after(input);
46
- },
47
- dispose: async () => {
48
- fanout.dispose();
49
- },
50
- event: async (input) => {
51
- const evt = input.event;
52
- if (evt.type === 'session.idle') {
53
- const sessionId = evt.properties
54
- ?.sessionID;
55
- if (sessionId) {
56
- try {
57
- fanout.onSessionIdle(sessionId);
58
- }
59
- catch (err) {
60
- const message = err instanceof Error ? err.message : String(err);
61
- warn(`fanout-ceiling: session-idle sweep failed: ${message}`);
62
- }
63
- }
64
- }
65
- await autocommit(input);
66
- },
67
- };
68
- return hooks;
69
- }
70
- export function __resetBootCacheForTests() {
71
- bootCache.clear();
72
- }
73
- function buildAllTools(workspaceDir) {
74
- return {
75
- xema_memory_set: buildXemaMemorySetTool(workspaceDir),
76
- xema_memory_get: buildXemaMemoryGetTool(workspaceDir),
77
- };
78
- }
79
- export default XemaPlugin;
80
- export { createSubagentFanoutCeiling, resolveSubagentFanoutLimit, DEFAULT_SUBAGENT_FANOUT_LIMIT, DEFAULT_FANOUT_WAIT_TIMEOUT_MS, DEFAULT_PERMIT_TTL_MS, FANOUT_LIMIT_ENV, TASK_TOOL_ID, } from './hooks/subagent-fanout-ceiling.js';
1
+ export { default } from './plugin.js';
2
+ export { XEMA_RUNTIME_BRIDGE_PLUGIN_ID } from './plugin-id.js';
3
+ export { createSubagentFanoutCeiling, resolveSubagentFanoutLimit, DEFAULT_SUBAGENT_FANOUT_LIMIT, DEFAULT_FANOUT_WAIT_TIMEOUT_MS, DEFAULT_ACTIVE_CHILD_TTL_MS, DEFAULT_PENDING_SLOT_TTL_MS, FANOUT_LIMIT_ENV, SUBAGENT_TOOL_ID, } from './hooks/subagent-fanout-ceiling.js';
4
+ export { buildSystemOverlayHook, XEMA_OVERLAY_METADATA_KEY, } from './hooks/system-overlay.js';
5
+ export { buildCompactionInvariantsHook, renderCompactionInvariants, MAX_COMPACTION_INVARIANTS_CHARS, XEMA_COMPACTION_METADATA_KEY, } from './hooks/compaction-invariants.js';
6
+ export { createRootTurnCompletion, TURN_COMPLETED_PATH, WORKSPACE_PROXY_URL_ENV, SERVER_PASSWORD_ENV, } from './hooks/root-turn-completion.js';
7
+ export { observeToolSurface, resolveRuntimeStateDir, TOOL_SURFACE_FILE, DEFAULT_RUNTIME_STATE_DIR, RUNTIME_STATE_DIR_ENV, } from './hooks/tool-surface-observation.js';
8
+ export { scrubShellEnv, SERVER_PASSWORD_ENV_KEYS } from './hooks/shell-env-hygiene.js';
9
+ export { parseRuntimeSessionEvent, SessionExecutionOutcome } from './runtime-events.js';
81
10
  export { readInvocationContext } from './context.js';
82
11
  export * from './errors.js';
83
- export { loadSessionState, loadSessionStateForTool, ensureRoleAllowed, ContextMissingError, RoleNotAllowedError, } from './session-state.js';
84
12
  //# sourceMappingURL=index.js.map