@eidola.app/cli 0.2.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/cli.d.ts +3 -0
- package/cli.d.ts.map +1 -0
- package/cli.js +46 -0
- package/cli.js.map +1 -0
- package/config.d.ts +16 -0
- package/config.d.ts.map +1 -0
- package/config.js +62 -0
- package/config.js.map +1 -0
- package/cursor/auto-activate.d.ts +16 -0
- package/cursor/auto-activate.d.ts.map +1 -0
- package/cursor/auto-activate.js +79 -0
- package/cursor/auto-activate.js.map +1 -0
- package/cursor/compile.d.ts +13 -0
- package/cursor/compile.d.ts.map +1 -0
- package/cursor/compile.js +47 -0
- package/cursor/compile.js.map +1 -0
- package/cursor/ensure-shrine.d.ts +25 -0
- package/cursor/ensure-shrine.d.ts.map +1 -0
- package/cursor/ensure-shrine.js +168 -0
- package/cursor/ensure-shrine.js.map +1 -0
- package/cursor/hash.d.ts +3 -0
- package/cursor/hash.d.ts.map +1 -0
- package/cursor/hash.js +7 -0
- package/cursor/hash.js.map +1 -0
- package/cursor/shrine-lock.d.ts +17 -0
- package/cursor/shrine-lock.d.ts.map +1 -0
- package/cursor/shrine-lock.js +82 -0
- package/cursor/shrine-lock.js.map +1 -0
- package/cursor/shrine-surface.d.ts +40 -0
- package/cursor/shrine-surface.d.ts.map +1 -0
- package/cursor/shrine-surface.js +152 -0
- package/cursor/shrine-surface.js.map +1 -0
- package/cursor/soul-source.d.ts +3 -0
- package/cursor/soul-source.d.ts.map +1 -0
- package/cursor/soul-source.js +15 -0
- package/cursor/soul-source.js.map +1 -0
- package/cursor/stale.d.ts +12 -0
- package/cursor/stale.d.ts.map +1 -0
- package/cursor/stale.js +41 -0
- package/cursor/stale.js.map +1 -0
- package/cursor/types.d.ts +24 -0
- package/cursor/types.d.ts.map +1 -0
- package/cursor/types.js +2 -0
- package/cursor/types.js.map +1 -0
- package/cursor/workspace-config.d.ts +13 -0
- package/cursor/workspace-config.d.ts.map +1 -0
- package/cursor/workspace-config.js +44 -0
- package/cursor/workspace-config.js.map +1 -0
- package/engram/loader.d.ts +3 -0
- package/engram/loader.d.ts.map +1 -0
- package/engram/loader.js +60 -0
- package/engram/loader.js.map +1 -0
- package/engram/parse.d.ts +4 -0
- package/engram/parse.d.ts.map +1 -0
- package/engram/parse.js +190 -0
- package/engram/parse.js.map +1 -0
- package/engram/registry.d.ts +9 -0
- package/engram/registry.d.ts.map +1 -0
- package/engram/registry.js +54 -0
- package/engram/registry.js.map +1 -0
- package/engram/types.d.ts +58 -0
- package/engram/types.d.ts.map +1 -0
- package/engram/types.js +12 -0
- package/engram/types.js.map +1 -0
- package/engram/validate.d.ts +7 -0
- package/engram/validate.d.ts.map +1 -0
- package/engram/validate.js +22 -0
- package/engram/validate.js.map +1 -0
- package/index.d.ts +30 -0
- package/index.d.ts.map +1 -0
- package/index.js +27 -0
- package/index.js.map +1 -0
- package/migrations/json-to-directory.d.ts +8 -0
- package/migrations/json-to-directory.d.ts.map +1 -0
- package/migrations/json-to-directory.js +151 -0
- package/migrations/json-to-directory.js.map +1 -0
- package/migrations/types.d.ts +46 -0
- package/migrations/types.d.ts.map +1 -0
- package/migrations/types.js +2 -0
- package/migrations/types.js.map +1 -0
- package/package.json +42 -0
- package/server.d.ts +5 -0
- package/server.d.ts.map +1 -0
- package/server.js +95 -0
- package/server.js.map +1 -0
- package/session/state.d.ts +29 -0
- package/session/state.d.ts.map +1 -0
- package/session/state.js +69 -0
- package/session/state.js.map +1 -0
- package/shrine/renderer/assets/index-C44XsM0B.js +4083 -0
- package/shrine/renderer/assets/index-DeRYP3aH.css +1 -0
- package/shrine/renderer/index.html +32 -0
- package/shrine/server/display-config.d.ts +20 -0
- package/shrine/server/display-config.d.ts.map +1 -0
- package/shrine/server/display-config.js +98 -0
- package/shrine/server/display-config.js.map +1 -0
- package/shrine/server/index.d.ts +35 -0
- package/shrine/server/index.d.ts.map +1 -0
- package/shrine/server/index.js +337 -0
- package/shrine/server/index.js.map +1 -0
- package/shrine/shared/approval-idle-logic.d.ts +17 -0
- package/shrine/shared/approval-idle-logic.d.ts.map +1 -0
- package/shrine/shared/approval-idle-logic.js +63 -0
- package/shrine/shared/approval-idle-logic.js.map +1 -0
- package/shrine/shared/approval-idle-logic.test.d.ts +2 -0
- package/shrine/shared/approval-idle-logic.test.d.ts.map +1 -0
- package/shrine/shared/approval-idle-logic.test.js +49 -0
- package/shrine/shared/approval-idle-logic.test.js.map +1 -0
- package/shrine/shared/kraken-detect.d.ts +36 -0
- package/shrine/shared/kraken-detect.d.ts.map +1 -0
- package/shrine/shared/kraken-detect.js +61 -0
- package/shrine/shared/kraken-detect.js.map +1 -0
- package/shrine/shared/kraken-detect.test.d.ts +2 -0
- package/shrine/shared/kraken-detect.test.d.ts.map +1 -0
- package/shrine/shared/kraken-detect.test.js +35 -0
- package/shrine/shared/kraken-detect.test.js.map +1 -0
- package/shrine/shared/shrine-api.d.ts +15 -0
- package/shrine/shared/shrine-api.d.ts.map +1 -0
- package/shrine/shared/shrine-api.js +2 -0
- package/shrine/shared/shrine-api.js.map +1 -0
- package/shrine/shared/shrine-display-config.d.ts +34 -0
- package/shrine/shared/shrine-display-config.d.ts.map +1 -0
- package/shrine/shared/shrine-display-config.js +197 -0
- package/shrine/shared/shrine-display-config.js.map +1 -0
- package/shrine/shared/shrine-display-config.test.d.ts +2 -0
- package/shrine/shared/shrine-display-config.test.d.ts.map +1 -0
- package/shrine/shared/shrine-display-config.test.js +53 -0
- package/shrine/shared/shrine-display-config.test.js.map +1 -0
- package/shrine/shared/shrine-state-colors.d.ts +4 -0
- package/shrine/shared/shrine-state-colors.d.ts.map +1 -0
- package/shrine/shared/shrine-state-colors.js +17 -0
- package/shrine/shared/shrine-state-colors.js.map +1 -0
- package/shrine/shared/shrine-surface.d.ts +32 -0
- package/shrine/shared/shrine-surface.d.ts.map +1 -0
- package/shrine/shared/shrine-surface.js +67 -0
- package/shrine/shared/shrine-surface.js.map +1 -0
- package/shrine/shared/shrine-surface.test.d.ts +2 -0
- package/shrine/shared/shrine-surface.test.d.ts.map +1 -0
- package/shrine/shared/shrine-surface.test.js +35 -0
- package/shrine/shared/shrine-surface.test.js.map +1 -0
- package/shrine/shared/state-socket-client.d.ts +30 -0
- package/shrine/shared/state-socket-client.d.ts.map +1 -0
- package/shrine/shared/state-socket-client.js +103 -0
- package/shrine/shared/state-socket-client.js.map +1 -0
- package/shrine/shared/state-socket-client.test.d.ts +2 -0
- package/shrine/shared/state-socket-client.test.d.ts.map +1 -0
- package/shrine/shared/state-socket-client.test.js +20 -0
- package/shrine/shared/state-socket-client.test.js.map +1 -0
- package/shrine/shared/types.d.ts +43 -0
- package/shrine/shared/types.d.ts.map +1 -0
- package/shrine/shared/types.js +58 -0
- package/shrine/shared/types.js.map +1 -0
- package/shrine/shared/types.test.d.ts +2 -0
- package/shrine/shared/types.test.d.ts.map +1 -0
- package/shrine/shared/types.test.js +26 -0
- package/shrine/shared/types.test.js.map +1 -0
- package/shrine/shared/vessel-resolver.d.ts +37 -0
- package/shrine/shared/vessel-resolver.d.ts.map +1 -0
- package/shrine/shared/vessel-resolver.js +135 -0
- package/shrine/shared/vessel-resolver.js.map +1 -0
- package/shrine/vendor/mcp.d.ts +3 -0
- package/shrine/vendor/mcp.d.ts.map +1 -0
- package/shrine/vendor/mcp.js +3 -0
- package/shrine/vendor/mcp.js.map +1 -0
- package/socket/expression.d.ts +3 -0
- package/socket/expression.d.ts.map +1 -0
- package/socket/expression.js +28 -0
- package/socket/expression.js.map +1 -0
- package/socket/protocol.d.ts +16 -0
- package/socket/protocol.d.ts.map +1 -0
- package/socket/protocol.js +75 -0
- package/socket/protocol.js.map +1 -0
- package/socket/server.d.ts +22 -0
- package/socket/server.d.ts.map +1 -0
- package/socket/server.js +184 -0
- package/socket/server.js.map +1 -0
- package/socket/types.d.ts +35 -0
- package/socket/types.d.ts.map +1 -0
- package/socket/types.js +18 -0
- package/socket/types.js.map +1 -0
- package/socket/visual-turn.d.ts +8 -0
- package/socket/visual-turn.d.ts.map +1 -0
- package/socket/visual-turn.js +27 -0
- package/socket/visual-turn.js.map +1 -0
- package/soul/injection.d.ts +13 -0
- package/soul/injection.d.ts.map +1 -0
- package/soul/injection.js +36 -0
- package/soul/injection.js.map +1 -0
- package/soul/reinject.d.ts +13 -0
- package/soul/reinject.d.ts.map +1 -0
- package/soul/reinject.js +28 -0
- package/soul/reinject.js.map +1 -0
- package/tools/handlers.d.ts +20 -0
- package/tools/handlers.d.ts.map +1 -0
- package/tools/handlers.js +148 -0
- package/tools/handlers.js.map +1 -0
- package/tools/register.d.ts +4 -0
- package/tools/register.d.ts.map +1 -0
- package/tools/register.js +48 -0
- package/tools/register.js.map +1 -0
- package/vendor/tool-state-pkg/index.d.ts +23 -0
- package/vendor/tool-state-pkg/index.d.ts.map +1 -0
- package/vendor/tool-state-pkg/index.js +140 -0
- package/vendor/tool-state-pkg/index.js.map +1 -0
- package/vendor/tool-state.d.ts +3 -0
- package/vendor/tool-state.d.ts.map +1 -0
- package/vendor/tool-state.js +3 -0
- package/vendor/tool-state.js.map +1 -0
- package/watch/filesystem.d.ts +7 -0
- package/watch/filesystem.d.ts.map +1 -0
- package/watch/filesystem.js +66 -0
- package/watch/filesystem.js.map +1 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SoulInjectionMessage {
|
|
2
|
+
role: 'user';
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
export interface SoulInjectionPayload {
|
|
6
|
+
type: 'soul_injection';
|
|
7
|
+
engram_id: string;
|
|
8
|
+
messages: SoulInjectionMessage[];
|
|
9
|
+
}
|
|
10
|
+
export declare function wrapSoulAsSystemReminder(soul: string): string;
|
|
11
|
+
export declare function buildSoulInjectionPayload(engramId: string, soul: string): SoulInjectionPayload;
|
|
12
|
+
export declare function isValidSoulInjectionPayload(value: unknown): value is SoulInjectionPayload;
|
|
13
|
+
//# sourceMappingURL=injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../../src/soul/injection.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,oBAAoB,EAAE,CAAC;CAClC;AAKD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAW9F;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAsBzF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const SYSTEM_REMINDER_OPEN = '<system-reminder>';
|
|
2
|
+
const SYSTEM_REMINDER_CLOSE = '</system-reminder>';
|
|
3
|
+
export function wrapSoulAsSystemReminder(soul) {
|
|
4
|
+
const prose = soul.replace(/\r\n/g, '\n').trim();
|
|
5
|
+
return `${SYSTEM_REMINDER_OPEN}\n${prose}\n${SYSTEM_REMINDER_CLOSE}`;
|
|
6
|
+
}
|
|
7
|
+
export function buildSoulInjectionPayload(engramId, soul) {
|
|
8
|
+
return {
|
|
9
|
+
type: 'soul_injection',
|
|
10
|
+
engram_id: engramId,
|
|
11
|
+
messages: [
|
|
12
|
+
{
|
|
13
|
+
role: 'user',
|
|
14
|
+
content: wrapSoulAsSystemReminder(soul),
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function isValidSoulInjectionPayload(value) {
|
|
20
|
+
if (!value || typeof value !== 'object') {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const payload = value;
|
|
24
|
+
if (payload.type !== 'soul_injection' || typeof payload.engram_id !== 'string') {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
if (!Array.isArray(payload.messages) || payload.messages.length === 0) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const first = payload.messages[0];
|
|
31
|
+
if (first.role !== 'user' || typeof first.content !== 'string') {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return (first.content.startsWith(SYSTEM_REMINDER_OPEN) && first.content.endsWith(SYSTEM_REMINDER_CLOSE));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection.js","sourceRoot":"","sources":["../../src/soul/injection.ts"],"names":[],"mappings":"AAWA,MAAM,oBAAoB,GAAG,mBAAmB,CAAC;AACjD,MAAM,qBAAqB,GAAG,oBAAoB,CAAC;AAEnD,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,OAAO,GAAG,oBAAoB,KAAK,KAAK,KAAK,qBAAqB,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,QAAgB,EAAE,IAAY;IACtE,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,QAAQ;QACnB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,wBAAwB,CAAC,IAAI,CAAC;aACxC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,KAA6B,CAAC;IAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CACL,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAChG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ReinjectStatus {
|
|
2
|
+
interval: number;
|
|
3
|
+
turns_since_injection: number;
|
|
4
|
+
due: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class ReinjectTracker {
|
|
7
|
+
private turnsSinceInjection;
|
|
8
|
+
reset(): void;
|
|
9
|
+
getTurnsSinceInjection(): number;
|
|
10
|
+
recordAssistantTurn(interval: number): boolean;
|
|
11
|
+
status(interval: number): ReinjectStatus;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=reinject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reinject.d.ts","sourceRoot":"","sources":["../../src/soul/reinject.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,GAAG,EAAE,OAAO,CAAC;CACd;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,mBAAmB,CAAK;IAEhC,KAAK,IAAI,IAAI;IAIb,sBAAsB,IAAI,MAAM;IAIhC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAc9C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;CAOzC"}
|
package/soul/reinject.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class ReinjectTracker {
|
|
2
|
+
turnsSinceInjection = 0;
|
|
3
|
+
reset() {
|
|
4
|
+
this.turnsSinceInjection = 0;
|
|
5
|
+
}
|
|
6
|
+
getTurnsSinceInjection() {
|
|
7
|
+
return this.turnsSinceInjection;
|
|
8
|
+
}
|
|
9
|
+
recordAssistantTurn(interval) {
|
|
10
|
+
if (interval <= 0) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
this.turnsSinceInjection += 1;
|
|
14
|
+
if (this.turnsSinceInjection >= interval) {
|
|
15
|
+
this.turnsSinceInjection = 0;
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
status(interval) {
|
|
21
|
+
return {
|
|
22
|
+
interval,
|
|
23
|
+
turns_since_injection: this.turnsSinceInjection,
|
|
24
|
+
due: interval > 0 && this.turnsSinceInjection >= interval,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=reinject.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reinject.js","sourceRoot":"","sources":["../../src/soul/reinject.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,eAAe;IAClB,mBAAmB,GAAG,CAAC,CAAC;IAEhC,KAAK;QACH,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,sBAAsB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,mBAAmB,CAAC,QAAgB;QAClC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,mBAAmB,IAAI,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,QAAgB;QACrB,OAAO;YACL,QAAQ;YACR,qBAAqB,EAAE,IAAI,CAAC,mBAAmB;YAC/C,GAAG,EAAE,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,IAAI,QAAQ;SAC1D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EidolaRuntimeConfig } from '../config.js';
|
|
2
|
+
import type { SessionState } from '../session/state.js';
|
|
3
|
+
import type { StateSocketServer } from '../socket/server.js';
|
|
4
|
+
export interface ToolTextResult {
|
|
5
|
+
ok: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
code?: string;
|
|
8
|
+
[key: string]: unknown;
|
|
9
|
+
}
|
|
10
|
+
export interface EidolaToolHandlers {
|
|
11
|
+
loadEidolon(engramId: string): Promise<ToolTextResult>;
|
|
12
|
+
getEidolon(): Promise<ToolTextResult>;
|
|
13
|
+
listEidolons(): Promise<ToolTextResult>;
|
|
14
|
+
setExpression(state: string): Promise<ToolTextResult>;
|
|
15
|
+
awaken(options?: {
|
|
16
|
+
surface?: string;
|
|
17
|
+
}): Promise<ToolTextResult>;
|
|
18
|
+
}
|
|
19
|
+
export declare function createToolHandlers(config: EidolaRuntimeConfig, session: SessionState, stateSocket?: StateSocketServer): EidolaToolHandlers;
|
|
20
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAMrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACvD,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IACtC,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,MAAM,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACjE;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,YAAY,EACrB,WAAW,CAAC,EAAE,iBAAiB,GAC9B,kBAAkB,CAQpB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { autoActivateFromWorkspace } from '../cursor/auto-activate.js';
|
|
2
|
+
import { launchShrine } from '../cursor/ensure-shrine.js';
|
|
3
|
+
import { detectSoulSource } from '../cursor/soul-source.js';
|
|
4
|
+
import { listEngramDirectories, resolveEngramDirectory } from '../engram/registry.js';
|
|
5
|
+
import { EngramLoadError } from '../engram/types.js';
|
|
6
|
+
import { resolveExpressionClip } from '../socket/expression.js';
|
|
7
|
+
import { buildSoulInjectionPayload } from '../soul/injection.js';
|
|
8
|
+
export function createToolHandlers(config, session, stateSocket) {
|
|
9
|
+
return {
|
|
10
|
+
loadEidolon: (engramId) => activateEidolon(config, session, engramId, stateSocket),
|
|
11
|
+
getEidolon: () => handleGetEidolon(session),
|
|
12
|
+
listEidolons: () => handleListEidolons(config),
|
|
13
|
+
setExpression: (state) => handleSetExpression(session, state, stateSocket),
|
|
14
|
+
awaken: (options) => handleAwaken(config, session, stateSocket, options),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
async function activateEidolon(config, session, engramId, stateSocket) {
|
|
18
|
+
let directory;
|
|
19
|
+
try {
|
|
20
|
+
directory = resolveEngramDirectory(config.engramsDir, engramId);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return toolError(error);
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const soulSource = await detectSoulSource(config.workspaceRoot, engramId);
|
|
27
|
+
const loaded = await session.load(directory, soulSource);
|
|
28
|
+
const soulInjection = soulSource === 'injection'
|
|
29
|
+
? buildSoulInjectionPayload(loaded.engram.id, loaded.soul)
|
|
30
|
+
: null;
|
|
31
|
+
const broadcast = stateSocket?.broadcastState({ state: 'success', surface: 'manual' });
|
|
32
|
+
return {
|
|
33
|
+
ok: true,
|
|
34
|
+
engram_id: loaded.engram.id,
|
|
35
|
+
name: loaded.engram.name,
|
|
36
|
+
soul_source: soulSource,
|
|
37
|
+
soul_injection: soulInjection,
|
|
38
|
+
expression: broadcast?.expression ?? loaded.vessel.expressions.success ?? 'responding.json',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof EngramLoadError) {
|
|
43
|
+
return {
|
|
44
|
+
ok: false,
|
|
45
|
+
error: error.message,
|
|
46
|
+
code: error.code,
|
|
47
|
+
engram_id: engramId,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return toolError(error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async function handleGetEidolon(session) {
|
|
54
|
+
const snapshot = session.snapshot();
|
|
55
|
+
if (!snapshot) {
|
|
56
|
+
return {
|
|
57
|
+
ok: false,
|
|
58
|
+
error: 'No active Eidolon. Call load_eidolon first.',
|
|
59
|
+
code: 'NO_ACTIVE_EIDOLON',
|
|
60
|
+
soul_source: 'none',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
ok: true,
|
|
65
|
+
...snapshot,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function handleListEidolons(paths) {
|
|
69
|
+
const entries = await listEngramDirectories(paths.engramsDir);
|
|
70
|
+
return {
|
|
71
|
+
ok: true,
|
|
72
|
+
engrams: entries.map((entry) => ({
|
|
73
|
+
id: entry.id,
|
|
74
|
+
name: entry.name,
|
|
75
|
+
description: entry.description,
|
|
76
|
+
directory: entry.directory,
|
|
77
|
+
})),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async function handleSetExpression(session, state, stateSocket) {
|
|
81
|
+
const trimmed = state.trim();
|
|
82
|
+
if (!trimmed) {
|
|
83
|
+
return {
|
|
84
|
+
ok: false,
|
|
85
|
+
error: 'Expression state must be a non-empty string.',
|
|
86
|
+
code: 'INVALID_EXPRESSION',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const active = session.getActive();
|
|
90
|
+
if (!active) {
|
|
91
|
+
return {
|
|
92
|
+
ok: false,
|
|
93
|
+
error: 'No active Eidolon. Call load_eidolon first.',
|
|
94
|
+
code: 'NO_ACTIVE_EIDOLON',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
session.setExpression(trimmed);
|
|
98
|
+
const clip = resolveExpressionClip(trimmed, active.vessel);
|
|
99
|
+
const broadcast = stateSocket?.broadcastState({ state: trimmed, surface: 'manual' });
|
|
100
|
+
return {
|
|
101
|
+
ok: true,
|
|
102
|
+
engram_id: active.engram.id,
|
|
103
|
+
expression: trimmed,
|
|
104
|
+
clip: broadcast?.expression ?? clip,
|
|
105
|
+
mapped: (broadcast?.expression ?? clip) !== null,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async function handleAwaken(config, session, stateSocket, options) {
|
|
109
|
+
const result = await launchShrine(config, undefined, {
|
|
110
|
+
requestedSurface: options?.surface,
|
|
111
|
+
});
|
|
112
|
+
if (result.skipped) {
|
|
113
|
+
return {
|
|
114
|
+
ok: false,
|
|
115
|
+
error: `Shrine launch skipped (${result.reason ?? 'unknown'})`,
|
|
116
|
+
code: 'SHRINE_LAUNCH_SKIPPED',
|
|
117
|
+
reason: result.reason,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const ok = result.launched || result.alreadyRunning;
|
|
121
|
+
if (ok) {
|
|
122
|
+
await autoActivateFromWorkspace(config, session, stateSocket);
|
|
123
|
+
}
|
|
124
|
+
const active = session.getActive();
|
|
125
|
+
const broadcast = ok && active
|
|
126
|
+
? stateSocket?.broadcastState({ state: 'success', surface: 'manual' })
|
|
127
|
+
: undefined;
|
|
128
|
+
return {
|
|
129
|
+
ok,
|
|
130
|
+
launched: result.launched,
|
|
131
|
+
already_running: result.alreadyRunning,
|
|
132
|
+
surface: result.surface,
|
|
133
|
+
pid: result.pid,
|
|
134
|
+
mode: result.mode,
|
|
135
|
+
url: result.url,
|
|
136
|
+
restarted: result.restarted,
|
|
137
|
+
...(broadcast?.expression ? { expression: broadcast.expression } : {}),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function toolError(error) {
|
|
141
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
142
|
+
return {
|
|
143
|
+
ok: false,
|
|
144
|
+
error: message,
|
|
145
|
+
code: 'INTERNAL_ERROR',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { EidolaToolHandlers } from './handlers.js';
|
|
3
|
+
export declare function registerEidolaTools(server: McpServer, handlers: EidolaToolHandlers): void;
|
|
4
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAaxD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CA8DzF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
function jsonResult(payload) {
|
|
3
|
+
return {
|
|
4
|
+
content: [
|
|
5
|
+
{
|
|
6
|
+
type: 'text',
|
|
7
|
+
text: JSON.stringify(payload, null, 2),
|
|
8
|
+
},
|
|
9
|
+
],
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function registerEidolaTools(server, handlers) {
|
|
13
|
+
server.registerTool('load_eidolon', {
|
|
14
|
+
title: 'Load Eidolon',
|
|
15
|
+
description: 'Load an Engram by id and inject its Soul as a system-reminder in the messages array.',
|
|
16
|
+
inputSchema: {
|
|
17
|
+
engram_id: z.string().describe('Engram directory id (e.g. camina-drummer)'),
|
|
18
|
+
},
|
|
19
|
+
}, async ({ engram_id }) => jsonResult(await handlers.loadEidolon(engram_id)));
|
|
20
|
+
server.registerTool('get_eidolon', {
|
|
21
|
+
title: 'Get Active Eidolon',
|
|
22
|
+
description: 'Return the active Eidolon metadata, vessel config, expression override, and reinject status.',
|
|
23
|
+
inputSchema: {},
|
|
24
|
+
}, async () => jsonResult(await handlers.getEidolon()));
|
|
25
|
+
server.registerTool('list_eidolons', {
|
|
26
|
+
title: 'List Eidolons',
|
|
27
|
+
description: 'Enumerate Engram directories available under engrams/.',
|
|
28
|
+
inputSchema: {},
|
|
29
|
+
}, async () => jsonResult(await handlers.listEidolons()));
|
|
30
|
+
server.registerTool('awaken', {
|
|
31
|
+
title: 'Awaken',
|
|
32
|
+
description: 'Start the Eidola Shrine HTTP server for browser-based display surfaces. Idempotent when the same surface is already running.',
|
|
33
|
+
inputSchema: {
|
|
34
|
+
surface: z
|
|
35
|
+
.string()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe('Shrine surface preset or alias — use "kraken" for NZXT Kraken LCD'),
|
|
38
|
+
},
|
|
39
|
+
}, async ({ surface }) => jsonResult(await handlers.awaken(surface ? { surface } : undefined)));
|
|
40
|
+
server.registerTool('set_expression', {
|
|
41
|
+
title: 'Set Expression',
|
|
42
|
+
description: 'Manually override the active Vessel expression state for testing.',
|
|
43
|
+
inputSchema: {
|
|
44
|
+
state: z.string().describe('Expression state key from vessel.yaml (e.g. idle, thinking)'),
|
|
45
|
+
},
|
|
46
|
+
}, async ({ state }) => jsonResult(await handlers.setExpression(state)));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,SAAS,UAAU,CAAC,OAAgB;IAClC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACvC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,QAA4B;IACjF,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,sFAAsF;QACxF,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;SAC5E;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAC3E,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,8FAA8F;QAChG,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC,CACpD,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,CAAC,CACtD,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EACT,8HAA8H;QAChI,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mEAAmE,CAAC;SACjF;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAC5F,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;SAC1F;KACF,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CACrE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const LEGACY_VESSEL_STATE_ALIASES: Record<string, string>;
|
|
2
|
+
/** Map legacy vessel state names to canonical keys. */
|
|
3
|
+
export declare function normalizeVesselState(state: string): string;
|
|
4
|
+
/** Remap legacy expression keys to canonical; prefer canonical when both exist. */
|
|
5
|
+
export declare function normalizeExpressionKeys(expressions: Record<string, string>): Record<string, string>;
|
|
6
|
+
export declare const TOOL_AWARE_STATES: readonly ["searching", "writing", "working"];
|
|
7
|
+
/** Semantic states that collapse to visual `working` after the first tool hook in a turn. */
|
|
8
|
+
export declare const WORKING_CLUSTER: readonly ["thinking", "searching", "writing", "working"];
|
|
9
|
+
export type WorkingClusterState = (typeof WORKING_CLUSTER)[number];
|
|
10
|
+
export declare function isWorkingClusterState(state: string): state is WorkingClusterState;
|
|
11
|
+
export interface ResolveVisualStateInput {
|
|
12
|
+
state: string;
|
|
13
|
+
firstToolStarted: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Map semantic vessel state + turn lock to a visual tier for renderer/clip playback. */
|
|
16
|
+
export declare function resolveVisualState({ state, firstToolStarted }: ResolveVisualStateInput): string;
|
|
17
|
+
export type ToolAwareState = (typeof TOOL_AWARE_STATES)[number];
|
|
18
|
+
export declare function isSkillPath(path: string): boolean;
|
|
19
|
+
export declare function extractReadPath(toolInput: unknown): string | undefined;
|
|
20
|
+
export declare function extractSubagentType(toolInput: unknown): string | undefined;
|
|
21
|
+
export declare function resolveStateFromTool(toolName: string | undefined, hookName: string, toolInput?: unknown): ToolAwareState;
|
|
22
|
+
export declare function refineGenericWorkingState(state: string, tool: string | undefined, toolInput?: unknown): string;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI9D,CAAC;AAEF,uDAAuD;AACvD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBxB;AAED,eAAO,MAAM,iBAAiB,8CAA+C,CAAC;AAE9E,6FAA6F;AAC7F,eAAO,MAAM,eAAe,0DAA2D,CAAC;AAExF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,mBAAmB,CAEjF;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,uBAAuB,GAAG,MAAM,CAQ/F;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAkChE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQjD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAetE;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAW1E;AAmBD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,OAAO,GAClB,cAAc,CAwBhB;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,SAAS,CAAC,EAAE,OAAO,GAClB,MAAM,CAMR"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export const LEGACY_VESSEL_STATE_ALIASES = {
|
|
2
|
+
completed: 'success',
|
|
3
|
+
confused: 'error',
|
|
4
|
+
alerting: 'attention',
|
|
5
|
+
};
|
|
6
|
+
/** Map legacy vessel state names to canonical keys. */
|
|
7
|
+
export function normalizeVesselState(state) {
|
|
8
|
+
return LEGACY_VESSEL_STATE_ALIASES[state] ?? state;
|
|
9
|
+
}
|
|
10
|
+
/** Remap legacy expression keys to canonical; prefer canonical when both exist. */
|
|
11
|
+
export function normalizeExpressionKeys(expressions) {
|
|
12
|
+
const result = {};
|
|
13
|
+
const legacyPending = [];
|
|
14
|
+
for (const [key, clip] of Object.entries(expressions)) {
|
|
15
|
+
const canonical = normalizeVesselState(key);
|
|
16
|
+
if (key === canonical) {
|
|
17
|
+
result[canonical] = clip;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
legacyPending.push([canonical, clip]);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
for (const [canonical, clip] of legacyPending) {
|
|
24
|
+
if (!(canonical in result)) {
|
|
25
|
+
result[canonical] = clip;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
export const TOOL_AWARE_STATES = ['searching', 'writing', 'working'];
|
|
31
|
+
/** Semantic states that collapse to visual `working` after the first tool hook in a turn. */
|
|
32
|
+
export const WORKING_CLUSTER = ['thinking', 'searching', 'writing', 'working'];
|
|
33
|
+
export function isWorkingClusterState(state) {
|
|
34
|
+
return WORKING_CLUSTER.includes(state);
|
|
35
|
+
}
|
|
36
|
+
/** Map semantic vessel state + turn lock to a visual tier for renderer/clip playback. */
|
|
37
|
+
export function resolveVisualState({ state, firstToolStarted }) {
|
|
38
|
+
if (isWorkingClusterState(state)) {
|
|
39
|
+
if (state === 'thinking' && !firstToolStarted) {
|
|
40
|
+
return 'thinking';
|
|
41
|
+
}
|
|
42
|
+
return 'working';
|
|
43
|
+
}
|
|
44
|
+
return state;
|
|
45
|
+
}
|
|
46
|
+
const SEARCH_TOOLS = new Set([
|
|
47
|
+
'Grep',
|
|
48
|
+
'Glob',
|
|
49
|
+
'Read',
|
|
50
|
+
'SemanticSearch',
|
|
51
|
+
'TabRead',
|
|
52
|
+
]);
|
|
53
|
+
const WRITE_TOOLS = new Set([
|
|
54
|
+
'Write',
|
|
55
|
+
'StrReplace',
|
|
56
|
+
'EditNotebook',
|
|
57
|
+
'Delete',
|
|
58
|
+
'TabWrite',
|
|
59
|
+
]);
|
|
60
|
+
const WORKING_TOOLS = new Set(['Shell', 'Task', 'CallMcpTool']);
|
|
61
|
+
const TOOL_AWARE_HOOKS = new Set([
|
|
62
|
+
'preToolUse',
|
|
63
|
+
'beforeShellExecution',
|
|
64
|
+
'beforeMCPExecution',
|
|
65
|
+
]);
|
|
66
|
+
const WORKING_HOOK_DEFAULT = 'working';
|
|
67
|
+
const SEARCH_SUBAGENT_TYPES = new Set(['explore', 'generalPurpose']);
|
|
68
|
+
function normalizePath(path) {
|
|
69
|
+
return path.replace(/\\/g, '/');
|
|
70
|
+
}
|
|
71
|
+
export function isSkillPath(path) {
|
|
72
|
+
const normalized = normalizePath(path);
|
|
73
|
+
return (normalized.endsWith('/SKILL.md') ||
|
|
74
|
+
normalized.endsWith('SKILL.md') ||
|
|
75
|
+
normalized.includes('/.cursor/skills/') ||
|
|
76
|
+
normalized.includes('/skills-cursor/'));
|
|
77
|
+
}
|
|
78
|
+
export function extractReadPath(toolInput) {
|
|
79
|
+
if (!toolInput || typeof toolInput !== 'object' || Array.isArray(toolInput)) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const input = toolInput;
|
|
83
|
+
if (typeof input.path === 'string' && input.path.length > 0) {
|
|
84
|
+
return input.path;
|
|
85
|
+
}
|
|
86
|
+
if (typeof input.file_path === 'string' && input.file_path.length > 0) {
|
|
87
|
+
return input.file_path;
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
export function extractSubagentType(toolInput) {
|
|
92
|
+
if (!toolInput || typeof toolInput !== 'object' || Array.isArray(toolInput)) {
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
const input = toolInput;
|
|
96
|
+
if (typeof input.subagent_type === 'string' && input.subagent_type.length > 0) {
|
|
97
|
+
return input.subagent_type;
|
|
98
|
+
}
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
function isMcpToolName(toolName) {
|
|
102
|
+
return toolName.startsWith('mcp__') || toolName.startsWith('mcp_');
|
|
103
|
+
}
|
|
104
|
+
function resolveTaskState(toolInput) {
|
|
105
|
+
const subagentType = extractSubagentType(toolInput);
|
|
106
|
+
if (subagentType && SEARCH_SUBAGENT_TYPES.has(subagentType)) {
|
|
107
|
+
return 'searching';
|
|
108
|
+
}
|
|
109
|
+
if (subagentType === 'shell') {
|
|
110
|
+
return 'working';
|
|
111
|
+
}
|
|
112
|
+
return 'working';
|
|
113
|
+
}
|
|
114
|
+
export function resolveStateFromTool(toolName, hookName, toolInput) {
|
|
115
|
+
if (toolName === 'Task') {
|
|
116
|
+
return resolveTaskState(toolInput);
|
|
117
|
+
}
|
|
118
|
+
if (toolName) {
|
|
119
|
+
if (SEARCH_TOOLS.has(toolName)) {
|
|
120
|
+
return 'searching';
|
|
121
|
+
}
|
|
122
|
+
if (WRITE_TOOLS.has(toolName)) {
|
|
123
|
+
return 'writing';
|
|
124
|
+
}
|
|
125
|
+
if (WORKING_TOOLS.has(toolName) || isMcpToolName(toolName)) {
|
|
126
|
+
return 'working';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (TOOL_AWARE_HOOKS.has(hookName)) {
|
|
130
|
+
return WORKING_HOOK_DEFAULT;
|
|
131
|
+
}
|
|
132
|
+
return WORKING_HOOK_DEFAULT;
|
|
133
|
+
}
|
|
134
|
+
export function refineGenericWorkingState(state, tool, toolInput) {
|
|
135
|
+
if (state !== 'working' || !tool) {
|
|
136
|
+
return state;
|
|
137
|
+
}
|
|
138
|
+
return resolveStateFromTool(tool, 'preToolUse', toolInput);
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAA2B;IACjE,SAAS,EAAE,SAAS;IACpB,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,WAAW;CACtB,CAAC;AAEF,uDAAuD;AACvD,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,2BAA2B,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AACrD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,uBAAuB,CACrC,WAAmC;IAEnC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,aAAa,GAA4B,EAAE,CAAC;IAElD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9C,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAE9E,6FAA6F;AAC7F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAU,CAAC;AAIxF,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAQ,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAOD,yFAAyF;AACzF,MAAM,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAA2B;IACrF,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,UAAU,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9C,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAID,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,MAAM;IACN,MAAM;IACN,MAAM;IACN,gBAAgB;IAChB,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,OAAO;IACP,YAAY;IACZ,cAAc;IACd,QAAQ;IACR,UAAU;CACX,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;AAEhE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,YAAY;IACZ,sBAAsB;IACtB,oBAAoB;CACrB,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAmB,SAAS,CAAC;AAEvD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAErE,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CACL,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAChC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/B,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACvC,UAAU,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAkB;IAChD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,SAAoC,CAAC;IACnD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAkB;IACpD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAG,SAAoC,CAAC;IACnD,IAAI,OAAO,KAAK,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9E,OAAO,KAAK,CAAC,aAAa,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,OAAO,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAmB;IAC3C,MAAM,YAAY,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,YAAY,IAAI,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5D,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAA4B,EAC5B,QAAgB,EAChB,SAAmB;IAEnB,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,IAAI,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3D,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAa,EACb,IAAwB,EACxB,SAAmB;IAEnB,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-state.d.ts","sourceRoot":"","sources":["../../src/vendor/tool-state.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-state.js","sourceRoot":"","sources":["../../src/vendor/tool-state.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EidolaPaths } from '../config.js';
|
|
2
|
+
import type { SessionState } from '../session/state.js';
|
|
3
|
+
export interface FilesystemWatchHandle {
|
|
4
|
+
close(): void;
|
|
5
|
+
}
|
|
6
|
+
export declare function watchEidolaPaths(paths: EidolaPaths, session: SessionState, onReload?: (reason: string) => void): FilesystemWatchHandle;
|
|
7
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/watch/filesystem.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,qBAAqB;IACpC,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,YAAY,EACrB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAClC,qBAAqB,CAoDvB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { watch } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { EngramLoadError } from '../engram/types.js';
|
|
4
|
+
const DEBOUNCE_MS = 250;
|
|
5
|
+
export function watchEidolaPaths(paths, session, onReload) {
|
|
6
|
+
const watchers = [];
|
|
7
|
+
const timers = new Map();
|
|
8
|
+
const scheduleReload = (label, directory) => {
|
|
9
|
+
const key = `${label}:${directory}`;
|
|
10
|
+
const existing = timers.get(key);
|
|
11
|
+
if (existing) {
|
|
12
|
+
clearTimeout(existing);
|
|
13
|
+
}
|
|
14
|
+
timers.set(key, setTimeout(() => {
|
|
15
|
+
timers.delete(key);
|
|
16
|
+
void reloadActive(session, onReload, `${label} change in ${directory}`);
|
|
17
|
+
}, DEBOUNCE_MS));
|
|
18
|
+
};
|
|
19
|
+
for (const directory of [paths.engramsDir, paths.vesselsDir]) {
|
|
20
|
+
try {
|
|
21
|
+
const watcher = watch(directory, { recursive: true }, (_event, filename) => {
|
|
22
|
+
if (!filename) {
|
|
23
|
+
scheduleReload('directory', directory);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
scheduleReload('file', join(directory, filename.toString()));
|
|
27
|
+
});
|
|
28
|
+
watcher.on('error', () => {
|
|
29
|
+
// Non-fatal — watcher may fail on some platforms for recursive watch.
|
|
30
|
+
});
|
|
31
|
+
watchers.push(watcher);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Directory may not exist yet; server still runs.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
close() {
|
|
39
|
+
for (const timer of timers.values()) {
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
}
|
|
42
|
+
timers.clear();
|
|
43
|
+
for (const watcher of watchers) {
|
|
44
|
+
watcher.close();
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
async function reloadActive(session, onReload, reason) {
|
|
50
|
+
const active = session.getActive();
|
|
51
|
+
if (!active) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
await session.reloadActive();
|
|
56
|
+
onReload?.(reason);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof EngramLoadError) {
|
|
60
|
+
onReload?.(`hot-reload failed: ${error.message}`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
onReload?.(`hot-reload failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/watch/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,MAAM,WAAW,GAAG,GAAG,CAAC;AAMxB,MAAM,UAAU,gBAAgB,CAC9B,KAAkB,EAClB,OAAqB,EACrB,QAAmC;IAEnC,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyC,CAAC;IAEhE,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,SAAiB,EAAE,EAAE;QAC1D,MAAM,GAAG,GAAG,GAAG,KAAK,IAAI,SAAS,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,QAAQ,EAAE,CAAC;YACb,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,CAAC,GAAG,CACR,GAAG,EACH,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,KAAK,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,cAAc,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC,EAAE,WAAW,CAAC,CAChB,CAAC;IACJ,CAAC,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;gBACzE,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;oBACvC,OAAO;gBACT,CAAC;gBAED,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvB,sEAAsE;YACxE,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK;YACH,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACpC,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;YACD,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,OAAqB,EACrB,QAAgD,EAChD,MAAc;IAEd,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAC7B,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;YACrC,QAAQ,EAAE,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,QAAQ,EAAE,CAAC,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC"}
|