@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.
- package/README.md +33 -40
- package/dist/.source-stamp.json +2 -2
- package/dist/context.d.ts +5 -15
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +4 -14
- package/dist/context.js.map +1 -1
- package/dist/hooks/compaction-invariants.d.ts +8 -0
- package/dist/hooks/compaction-invariants.d.ts.map +1 -0
- package/dist/hooks/compaction-invariants.js +60 -0
- package/dist/hooks/compaction-invariants.js.map +1 -0
- package/dist/hooks/root-turn-completion.d.ts +14 -0
- package/dist/hooks/root-turn-completion.d.ts.map +1 -0
- package/dist/hooks/root-turn-completion.js +84 -0
- package/dist/hooks/root-turn-completion.js.map +1 -0
- package/dist/hooks/shell-env-hygiene.d.ts +6 -0
- package/dist/hooks/shell-env-hygiene.d.ts.map +1 -0
- package/dist/hooks/shell-env-hygiene.js +10 -0
- package/dist/hooks/shell-env-hygiene.js.map +1 -0
- package/dist/hooks/subagent-fanout-ceiling.d.ts +18 -17
- package/dist/hooks/subagent-fanout-ceiling.d.ts.map +1 -1
- package/dist/hooks/subagent-fanout-ceiling.js +106 -92
- package/dist/hooks/subagent-fanout-ceiling.js.map +1 -1
- package/dist/hooks/system-overlay.d.ts +6 -0
- package/dist/hooks/system-overlay.d.ts.map +1 -0
- package/dist/hooks/system-overlay.js +40 -0
- package/dist/hooks/system-overlay.js.map +1 -0
- package/dist/hooks/tool-surface-observation.d.ts +14 -0
- package/dist/hooks/tool-surface-observation.d.ts.map +1 -0
- package/dist/hooks/tool-surface-observation.js +30 -0
- package/dist/hooks/tool-surface-observation.js.map +1 -0
- package/dist/hooks/workspace-listing.js +3 -3
- package/dist/hooks/workspace-listing.js.map +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -81
- package/dist/index.js.map +1 -1
- package/dist/plugin-id.d.ts +2 -0
- package/dist/plugin-id.d.ts.map +1 -0
- package/dist/plugin-id.js +2 -0
- package/dist/plugin-id.js.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +86 -0
- package/dist/plugin.js.map +1 -0
- package/dist/runtime-events.d.ts +17 -0
- package/dist/runtime-events.d.ts.map +1 -0
- package/dist/runtime-events.js +39 -0
- package/dist/runtime-events.js.map +1 -0
- package/package.json +12 -17
- package/{plugin.mjs → plugin/xema-runtime-bridge/index.js} +7770 -2857
- package/plugin/xema-runtime-bridge/package.json +8 -0
- package/dist/hooks/session-idle-autocommit.d.ts +0 -11
- package/dist/hooks/session-idle-autocommit.d.ts.map +0 -1
- package/dist/hooks/session-idle-autocommit.js +0 -206
- package/dist/hooks/session-idle-autocommit.js.map +0 -1
- package/dist/hooks/system-prompt-overlay.d.ts +0 -3
- package/dist/hooks/system-prompt-overlay.d.ts.map +0 -1
- package/dist/hooks/system-prompt-overlay.js +0 -30
- package/dist/hooks/system-prompt-overlay.js.map +0 -1
- package/dist/opencode-types.d.ts +0 -69
- package/dist/opencode-types.d.ts.map +0 -1
- package/dist/opencode-types.js +0 -4
- package/dist/opencode-types.js.map +0 -1
- package/dist/plugin-entry.d.ts +0 -2
- package/dist/plugin-entry.d.ts.map +0 -1
- package/dist/plugin-entry.js +0 -2
- package/dist/plugin-entry.js.map +0 -1
- package/dist/session-state.d.ts +0 -20
- package/dist/session-state.d.ts.map +0 -1
- package/dist/session-state.js +0 -43
- package/dist/session-state.js.map +0 -1
- package/dist/tools/runtime.d.ts +0 -2
- package/dist/tools/runtime.d.ts.map +0 -1
- package/dist/tools/runtime.js +0 -2
- package/dist/tools/runtime.js.map +0 -1
- package/dist/tools/service-token.d.ts +0 -3
- package/dist/tools/service-token.d.ts.map +0 -1
- package/dist/tools/service-token.js +0 -31
- package/dist/tools/service-token.js.map +0 -1
- package/dist/tools/shared.d.ts +0 -3
- package/dist/tools/shared.d.ts.map +0 -1
- package/dist/tools/shared.js +0 -11
- package/dist/tools/shared.js.map +0 -1
- package/dist/tools/xema-memory.d.ts +0 -31
- package/dist/tools/xema-memory.d.ts.map +0 -1
- package/dist/tools/xema-memory.js +0 -157
- package/dist/tools/xema-memory.js.map +0 -1
|
@@ -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":"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"}
|
|
@@ -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"}
|
package/dist/opencode-types.d.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import type { z } from 'zod';
|
|
2
|
-
interface ToolContext {
|
|
3
|
-
sessionID: string;
|
|
4
|
-
messageID: string;
|
|
5
|
-
agent: string;
|
|
6
|
-
directory: string;
|
|
7
|
-
worktree: string;
|
|
8
|
-
abort: AbortSignal;
|
|
9
|
-
metadata(input: {
|
|
10
|
-
title?: string;
|
|
11
|
-
metadata?: Record<string, unknown>;
|
|
12
|
-
}): void;
|
|
13
|
-
}
|
|
14
|
-
export interface ToolDefinition<Args extends z.ZodRawShape = z.ZodRawShape> {
|
|
15
|
-
description: string;
|
|
16
|
-
args: Args;
|
|
17
|
-
execute(args: z.infer<z.ZodObject<Args>>, context: ToolContext): Promise<string>;
|
|
18
|
-
}
|
|
19
|
-
export interface ExperimentalChatModel {
|
|
20
|
-
providerID?: string;
|
|
21
|
-
modelID?: string;
|
|
22
|
-
}
|
|
23
|
-
export interface ExperimentalChatSystemTransformInput {
|
|
24
|
-
sessionID?: string;
|
|
25
|
-
model: ExperimentalChatModel;
|
|
26
|
-
}
|
|
27
|
-
export interface ExperimentalChatSystemTransformOutput {
|
|
28
|
-
system: string[];
|
|
29
|
-
}
|
|
30
|
-
export type OpencodeSessionIdleEvent = {
|
|
31
|
-
type: 'session.idle';
|
|
32
|
-
properties: {
|
|
33
|
-
sessionID: string;
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
export type OpencodeEvent = OpencodeSessionIdleEvent | {
|
|
37
|
-
type: string;
|
|
38
|
-
properties?: Record<string, unknown>;
|
|
39
|
-
};
|
|
40
|
-
export interface ToolExecuteHookInput {
|
|
41
|
-
tool: string;
|
|
42
|
-
sessionID: string;
|
|
43
|
-
callID: string;
|
|
44
|
-
}
|
|
45
|
-
export interface Hooks {
|
|
46
|
-
tool?: Record<string, ToolDefinition>;
|
|
47
|
-
dispose?: () => Promise<void>;
|
|
48
|
-
'tool.execute.before'?: (input: ToolExecuteHookInput, output: {
|
|
49
|
-
args: unknown;
|
|
50
|
-
}) => Promise<void> | void;
|
|
51
|
-
'tool.execute.after'?: (input: ToolExecuteHookInput, output: {
|
|
52
|
-
title: string;
|
|
53
|
-
output: string;
|
|
54
|
-
metadata: unknown;
|
|
55
|
-
}) => Promise<void> | void;
|
|
56
|
-
'experimental.chat.system.transform'?: (input: ExperimentalChatSystemTransformInput, output: ExperimentalChatSystemTransformOutput) => Promise<void> | void;
|
|
57
|
-
event?: (input: {
|
|
58
|
-
event: OpencodeEvent;
|
|
59
|
-
}) => Promise<void> | void;
|
|
60
|
-
}
|
|
61
|
-
interface PluginInput {
|
|
62
|
-
directory: string;
|
|
63
|
-
worktree: string;
|
|
64
|
-
serverUrl: URL;
|
|
65
|
-
}
|
|
66
|
-
export type Plugin = (input: PluginInput) => Promise<Hooks>;
|
|
67
|
-
export declare function tool<Args extends z.ZodRawShape>(input: ToolDefinition<Args>): ToolDefinition<Args>;
|
|
68
|
-
export {};
|
|
69
|
-
//# 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":"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"}
|
package/dist/opencode-types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"opencode-types.js","sourceRoot":"","sources":["../src/opencode-types.ts"],"names":[],"mappings":"AAoJA,MAAM,UAAU,IAAI,CAClB,KAA2B;IAE3B,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/plugin-entry.d.ts
DELETED
|
@@ -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"}
|
package/dist/plugin-entry.js
DELETED
package/dist/plugin-entry.js.map
DELETED
|
@@ -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"}
|
package/dist/session-state.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { type InvocationContext, type InvocationRole } from './context.js';
|
|
2
|
-
export interface SessionState {
|
|
3
|
-
ctx: InvocationContext;
|
|
4
|
-
}
|
|
5
|
-
export declare class ContextMissingError extends Error {
|
|
6
|
-
readonly workspaceDir: string;
|
|
7
|
-
readonly code = "XEMA_CONTEXT_MISSING";
|
|
8
|
-
constructor(workspaceDir: string);
|
|
9
|
-
}
|
|
10
|
-
export declare class RoleNotAllowedError extends Error {
|
|
11
|
-
readonly role: InvocationRole;
|
|
12
|
-
readonly toolName: string;
|
|
13
|
-
readonly allowedTools: string[];
|
|
14
|
-
readonly code = "XEMA_ROLE_NOT_ALLOWED";
|
|
15
|
-
constructor(role: InvocationRole, toolName: string, allowedTools: string[]);
|
|
16
|
-
}
|
|
17
|
-
export declare function loadSessionState(workspaceDir: string): SessionState;
|
|
18
|
-
export declare function ensureRoleAllowed(ctx: InvocationContext, toolName: string): void;
|
|
19
|
-
export declare function loadSessionStateForTool(workspaceDir: string, toolName: string): SessionState;
|
|
20
|
-
//# sourceMappingURL=session-state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAgBA,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,iBAAiB,CAAC;CACxB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;aAEhB,YAAY,EAAE,MAAM;IADhD,QAAQ,CAAC,IAAI,0BAA0B;gBACX,YAAY,EAAE,MAAM;CAOjD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,IAAI,EAAE,cAAc;aACpB,QAAQ,EAAE,MAAM;aAChB,YAAY,EAAE,MAAM,EAAE;IAJxC,QAAQ,CAAC,IAAI,2BAA2B;gBAEtB,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EAAE;CAOzC;AASD,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,YAAY,CAMnE;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,MAAM,GACf,IAAI,CASN;AAMD,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,YAAY,CAId"}
|
package/dist/session-state.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { readInvocationContext, } from './context.js';
|
|
2
|
-
export class ContextMissingError extends Error {
|
|
3
|
-
workspaceDir;
|
|
4
|
-
code = 'XEMA_CONTEXT_MISSING';
|
|
5
|
-
constructor(workspaceDir) {
|
|
6
|
-
super(`/workspace/context.json not found in ${workspaceDir}. The xema plugin ` +
|
|
7
|
-
`cannot operate without invocation context — the orchestrator must ` +
|
|
8
|
-
`write context.json before the agent starts.`);
|
|
9
|
-
this.workspaceDir = workspaceDir;
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
export class RoleNotAllowedError extends Error {
|
|
13
|
-
role;
|
|
14
|
-
toolName;
|
|
15
|
-
allowedTools;
|
|
16
|
-
code = 'XEMA_ROLE_NOT_ALLOWED';
|
|
17
|
-
constructor(role, toolName, allowedTools) {
|
|
18
|
-
super(`Role "${role}" is not allowed to call "${toolName}". Allowed tools ` +
|
|
19
|
-
`for this role: [${allowedTools.join(', ')}].`);
|
|
20
|
-
this.role = role;
|
|
21
|
-
this.toolName = toolName;
|
|
22
|
-
this.allowedTools = allowedTools;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
export function loadSessionState(workspaceDir) {
|
|
26
|
-
const ctx = readInvocationContext(workspaceDir);
|
|
27
|
-
if (!ctx) {
|
|
28
|
-
throw new ContextMissingError(workspaceDir);
|
|
29
|
-
}
|
|
30
|
-
return { ctx };
|
|
31
|
-
}
|
|
32
|
-
export function ensureRoleAllowed(ctx, toolName) {
|
|
33
|
-
const allowed = ctx.authority.allowedXemaTools;
|
|
34
|
-
if (!allowed.includes(toolName)) {
|
|
35
|
-
throw new RoleNotAllowedError(ctx.invocation.role, toolName, [...allowed].sort((a, b) => a.localeCompare(b)));
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
export function loadSessionStateForTool(workspaceDir, toolName) {
|
|
39
|
-
const state = loadSessionState(workspaceDir);
|
|
40
|
-
ensureRoleAllowed(state.ctx, toolName);
|
|
41
|
-
return state;
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=session-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-state.js","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,qBAAqB,GAGtB,MAAM,cAAc,CAAC;AAMtB,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAEhB;IADnB,IAAI,GAAG,sBAAsB,CAAC;IACvC,YAA4B,YAAoB;QAC9C,KAAK,CACH,wCAAwC,YAAY,oBAAoB;YACtE,oEAAoE;YACpE,6CAA6C,CAChD,CAAC;QALwB,iBAAY,GAAZ,YAAY,CAAQ;IAMhD,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAG1B;IACA;IACA;IAJT,IAAI,GAAG,uBAAuB,CAAC;IACxC,YACkB,IAAoB,EACpB,QAAgB,EAChB,YAAsB;QAEtC,KAAK,CACH,SAAS,IAAI,6BAA6B,QAAQ,mBAAmB;YACnE,mBAAmB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACjD,CAAC;QAPc,SAAI,GAAJ,IAAI,CAAgB;QACpB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,iBAAY,GAAZ,YAAY,CAAU;IAMxC,CAAC;CACF;AASD,MAAM,UAAU,gBAAgB,CAAC,YAAoB;IACnD,MAAM,GAAG,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,GAAsB,EACtB,QAAgB;IAEhB,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,mBAAmB,CAC3B,GAAG,CAAC,UAAU,CAAC,IAAI,EACnB,QAAQ,EACR,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAChD,CAAC;IACJ,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,uBAAuB,CACrC,YAAoB,EACpB,QAAgB;IAEhB,MAAM,KAAK,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC7C,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/tools/runtime.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/tools/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/tools/runtime.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/tools/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-token.d.ts","sourceRoot":"","sources":["../../src/tools/service-token.ts"],"names":[],"mappings":"AAkCA,wBAAgB,gBAAgB,IAAI,MAAM,CAyBzC;AAMD,wBAAgB,+BAA+B,IAAI,MAAM,CAExD"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
function serviceTokenPath() {
|
|
3
|
-
return process.env['XEMA_SERVICE_TOKEN_PATH']?.trim() || '/run/xema/service-token';
|
|
4
|
-
}
|
|
5
|
-
export function readServiceToken() {
|
|
6
|
-
const path = serviceTokenPath();
|
|
7
|
-
let raw;
|
|
8
|
-
try {
|
|
9
|
-
raw = readFileSync(path, 'utf8');
|
|
10
|
-
}
|
|
11
|
-
catch (err) {
|
|
12
|
-
const code = err.code;
|
|
13
|
-
if (code === 'ENOENT') {
|
|
14
|
-
throw new Error(`Worker service token file is missing at ${path}. workspace-proxy ` +
|
|
15
|
-
'must write the per-allocation Keycloak JWT (via the session ' +
|
|
16
|
-
'bundle or PUT /control/service-token) before xema_* tools run.');
|
|
17
|
-
}
|
|
18
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
19
|
-
throw new Error(`Failed to read worker service token at ${path}: ${message}`);
|
|
20
|
-
}
|
|
21
|
-
const token = raw.trim();
|
|
22
|
-
if (!token) {
|
|
23
|
-
throw new Error(`Worker service token file at ${path} is empty. workspace-proxy ` +
|
|
24
|
-
'must write a non-empty per-allocation Keycloak JWT.');
|
|
25
|
-
}
|
|
26
|
-
return token;
|
|
27
|
-
}
|
|
28
|
-
export function serviceTokenAuthorizationHeader() {
|
|
29
|
-
return `Bearer ${readServiceToken()}`;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=service-token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"service-token.js","sourceRoot":"","sources":["../../src/tools/service-token.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAOvC,SAAS,gBAAgB;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,IAAI,yBAAyB,CAAC;AACrF,CAAC;AAQD,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,2CAA2C,IAAI,oBAAoB;gBACjE,8DAA8D;gBAC9D,gEAAgE,CACnE,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,gCAAgC,IAAI,6BAA6B;YAC/D,qDAAqD,CACxD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAMD,MAAM,UAAU,+BAA+B;IAC7C,OAAO,UAAU,gBAAgB,EAAE,EAAE,CAAC;AACxC,CAAC"}
|
package/dist/tools/shared.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,IAAI,CAIN;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD"}
|
package/dist/tools/shared.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import { dirname, join } from 'node:path';
|
|
3
|
-
export function writeOutputFile(workspaceDir, relativePath, content) {
|
|
4
|
-
const fullPath = join(workspaceDir, relativePath);
|
|
5
|
-
mkdirSync(dirname(fullPath), { recursive: true });
|
|
6
|
-
writeFileSync(fullPath, content, 'utf-8');
|
|
7
|
-
}
|
|
8
|
-
export function toJsonString(value) {
|
|
9
|
-
return JSON.stringify(value, null, 2);
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=shared.js.map
|
package/dist/tools/shared.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,eAAe,CAC7B,YAAoB,EACpB,YAAoB,EACpB,OAAe;IAEf,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAClD,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
export declare function buildXemaMemorySetTool(workspaceDir: string): import("../opencode-types.js").ToolDefinition<{
|
|
3
|
-
content: z.ZodString;
|
|
4
|
-
kind: z.ZodDefault<z.ZodEnum<{
|
|
5
|
-
GENERAL: "GENERAL";
|
|
6
|
-
DECISION: "DECISION";
|
|
7
|
-
CONSTRAINT: "CONSTRAINT";
|
|
8
|
-
PATTERN: "PATTERN";
|
|
9
|
-
LESSON: "LESSON";
|
|
10
|
-
EPISODIC: "EPISODIC";
|
|
11
|
-
PROCEDURAL: "PROCEDURAL";
|
|
12
|
-
CORRECTION: "CORRECTION";
|
|
13
|
-
}>>;
|
|
14
|
-
tag: z.ZodOptional<z.ZodString>;
|
|
15
|
-
importance: z.ZodOptional<z.ZodNumber>;
|
|
16
|
-
}>;
|
|
17
|
-
export declare function buildXemaMemoryGetTool(workspaceDir: string): import("../opencode-types.js").ToolDefinition<{
|
|
18
|
-
kind: z.ZodOptional<z.ZodEnum<{
|
|
19
|
-
GENERAL: "GENERAL";
|
|
20
|
-
DECISION: "DECISION";
|
|
21
|
-
CONSTRAINT: "CONSTRAINT";
|
|
22
|
-
PATTERN: "PATTERN";
|
|
23
|
-
LESSON: "LESSON";
|
|
24
|
-
EPISODIC: "EPISODIC";
|
|
25
|
-
PROCEDURAL: "PROCEDURAL";
|
|
26
|
-
CORRECTION: "CORRECTION";
|
|
27
|
-
}>>;
|
|
28
|
-
tag: z.ZodOptional<z.ZodString>;
|
|
29
|
-
limit: z.ZodDefault<z.ZodNumber>;
|
|
30
|
-
}>;
|
|
31
|
-
//# sourceMappingURL=xema-memory.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"xema-memory.d.ts","sourceRoot":"","sources":["../../src/tools/xema-memory.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2IxB,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM;;;;;;;;;;;;;;GAsC1D;AAED,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM;;;;;;;;;;;;;GAiC1D"}
|