@xemahq/opencode-xema-plugin 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +64 -0
  3. package/dist/context.d.ts +65 -0
  4. package/dist/context.d.ts.map +1 -0
  5. package/dist/context.js +82 -0
  6. package/dist/context.js.map +1 -0
  7. package/dist/errors.d.ts +5 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +8 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/hooks/session-idle-autocommit.d.ts +11 -0
  12. package/dist/hooks/session-idle-autocommit.d.ts.map +1 -0
  13. package/dist/hooks/session-idle-autocommit.js +206 -0
  14. package/dist/hooks/session-idle-autocommit.js.map +1 -0
  15. package/dist/hooks/system-prompt-overlay.d.ts +3 -0
  16. package/dist/hooks/system-prompt-overlay.d.ts.map +1 -0
  17. package/dist/hooks/system-prompt-overlay.js +30 -0
  18. package/dist/hooks/system-prompt-overlay.js.map +1 -0
  19. package/dist/hooks/workspace-listing.d.ts +3 -0
  20. package/dist/hooks/workspace-listing.d.ts.map +1 -0
  21. package/dist/hooks/workspace-listing.js +106 -0
  22. package/dist/hooks/workspace-listing.js.map +1 -0
  23. package/dist/index.d.ts +9 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +56 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/logger.d.ts +5 -0
  28. package/dist/logger.d.ts.map +1 -0
  29. package/dist/logger.js +18 -0
  30. package/dist/logger.js.map +1 -0
  31. package/dist/opencode-types.d.ts +55 -0
  32. package/dist/opencode-types.d.ts.map +1 -0
  33. package/dist/opencode-types.js +4 -0
  34. package/dist/opencode-types.js.map +1 -0
  35. package/dist/plugin-entry.d.ts +2 -0
  36. package/dist/plugin-entry.d.ts.map +1 -0
  37. package/dist/plugin-entry.js +2 -0
  38. package/dist/plugin-entry.js.map +1 -0
  39. package/dist/session-state.d.ts +20 -0
  40. package/dist/session-state.d.ts.map +1 -0
  41. package/dist/session-state.js +43 -0
  42. package/dist/session-state.js.map +1 -0
  43. package/dist/tools/runtime.d.ts +2 -0
  44. package/dist/tools/runtime.d.ts.map +1 -0
  45. package/dist/tools/runtime.js +2 -0
  46. package/dist/tools/runtime.js.map +1 -0
  47. package/dist/tools/service-token.d.ts +3 -0
  48. package/dist/tools/service-token.d.ts.map +1 -0
  49. package/dist/tools/service-token.js +31 -0
  50. package/dist/tools/service-token.js.map +1 -0
  51. package/dist/tools/shared.d.ts +3 -0
  52. package/dist/tools/shared.d.ts.map +1 -0
  53. package/dist/tools/shared.js +11 -0
  54. package/dist/tools/shared.js.map +1 -0
  55. package/dist/tools/xema-memory.d.ts +31 -0
  56. package/dist/tools/xema-memory.d.ts.map +1 -0
  57. package/dist/tools/xema-memory.js +157 -0
  58. package/dist/tools/xema-memory.js.map +1 -0
  59. package/dist/tools/xema-studio.d.ts +28 -0
  60. package/dist/tools/xema-studio.d.ts.map +1 -0
  61. package/dist/tools/xema-studio.js +220 -0
  62. package/dist/tools/xema-studio.js.map +1 -0
  63. package/package.json +45 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-idle-autocommit.js","sourceRoot":"","sources":["../../src/hooks/session-idle-autocommit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,30 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,3 @@
