@xemahq/opencode-xema-plugin 0.3.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 (67) hide show
  1. package/README.md +33 -40
  2. package/dist/.source-stamp.json +2 -2
  3. package/dist/context.d.ts +5 -14
  4. package/dist/context.d.ts.map +1 -1
  5. package/dist/context.js +4 -13
  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 -5
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +9 -70
  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 -16
  50. package/{plugin.mjs → plugin/xema-runtime-bridge/index.js} +407 -415
  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 -49
  61. package/dist/opencode-types.d.ts.map +0 -1
  62. package/dist/opencode-types.js +0 -2
  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
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "xema-runtime-bridge",
3
+ "version": "0.4.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "index.js",
7
+ "description": "Bundled from @xemahq/opencode-xema-plugin@0.4.0. Do not edit."
8
+ }
@@ -1,11 +0,0 @@
1
- import type { OpencodeEvent } from '../opencode-types.js';
2
- export declare function readConflictFlag(sessionId: string): {
3
- at: number;
4
- turn: number;
5
- } | undefined;
6
- export declare function clearConflictFlag(sessionId: string): void;
7
- export declare function __resetSessionIdleAutocommitStateForTests(): void;
8
- export declare function buildSessionIdleAutocommit(workspaceDir: string): (input: {
9
- event: OpencodeEvent;
10
- }) => Promise<void>;
11
- //# sourceMappingURL=session-idle-autocommit.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-idle-autocommit.d.ts","sourceRoot":"","sources":["../../src/hooks/session-idle-autocommit.ts"],"names":[],"mappings":"AAiEA,OAAO,KAAK,EAAE,aAAa,EAA4B,MAAM,sBAAsB,CAAC;AAoCpF,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,GAChB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAE1C;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEzD;AAcD,wBAAgB,yCAAyC,IAAI,IAAI,CAGhE;AAOD,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,MAAM,GACnB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,aAAa,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAiBpD"}
@@ -1,206 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { existsSync, readFileSync } from 'node:fs';
3
- import { join } from 'node:path';
4
- import { promisify } from 'node:util';
5
- import { readInvocationContextForHook } from '../context.js';
6
- import { warn, info, debug } from '../logger.js';
7
- const HOOK_NAME = 'session.idle';
8
- const DEFAULT_JWT_PATH = '/run/xema/actor.jwt';
9
- const PUSH_RETRY_DELAY_MS = 5_000;
10
- const execFileAsync = promisify(execFile);
11
- const conflictFlagBySessionId = new Map();
12
- export function readConflictFlag(sessionId) {
13
- return conflictFlagBySessionId.get(sessionId);
14
- }
15
- export function clearConflictFlag(sessionId) {
16
- conflictFlagBySessionId.delete(sessionId);
17
- }
18
- const turnCounterBySessionId = new Map();
19
- export function __resetSessionIdleAutocommitStateForTests() {
20
- conflictFlagBySessionId.clear();
21
- turnCounterBySessionId.clear();
22
- }
23
- export function buildSessionIdleAutocommit(workspaceDir) {
24
- return async (input) => {
25
- const evt = input.event;
26
- if (evt.type !== 'session.idle') {
27
- return;
28
- }
29
- const idleEvent = evt;
30
- try {
31
- await handleSessionIdle(workspaceDir, idleEvent);
32
- }
33
- catch (err) {
34
- const message = err instanceof Error ? err.message : String(err);
35
- warn(`hook=${HOOK_NAME}: unexpected error swallowed (auto-commit is best-effort): ${message}`);
36
- }
37
- };
38
- }
39
- async function handleSessionIdle(workspaceDir, evt) {
40
- const sessionId = evt.properties.sessionID;
41
- if (!sessionId) {
42
- debug(`hook=${HOOK_NAME}: event missing sessionID; skipping`);
43
- return;
44
- }
45
- const ctx = readInvocationContextForHook(workspaceDir, HOOK_NAME);
46
- if (!ctx) {
47
- return;
48
- }
49
- if (ctx.git?.autoCommit !== 'enabled') {
50
- debug(`hook=${HOOK_NAME}: session=${sessionId} autoCommit not enabled (got ` +
51
- `${ctx.git?.autoCommit ?? 'absent'}); skipping`);
52
- return;
53
- }
54
- if (!ctx.actor) {
55
- warn(`hook=${HOOK_NAME}: session=${sessionId} has git.autoCommit=enabled but ` +
56
- `no actor in context.json; skipping. The orchestrator must stamp ` +
57
- `context.actor for sessions opted into per-turn auto-commit.`);
58
- return;
59
- }
60
- const apiUrl = process.env.WORKSPACE_GIT_API_URL;
61
- if (!apiUrl || apiUrl.length === 0) {
62
- warn(`hook=${HOOK_NAME}: session=${sessionId} WORKSPACE_GIT_API_URL env not set; ` +
63
- `skipping auto-commit. Wire the env into the worker container envelope.`);
64
- return;
65
- }
66
- const jwtPath = process.env.WORKER_ACTOR_JWT_PATH ?? DEFAULT_JWT_PATH;
67
- const actorJwt = readActorJwt(jwtPath);
68
- if (actorJwt === null) {
69
- warn(`hook=${HOOK_NAME}: session=${sessionId} actor JWT not readable at ${jwtPath}; ` +
70
- `skipping auto-commit. Verify the orchestrator mounts the actor JWT ` +
71
- `before session start.`);
72
- return;
73
- }
74
- const repoSubPath = ctx.git.repoSubPath ?? null;
75
- const repoDir = repoSubPath ? join(workspaceDir, repoSubPath) : workspaceDir;
76
- const dirty = await isGitTreeDirty(repoDir);
77
- if (dirty === undefined) {
78
- return;
79
- }
80
- if (!dirty) {
81
- debug(`hook=${HOOK_NAME}: session=${sessionId} clean tree at ${repoDir}; ` +
82
- `skipping auto-commit`);
83
- return;
84
- }
85
- const turn = nextTurn(sessionId);
86
- const body = {
87
- turn,
88
- actor: {
89
- kind: ctx.actor.kind,
90
- subjectRef: ctx.actor.subjectRef,
91
- displayName: ctx.actor.displayName,
92
- },
93
- committed: true,
94
- sha: null,
95
- pushFailed: false,
96
- };
97
- const endpoint = buildAutocommitUrl(apiUrl, sessionId);
98
- const response = await postAutocommit(endpoint, actorJwt, body, ctx);
99
- if (response === null) {
100
- return;
101
- }
102
- if (response.conflictDetected) {
103
- conflictFlagBySessionId.set(sessionId, { at: Date.now(), turn });
104
- info(`hook=${HOOK_NAME}: session=${sessionId} turn=${turn} conflict detected ` +
105
- `(remote diverged); next user message will surface the Publish affordance`);
106
- return;
107
- }
108
- if (response.pushFailed) {
109
- info(`hook=${HOOK_NAME}: session=${sessionId} turn=${turn} push failed; ` +
110
- `retrying once after ${PUSH_RETRY_DELAY_MS}ms`);
111
- await sleep(PUSH_RETRY_DELAY_MS);
112
- const retry = await postAutocommit(endpoint, actorJwt, body, ctx);
113
- if (retry === null || retry.pushFailed) {
114
- warn(`hook=${HOOK_NAME}: session=${sessionId} turn=${turn} push failed twice; ` +
115
- `giving up (auto-commit is best-effort). User-driven Publish flow ` +
116
- `remains available.`);
117
- return;
118
- }
119
- if (retry.conflictDetected) {
120
- conflictFlagBySessionId.set(sessionId, { at: Date.now(), turn });
121
- info(`hook=${HOOK_NAME}: session=${sessionId} turn=${turn} retry surfaced conflict`);
122
- return;
123
- }
124
- info(`hook=${HOOK_NAME}: session=${sessionId} turn=${turn} retry committed=${retry.committed}` +
125
- ` sha=${retry.sha ?? '-'}`);
126
- return;
127
- }
128
- info(`hook=${HOOK_NAME}: session=${sessionId} turn=${turn} committed=${response.committed}` +
129
- ` sha=${response.sha ?? '-'}`);
130
- }
131
- function nextTurn(sessionId) {
132
- const prev = turnCounterBySessionId.get(sessionId) ?? 0;
133
- const next = prev + 1;
134
- turnCounterBySessionId.set(sessionId, next);
135
- return next;
136
- }
137
- function readActorJwt(path) {
138
- try {
139
- if (!existsSync(path)) {
140
- return null;
141
- }
142
- const raw = readFileSync(path, 'utf-8').trim();
143
- return raw.length > 0 ? raw : null;
144
- }
145
- catch (err) {
146
- const message = err instanceof Error ? err.message : String(err);
147
- warn(`hook=${HOOK_NAME}: failed to read actor JWT at ${path}: ${message}`);
148
- return null;
149
- }
150
- }
151
- async function isGitTreeDirty(repoDir) {
152
- try {
153
- const { stdout } = await execFileAsync('git', ['-C', repoDir, 'status', '--porcelain'], { encoding: 'utf-8', maxBuffer: 16 * 1024 * 1024 });
154
- return stdout.trim().length > 0;
155
- }
156
- catch (err) {
157
- const message = err instanceof Error ? err.message : String(err);
158
- warn(`hook=${HOOK_NAME}: git status failed in ${repoDir}: ${message}. ` +
159
- `Skipping auto-commit for this turn.`);
160
- return undefined;
161
- }
162
- }
163
- function buildAutocommitUrl(apiBase, sessionId) {
164
- const base = apiBase.endsWith('/') ? apiBase.slice(0, -1) : apiBase;
165
- return `${base}/sessions/${encodeURIComponent(sessionId)}/autocommit`;
166
- }
167
- async function postAutocommit(url, actorJwt, body, ctx) {
168
- try {
169
- const res = await fetch(url, {
170
- method: 'POST',
171
- headers: {
172
- 'Content-Type': 'application/json',
173
- Authorization: `Bearer ${actorJwt}`,
174
- },
175
- body: JSON.stringify(body),
176
- });
177
- if (!res.ok) {
178
- const text = await safeReadBody(res);
179
- warn(`hook=${HOOK_NAME}: POST ${url} responded ${res.status} ${res.statusText} ` +
180
- `(role=${ctx.invocation.role}, runId=${ctx.invocation.runId ?? '-'}): ${text}`);
181
- return null;
182
- }
183
- const parsed = (await res.json());
184
- return parsed;
185
- }
186
- catch (err) {
187
- const message = err instanceof Error ? err.message : String(err);
188
- warn(`hook=${HOOK_NAME}: POST ${url} failed: ${message}`);
189
- return null;
190
- }
191
- }
192
- async function safeReadBody(res) {
193
- try {
194
- const text = await res.text();
195
- return text.length > 512 ? `${text.slice(0, 512)}…` : text;
196
- }
197
- catch {
198
- return '<unreadable body>';
199
- }
200
- }
201
- function sleep(ms) {
202
- return new Promise((resolve) => {
203
- setTimeout(resolve, ms);
204
- });
205
- }
206
- //# sourceMappingURL=session-idle-autocommit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session-idle-autocommit.js","sourceRoot":"","sources":["../../src/hooks/session-idle-autocommit.ts"],"names":[],"mappings":"AA0DA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,4BAA4B,EAA0B,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAGjD,MAAM,SAAS,GAAG,cAAc,CAAC;AACjC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAC/C,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AA4B1C,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAwC,CAAC;AAEhF,MAAM,UAAU,gBAAgB,CAC9B,SAAiB;IAEjB,OAAO,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAQD,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAMzD,MAAM,UAAU,yCAAyC;IACvD,uBAAuB,CAAC,KAAK,EAAE,CAAC;IAChC,sBAAsB,CAAC,KAAK,EAAE,CAAC;AACjC,CAAC;AAOD,MAAM,UAAU,0BAA0B,CACxC,YAAoB;IAEpB,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,GAA+B,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YAEb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,CACF,QAAQ,SAAS,8DAA8D,OAAO,EAAE,CACzF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,YAAoB,EACpB,GAA6B;IAE7B,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;IAC3C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,KAAK,CAAC,QAAQ,SAAS,qCAAqC,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,4BAA4B,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAClE,IAAI,CAAC,GAAG,EAAE,CAAC;QAET,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,SAAS,EAAE,CAAC;QACtC,KAAK,CACH,QAAQ,SAAS,aAAa,SAAS,+BAA+B;YACpE,GAAG,GAAG,CAAC,GAAG,EAAE,UAAU,IAAI,QAAQ,aAAa,CAClD,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,kCAAkC;YACvE,kEAAkE;YAClE,6DAA6D,CAChE,CAAC;QACF,OAAO;IACT,CAAC;IAkBD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjD,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,sCAAsC;YAC3E,wEAAwE,CAC3E,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,gBAAgB,CAAC;IACtE,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,8BAA8B,OAAO,IAAI;YAC9E,qEAAqE;YACrE,uBAAuB,CAC1B,CAAC;QACF,OAAO;IACT,CAAC;IASD,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAE7E,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAExB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,CACH,QAAQ,SAAS,aAAa,SAAS,kBAAkB,OAAO,IAAI;YAClE,sBAAsB,CACzB,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,IAAI,GAA0B;QAClC,IAAI;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;YACpB,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU;YAChC,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW;SACnC;QAOD,SAAS,EAAE,IAAI;QACf,GAAG,EAAE,IAAI;QACT,UAAU,EAAE,KAAK;KAClB,CAAC;IAEF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACrE,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC9B,uBAAuB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,SAAS,IAAI,qBAAqB;YACvE,0EAA0E,CAC7E,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,SAAS,IAAI,gBAAgB;YAClE,uBAAuB,mBAAmB,IAAI,CACjD,CAAC;QACF,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAClE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,SAAS,IAAI,sBAAsB;gBACxE,mEAAmE;gBACnE,oBAAoB,CACvB,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC3B,uBAAuB,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,SAAS,IAAI,0BAA0B,CAC/E,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,SAAS,IAAI,oBAAoB,KAAK,CAAC,SAAS,EAAE;YACvF,QAAQ,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,CAC7B,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CACF,QAAQ,SAAS,aAAa,SAAS,SAAS,IAAI,cAAc,QAAQ,CAAC,SAAS,EAAE;QACpF,QAAQ,QAAQ,CAAC,GAAG,IAAI,GAAG,EAAE,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB;IACjC,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;IACtB,sBAAsB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/C,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,SAAS,iCAAiC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAQD,KAAK,UAAU,cAAc,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CACpC,KAAK,EACL,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,EACxC,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CACnD,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,CACF,QAAQ,SAAS,0BAA0B,OAAO,KAAK,OAAO,IAAI;YAChE,qCAAqC,CACxC,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,SAAiB;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IACpE,OAAO,GAAG,IAAI,aAAa,kBAAkB,CAAC,SAAS,CAAC,aAAa,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAW,EACX,QAAgB,EAChB,IAA2B,EAC3B,GAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,QAAQ,EAAE;aACpC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CACF,QAAQ,SAAS,UAAU,GAAG,cAAc,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,GAAG;gBACzE,SAAS,GAAG,CAAC,UAAU,CAAC,IAAI,WAAW,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,EAAE,CACjF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2B,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,SAAS,UAAU,GAAG,YAAY,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAa;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,mBAAmB,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { ExperimentalChatSystemTransformInput, ExperimentalChatSystemTransformOutput } from '../opencode-types.js';
2
- export declare function buildSystemPromptOverlay(directory: string): (_input: ExperimentalChatSystemTransformInput, output: ExperimentalChatSystemTransformOutput) => Promise<void>;
3
- //# sourceMappingURL=system-prompt-overlay.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"system-prompt-overlay.d.ts","sourceRoot":"","sources":["../../src/hooks/system-prompt-overlay.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,oCAAoC,EACpC,qCAAqC,EACtC,MAAM,sBAAsB,CAAC;AA0C9B,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,IAEtD,QAAQ,oCAAoC,EAC5C,QAAQ,qCAAqC,KAC5C,OAAO,CAAC,IAAI,CAAC,CA2CjB"}
@@ -1,30 +0,0 @@
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 function buildSystemPromptOverlay(directory) {
8
- return async (_input, output) => {
9
- const ctx = readInvocationContextForHook(directory, 'experimental.chat.system.transform');
10
- if (!ctx) {
11
- return;
12
- }
13
- const overlayPath = join(directory, '.xema', 'system-overlay.md');
14
- if (!existsSync(overlayPath)) {
15
- throw new XemaSystemOverlayMissingError(`Xema session ${ctx.invocation.runId ?? 'unknown'} (role=${ctx.invocation.role}, ` +
16
- `sessionId=${ctx.invocation.sessionId ?? '-'}) is missing /workspace/.xema/system-overlay.md. ` +
17
- `The platform contract is undefined; refusing to start the chat. ` +
18
- `Verify the agent-run-context render flow emitted the system-overlay slot.`);
19
- }
20
- const bytes = readFileSync(overlayPath, 'utf8');
21
- if (output.system.length !== 1) {
22
- throw new Error(`experimental.chat.system.transform: expected output.system to contain exactly 1 entry on hook entry, got ${output.system.length}. ` +
23
- `Another plugin or an OpenCode change broke the seed-then-extend contract this hook relies on.`);
24
- }
25
- const listing = renderWorkspaceListing(directory);
26
- output.system[0] = `${output.system[0]}\n\n${bytes}\n\n${listing}`;
27
- debug(`experimental.chat.system.transform: concatenated ${bytes.length} overlay bytes + ${listing.length} listing bytes into system[0] (role=${ctx.invocation.role})`);
28
- };
29
- }
30
- //# sourceMappingURL=system-prompt-overlay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"system-prompt-overlay.js","sourceRoot":"","sources":["../../src/hooks/system-prompt-overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAKrC,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAyChE,MAAM,UAAU,wBAAwB,CAAC,SAAiB;IACxD,OAAO,KAAK,EACV,MAA4C,EAC5C,MAA6C,EAC9B,EAAE;QACjB,MAAM,GAAG,GAAG,4BAA4B,CACtC,SAAS,EACT,oCAAoC,CACrC,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC;YAET,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;QAMhD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,4GAA4G,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI;gBAClI,+FAA+F,CAClG,CAAC;QACJ,CAAC;QAQD,MAAM,OAAO,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,OAAO,EAAE,CAAC;QACnE,KAAK,CACH,oDAAoD,KAAK,CAAC,MAAM,oBAAoB,OAAO,CAAC,MAAM,uCAAuC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAChK,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -1,49 +0,0 @@
1
- export interface ExperimentalChatModel {
2
- providerID?: string;
3
- modelID?: string;
4
- }
5
- export interface ExperimentalChatSystemTransformInput {
6
- sessionID?: string;
7
- model: ExperimentalChatModel;
8
- }
9
- export interface ExperimentalChatSystemTransformOutput {
10
- system: string[];
11
- }
12
- export type OpencodeSessionIdleEvent = {
13
- type: 'session.idle';
14
- properties: {
15
- sessionID: string;
16
- };
17
- };
18
- export type OpencodeEvent = OpencodeSessionIdleEvent | {
19
- type: string;
20
- properties?: Record<string, unknown>;
21
- };
22
- export interface ToolExecuteHookInput {
23
- tool: string;
24
- sessionID: string;
25
- callID: string;
26
- }
27
- export interface Hooks {
28
- dispose?: () => Promise<void>;
29
- 'tool.execute.before'?: (input: ToolExecuteHookInput, output: {
30
- args: unknown;
31
- }) => Promise<void> | void;
32
- 'tool.execute.after'?: (input: ToolExecuteHookInput, output: {
33
- title: string;
34
- output: string;
35
- metadata: unknown;
36
- }) => Promise<void> | void;
37
- 'experimental.chat.system.transform'?: (input: ExperimentalChatSystemTransformInput, output: ExperimentalChatSystemTransformOutput) => Promise<void> | void;
38
- event?: (input: {
39
- event: OpencodeEvent;
40
- }) => Promise<void> | void;
41
- }
42
- interface PluginInput {
43
- directory: string;
44
- worktree: string;
45
- serverUrl: URL;
46
- }
47
- export type Plugin = (input: PluginInput) => Promise<Hooks>;
48
- export {};
49
- //# sourceMappingURL=opencode-types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"opencode-types.d.ts","sourceRoot":"","sources":["../src/opencode-types.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oCAAoC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,qBAAqB,CAAC;CAC9B;AAED,MAAM,WAAW,qCAAqC;IACpD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAUD,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB,wBAAwB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC;AAY3D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,KAAK;IAOpB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAU9B,qBAAqB,CAAC,EAAE,CACtB,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KACtB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAO1B,oBAAoB,CAAC,EAAE,CACrB,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,KACzD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAO1B,oCAAoC,CAAC,EAAE,CACrC,KAAK,EAAE,oCAAoC,EAC3C,MAAM,EAAE,qCAAqC,KAC1C,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAQ1B,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,aAAa,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACnE;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,GAAG,CAAC;CAChB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=opencode-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"opencode-types.js","sourceRoot":"","sources":["../src/opencode-types.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export { XemaPlugin as default, XemaPlugin } from './index.js';
2
- //# sourceMappingURL=plugin-entry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-entry.d.ts","sourceRoot":"","sources":["../src/plugin-entry.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -1,2 +0,0 @@
1
- export { XemaPlugin as default, XemaPlugin } from './index.js';
2
- //# sourceMappingURL=plugin-entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-entry.js","sourceRoot":"","sources":["../src/plugin-entry.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,UAAU,IAAI,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}