1
+ export declare const MAX_ENTRIES_PER_DIR = 50;
2
+ export declare function renderWorkspaceListing(workspaceRoot: string): string;
3
+ //# sourceMappingURL=workspace-listing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-listing.d.ts","sourceRoot":"","sources":["../../src/hooks/workspace-listing.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAmCtC,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAgCpE"}
@@ -0,0 +1,106 @@
1
+ import { readdirSync, statSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export const MAX_ENTRIES_PER_DIR = 50;
4
+ const HIDDEN_TOP_LEVEL = new Set(['.xema', '.opencode']);
5
+ const SKIP_CHILD_EXPANSION_TOP_LEVEL = new Set([
6
+ '.git',
7
+ 'node_modules',
8
+ '.venv',
9
+ 'venv',
10
+ '__pycache__',
11
+ '.mypy_cache',
12
+ '.pytest_cache',
13
+ '.ruff_cache',
14
+ '.tox',
15
+ '.nox',
16
+ '.eggs',
17
+ ]);
18
+ export function renderWorkspaceListing(workspaceRoot) {
19
+ const lines = [
20
+ '## Current workspace contents (depth 1)',
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/`).',
23
+ '',
24
+ ];
25
+ let topLevel;
26
+ try {
27
+ topLevel = readDirSorted(workspaceRoot);
28
+ }
29
+ catch (err) {
30
+ lines.push(`_Listing unavailable: ${err.message}_`);
31
+ return lines.join('\n');
32
+ }
33
+ const visible = topLevel.filter((entry) => !HIDDEN_TOP_LEVEL.has(entry.name));
34
+ if (visible.length === 0) {
35
+ lines.push('_(workspace is empty)_');
36
+ return lines.join('\n');
37
+ }
38
+ for (const entry of visible) {
39
+ lines.push(...renderTopLevelEntry(workspaceRoot, entry));
40
+ }
41
+ return lines.join('\n');
42
+ }
43
+ function renderTopLevelEntry(workspaceRoot, entry) {
44
+ const relPath = entry.name;
45
+ const absPath = join(workspaceRoot, entry.name);
46
+ if (!entry.isDirectory) {
47
+ return [`- \`/workspace/${relPath}\``];
48
+ }
49
+ if (SKIP_CHILD_EXPANSION_TOP_LEVEL.has(entry.name)) {
50
+ return [
51
+ `- \`/workspace/${relPath}/\` _(children omitted: known implicit/noisy directory — use \`glob\`/\`list\` if needed)_`,
52
+ ];
53
+ }
54
+ let children;
55
+ try {
56
+ children = readDirSorted(absPath);
57
+ }
58
+ catch (err) {
59
+ return [`- \`/workspace/${relPath}/\` _(unreadable: ${err.message})_`];
60
+ }
61
+ if (children.length === 0) {
62
+ return [`- \`/workspace/${relPath}/\` _(empty)_`];
63
+ }
64
+ const shown = children.slice(0, MAX_ENTRIES_PER_DIR);
65
+ const childLines = shown.map((child) => {
66
+ const suffix = child.isDirectory ? '/' : '';
67
+ return ` - \`${child.name}${suffix}\``;
68
+ });
69
+ const overflow = children.length - shown.length;
70
+ const overflowLine = overflow > 0
71
+ ? [` - _(${overflow} more entr${overflow === 1 ? 'y' : 'ies'} — use \`glob\`/\`list\` to enumerate)_`]
72
+ : [];
73
+ return [`- \`/workspace/${relPath}/\``, ...childLines, ...overflowLine];
74
+ }
75
+ function readDirSorted(dir) {
76
+ const dirents = readdirSync(dir, { withFileTypes: true });
77
+ const entries = dirents.map((d) => ({
78
+ name: d.name,
79
+ isDirectory: resolveIsDirectory(dir, d),
80
+ }));
81
+ entries.sort((a, b) => {
82
+ if (a.isDirectory !== b.isDirectory) {
83
+ return a.isDirectory ? -1 : 1;
84
+ }
85
+ if (a.name < b.name) {
86
+ return -1;
87
+ }
88
+ if (a.name > b.name) {
89
+ return 1;
90
+ }
91
+ return 0;
92
+ });
93
+ return entries;
94
+ }
95
+ function resolveIsDirectory(parent, dirent) {
96
+ if (dirent.isSymbolicLink()) {
97
+ try {
98
+ return statSync(join(parent, dirent.name)).isDirectory();
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ }
104
+ return dirent.isDirectory();
105
+ }
106
+ //# sourceMappingURL=workspace-listing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-listing.js","sourceRoot":"","sources":["../../src/hooks/workspace-listing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
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 { readInvocationContext } from './context.js';
6
+ export type { InvocationContext, InvocationRole } from './context.js';
7
+ export * from './errors.js';
8
+ export { loadSessionState, loadSessionStateForTool, ensureRoleAllowed, ContextMissingError, RoleNotAllowedError, type SessionState, } from './session-state.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAS,MAAM,EAAkB,MAAM,qBAAqB,CAAC;AA4BzE,eAAO,MAAM,UAAU,EAAE,MAgBxB,CAAC;AA+BF,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AA6BD,eAAe,UAAU,CAAC;AAG1B,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"}
package/dist/index.js ADDED
@@ -0,0 +1,56 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { buildSessionIdleAutocommit } from './hooks/session-idle-autocommit.js';
4
+ import { buildSystemPromptOverlay } from './hooks/system-prompt-overlay.js';
5
+ import { info, isDebug } from './logger.js';
6
+ import { buildXemaMemoryGetTool, buildXemaMemorySetTool, } from './tools/xema-memory.js';
7
+ import { buildXemaStudioFetchSchemaTool, buildXemaStudioListExistingArtifactsTool, buildXemaStudioValidateTool, } from './tools/xema-studio.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 hooks = {
34
+ tool: tools,
35
+ 'experimental.chat.system.transform': buildSystemPromptOverlay(directory),
36
+ event: buildSessionIdleAutocommit(directory),
37
+ };
38
+ return hooks;
39
+ }
40
+ export function __resetBootCacheForTests() {
41
+ bootCache.clear();
42
+ }
43
+ function buildAllTools(workspaceDir) {
44
+ return {
45
+ xema_memory_set: buildXemaMemorySetTool(workspaceDir),
46
+ xema_memory_get: buildXemaMemoryGetTool(workspaceDir),
47
+ xema_studio_fetch_schema: buildXemaStudioFetchSchemaTool(workspaceDir),
48
+ xema_studio_validate: buildXemaStudioValidateTool(workspaceDir),
49
+ xema_studio_list_existing_artifacts: buildXemaStudioListExistingArtifactsTool(workspaceDir),
50
+ };
51
+ }
52
+ export default XemaPlugin;
53
+ export { readInvocationContext } from './context.js';
54
+ export * from './errors.js';
55
+ export { loadSessionState, loadSessionStateForTool, ensureRoleAllowed, ContextMissingError, RoleNotAllowedError, } from './session-state.js';
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function info(msg: string): void;
2
+ export declare function warn(msg: string): void;
3
+ export declare function debug(msg: string): void;
4
+ export declare function isDebug(): boolean;
5
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAqBA,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGtC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGtC;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIvC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC"}
package/dist/logger.js ADDED
@@ -0,0 +1,18 @@
1
+ const PREFIX = '[opencode-xema-plugin]';
2
+ const DEBUG_ENABLED = process.env.XEMA_PLUGIN_DEBUG === '1' ||
3
+ process.env.XEMA_PLUGIN_DEBUG === 'true';
4
+ export function info(msg) {
5
+ console.log(`${PREFIX} ${msg}`);
6
+ }
7
+ export function warn(msg) {
8
+ console.warn(`${PREFIX} ${msg}`);
9
+ }
10
+ export function debug(msg) {
11
+ if (!DEBUG_ENABLED)
12
+ return;
13
+ console.log(`${PREFIX} [debug] ${msg}`);
14
+ }
15
+ export function isDebug() {
16
+ return DEBUG_ENABLED;
17
+ }
18
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAExC,MAAM,aAAa,GACjB,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,GAAG;IACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,CAAC;AAE3C,MAAM,UAAU,IAAI,CAAC,GAAW;IAE9B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAW;IAE9B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,IAAI,CAAC,aAAa;QAAE,OAAO;IAE3B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,YAAY,GAAG,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,55 @@
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 Hooks {
41
+ tool?: Record<string, ToolDefinition>;
42
+ 'experimental.chat.system.transform'?: (input: ExperimentalChatSystemTransformInput, output: ExperimentalChatSystemTransformOutput) => Promise<void> | void;
43
+ event?: (input: {
44
+ event: OpencodeEvent;
45
+ }) => Promise<void> | void;
46
+ }
47
+ interface PluginInput {
48
+ directory: string;
49
+ worktree: string;
50
+ serverUrl: URL;
51
+ }
52
+ export type Plugin = (input: PluginInput) => Promise<Hooks>;
53
+ export declare function tool<Args extends z.ZodRawShape>(input: ToolDefinition<Args>): ToolDefinition<Args>;
54
+ export {};
55
+ //# sourceMappingURL=opencode-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-types.d.ts","sourceRoot":"","sources":["../src/opencode-types.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc,CAAC,IAAI,SAAS,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CACL,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAChC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB;AAQD,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;AAE3D,MAAM,WAAW,KAAK;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAOtC,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;AAO5D,wBAAgB,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,WAAW,EAC7C,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,GAC1B,cAAc,CAAC,IAAI,CAAC,CAEtB"}
@@ -0,0 +1,4 @@
1
+ export function tool(input) {
2
+ return input;
3
+ }
4
+ //# sourceMappingURL=opencode-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-types.js","sourceRoot":"","sources":["../src/opencode-types.ts"],"names":[],"mappings":"AAsGA,MAAM,UAAU,IAAI,CAClB,KAA2B;IAE3B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { XemaPlugin as default, XemaPlugin } from './index.js';
2
+ //# sourceMappingURL=plugin-entry.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export { XemaPlugin as default, XemaPlugin } from './index.js';
2
+ //# sourceMappingURL=plugin-entry.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,20 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,43 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,2 @@
1
+ export { loadSessionStateForTool } from '../session-state.js';
2
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/tools/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { loadSessionStateForTool } from '../session-state.js';
2
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/tools/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function readServiceToken(): string;
2
+ export declare function serviceTokenAuthorizationHeader(): string;
3
+ //# sourceMappingURL=service-token.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,31 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,3 @@
1
+ export declare function writeOutputFile(workspaceDir: string, relativePath: string, content: string): void;
2
+ export declare function toJsonString(value: unknown): string;
3
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,11 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,31 @@
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
@@ -0,0 +1 @@
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;AA6HxB,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM;;;;;;;;;;;;;;GAsC1D;AAED,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM;;;;;;;;;;;;;GAiC1D"}