@xrkseek/harness 0.5.11 → 0.5.13
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/node_modules/@vscode/ripgrep/LICENSE +13 -0
- package/node_modules/@vscode/ripgrep/README.md +33 -0
- package/node_modules/@vscode/ripgrep/lib/index.d.ts +1 -0
- package/node_modules/@vscode/ripgrep/lib/index.js +19 -0
- package/node_modules/@vscode/ripgrep/package.json +39 -0
- package/node_modules/@vscode/ripgrep-win32-x64/LICENSE +13 -0
- package/node_modules/@vscode/ripgrep-win32-x64/README.md +5 -0
- package/node_modules/@vscode/ripgrep-win32-x64/bin/rg.exe +0 -0
- package/node_modules/@vscode/ripgrep-win32-x64/package.json +19 -0
- package/node_modules/@xrkseek/core-agent-loop/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js +20 -5
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js +4 -2
- package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/index.d.ts +7 -9
- package/node_modules/@xrkseek/exec-fs/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/index.js +60 -19
- package/node_modules/@xrkseek/exec-fs/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/ripgrep.d.ts +63 -0
- package/node_modules/@xrkseek/exec-fs/dist/ripgrep.d.ts.map +1 -0
- package/node_modules/@xrkseek/exec-fs/dist/ripgrep.js +363 -0
- package/node_modules/@xrkseek/exec-fs/dist/ripgrep.js.map +1 -0
- package/node_modules/@xrkseek/exec-fs/dist/search.d.ts +32 -3
- package/node_modules/@xrkseek/exec-fs/dist/search.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/search.js +189 -72
- package/node_modules/@xrkseek/exec-fs/dist/search.js.map +1 -1
- package/node_modules/@xrkseek/exec-fs/package.json +2 -0
- package/node_modules/@xrkseek/exec-shell/dist/index.d.ts +14 -1
- package/node_modules/@xrkseek/exec-shell/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-shell/dist/index.js +37 -5
- package/node_modules/@xrkseek/exec-shell/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/exec-subprocess/dist/capture.d.ts +73 -0
- package/node_modules/@xrkseek/exec-subprocess/dist/capture.d.ts.map +1 -0
- package/node_modules/@xrkseek/exec-subprocess/dist/capture.js +240 -0
- package/node_modules/@xrkseek/exec-subprocess/dist/capture.js.map +1 -0
- package/node_modules/@xrkseek/exec-subprocess/dist/index.d.ts +19 -0
- package/node_modules/@xrkseek/exec-subprocess/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-subprocess/dist/index.js +58 -21
- package/node_modules/@xrkseek/exec-subprocess/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts +6 -7
- package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.js +14 -11
- package/node_modules/@xrkseek/preset-harness/dist/preset.js.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/preset-harness/package.json +1 -0
- package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/preset-server/dist/preset.d.ts.map +1 -1
- package/node_modules/@xrkseek/preset-server/dist/preset.js +4 -1
- package/node_modules/@xrkseek/preset-server/dist/preset.js.map +1 -1
- package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@xrkseek/server-config/dist/home.d.ts +1 -2
- package/node_modules/@xrkseek/server-config/dist/home.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-config/dist/home.js +1 -2
- package/node_modules/@xrkseek/server-config/dist/home.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.d.ts +6 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.js +28 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.d.ts +11 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.js +19 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts +38 -2
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js +178 -37
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.js +17 -6
- package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/collab-board.d.ts +41 -0
- package/node_modules/@xrkseek/server-face/dist/collab-board.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/collab-board.js +79 -0
- package/node_modules/@xrkseek/server-face/dist/collab-board.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/face-schema.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/face-schema.js +12 -2
- package/node_modules/@xrkseek/server-face/dist/face-schema.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/session.js +8 -12
- package/node_modules/@xrkseek/server-face/dist/handlers/session.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/team.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/team.js +13 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/team.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/index.d.ts +4 -2
- package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/index.js +4 -2
- package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/presence-dressing.d.ts +26 -0
- package/node_modules/@xrkseek/server-face/dist/presence-dressing.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/presence-dressing.js +84 -0
- package/node_modules/@xrkseek/server-face/dist/presence-dressing.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/presence-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/presence-tools.js +9 -5
- package/node_modules/@xrkseek/server-face/dist/presence-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/index.d.ts +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/index.js +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/index.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/registry.d.ts +2 -2
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.d.ts +15 -3
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js +23 -7
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/runtime.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/runtime.js +6 -4
- package/node_modules/@xrkseek/server-face/dist/runtime.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-status.d.ts +49 -1
- package/node_modules/@xrkseek/server-face/dist/session-status.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-status.js +89 -18
- package/node_modules/@xrkseek/server-face/dist/session-status.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-thread-message.d.ts +17 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-message.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-message.js +34 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-message.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-store.d.ts +2 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-thread-store.js +10 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-store.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts +15 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js +159 -7
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-document.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-document.js +36 -1
- package/node_modules/@xrkseek/server-face/dist/settings-document.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +28 -2
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-registry.d.ts +6 -0
- package/node_modules/@xrkseek/server-face/dist/subagent-registry.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-registry.js +18 -0
- package/node_modules/@xrkseek/server-face/dist/subagent-registry.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +2 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/ws-send-queue.d.ts +10 -0
- package/node_modules/@xrkseek/server-face/dist/ws-send-queue.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/ws-send-queue.js +68 -3
- package/node_modules/@xrkseek/server-face/dist/ws-send-queue.js.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/index.d.ts +13 -8
- package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/index.js +30 -28
- package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/skills.d.ts +1 -1
- package/node_modules/@xrkseek/workspace/dist/skills.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/skills.js +1 -1
- package/node_modules/@xrkseek/workspace/dist/skills.js.map +1 -1
- package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.d.ts +1 -1
- package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.d.ts.map +1 -1
- package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.js +23 -1
- package/node_modules/@xrkseek/xrk-file-reference-local/dist/search.js.map +1 -1
- package/package.json +5 -1
|
@@ -10,8 +10,7 @@ export declare function hostSettingsPath(env?: NodeJS.ProcessEnv): string;
|
|
|
10
10
|
export declare function defaultPluginsDir(env?: NodeJS.ProcessEnv): string;
|
|
11
11
|
/**
|
|
12
12
|
* `{home}/spill` — tool-result / session-reference / pipeline tool-output
|
|
13
|
-
* persist root. Host lists
|
|
14
|
-
* `hostReadableRoots`.
|
|
13
|
+
* persist root. Covered when Host lists `{XRK_HOME}` in `hostReadableRoots`.
|
|
15
14
|
*/
|
|
16
15
|
export declare function defaultSpillDir(env?: NodeJS.ProcessEnv): string;
|
|
17
16
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AASA,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED
|
|
1
|
+
{"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AASA,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,wBAAgB,kBAAkB,CAChC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAER;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAGR;AAaD,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IACrC,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CAezE"}
|
|
@@ -24,8 +24,7 @@ export function defaultPluginsDir(env = process.env) {
|
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* `{home}/spill` — tool-result / session-reference / pipeline tool-output
|
|
27
|
-
* persist root. Host lists
|
|
28
|
-
* `hostReadableRoots`.
|
|
27
|
+
* persist root. Covered when Host lists `{XRK_HOME}` in `hostReadableRoots`.
|
|
29
28
|
*/
|
|
30
29
|
export function defaultSpillDir(env = process.env) {
|
|
31
30
|
return path.join(resolveXrkHome(env), "spill");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.js","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,gFAAgF;AAChF,MAAM,UAAU,kBAAkB,CAChC,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,CAAC;AACpD,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAC9B,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../src/home.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,12 @@ import type { SessionEvent } from "@xrkseek/protocol";
|
|
|
10
10
|
export declare const DEFAULT_HISTORY_MAX_MESSAGES = 50;
|
|
11
11
|
/** Inclusive 0-based start index of one transcript message's supporting events. */
|
|
12
12
|
export declare function messageGroupStartIndex(events: readonly SessionEvent[], messageIndex: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Inclusive index of the owning `turn/start` for the event at `fromIndex`.
|
|
15
|
+
* A message-count cut can land on a later assistant of the same Host turn;
|
|
16
|
+
* the rail and installWindow need that turn's opener in the page.
|
|
17
|
+
*/
|
|
18
|
+
export declare function owningTurnStartIndex(events: readonly SessionEvent[], fromIndex: number): number;
|
|
13
19
|
/**
|
|
14
20
|
* Slice one backwards history page from the session log.
|
|
15
21
|
* @returns page events and whether older pages exist.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-paginate.d.ts","sourceRoot":"","sources":["../../src/adapt/history-paginate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wFAAwF;AACxF,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAiB/C,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,YAAY,EAAE,MAAM,GACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"history-paginate.d.ts","sourceRoot":"","sources":["../../src/adapt/history-paginate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,wFAAwF;AACxF,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAiB/C,mFAAmF;AACnF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,YAAY,EAAE,MAAM,GACnB,MAAM,CA0CR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,GAChB,MAAM,CAYR;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM,GAClB;IACD,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAgCA;AAED;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,GAAE,MAAqC,GACjD;IACD,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAOA;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,YAAY,EAAE,CAwBhB"}
|
|
@@ -25,7 +25,11 @@ export function messageGroupStartIndex(events, messageIndex) {
|
|
|
25
25
|
const event = events[i];
|
|
26
26
|
if (event === undefined || MESSAGE_TYPES.has(event.type))
|
|
27
27
|
break;
|
|
28
|
+
if (event.type === "turn/end")
|
|
29
|
+
break;
|
|
28
30
|
start = i;
|
|
31
|
+
if (event.type === "turn/start")
|
|
32
|
+
break;
|
|
29
33
|
}
|
|
30
34
|
if (msg.type === "user/message") {
|
|
31
35
|
for (let i = start - 1; i >= 0; i--) {
|
|
@@ -58,6 +62,29 @@ export function messageGroupStartIndex(events, messageIndex) {
|
|
|
58
62
|
}
|
|
59
63
|
return start;
|
|
60
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Inclusive index of the owning `turn/start` for the event at `fromIndex`.
|
|
67
|
+
* A message-count cut can land on a later assistant of the same Host turn;
|
|
68
|
+
* the rail and installWindow need that turn's opener in the page.
|
|
69
|
+
*/
|
|
70
|
+
export function owningTurnStartIndex(events, fromIndex) {
|
|
71
|
+
const origin = events[fromIndex];
|
|
72
|
+
if (origin === undefined)
|
|
73
|
+
return fromIndex;
|
|
74
|
+
const turnId = origin.turnId;
|
|
75
|
+
if (typeof turnId !== "string" || turnId.length === 0)
|
|
76
|
+
return fromIndex;
|
|
77
|
+
for (let i = fromIndex; i >= 0; i--) {
|
|
78
|
+
const event = events[i];
|
|
79
|
+
if (event === undefined)
|
|
80
|
+
break;
|
|
81
|
+
if (event.type === "turn/start" && event.turnId === turnId)
|
|
82
|
+
return i;
|
|
83
|
+
if (event.type === "turn/start")
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
return fromIndex;
|
|
87
|
+
}
|
|
61
88
|
/**
|
|
62
89
|
* Slice one backwards history page from the session log.
|
|
63
90
|
* @returns page events and whether older pages exist.
|
|
@@ -86,7 +113,7 @@ export function paginateSessionHistory(events, beforeSeq, maxMessages) {
|
|
|
86
113
|
count++;
|
|
87
114
|
const groupStart = messageGroupStartIndex(window, i);
|
|
88
115
|
if (count >= maxMessages) {
|
|
89
|
-
cutIndex = groupStart;
|
|
116
|
+
cutIndex = owningTurnStartIndex(window, groupStart);
|
|
90
117
|
break;
|
|
91
118
|
}
|
|
92
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-paginate.js","sourceRoot":"","sources":["../../src/adapt/history-paginate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,wFAAwF;AACxF,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE7E,SAAS,QAAQ,CAAC,KAAa;IAC7B,OAAO,KAAK,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CACnB,IAAkB,EAClB,MAAc,EACd,MAAc;IAEd,MAAM,GAAG,GAAG,IAA4C,CAAC;IACzD,OAAO,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC;AACxD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,sBAAsB,CACpC,MAA+B,EAC/B,YAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC;IAE3E,IAAI,KAAK,GAAG,YAAY,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM;QAChE,KAAK,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"history-paginate.js","sourceRoot":"","sources":["../../src/adapt/history-paginate.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,17 @@ export declare class FaceWireIdMaps {
|
|
|
9
9
|
private readonly stepCount;
|
|
10
10
|
turn(sessionId: string, turnId: string): number;
|
|
11
11
|
step(sessionId: string, turnId: string, stepId: string): number;
|
|
12
|
+
/**
|
|
13
|
+
* Number every turn/step in durable log order. History must call this
|
|
14
|
+
* before wiring a tail page — otherwise the first `turn/start` in the
|
|
15
|
+
* window becomes wire `1`, and a later loadOlder assigns the real first
|
|
16
|
+
* 轮次 a late number (the 0.5.11 opener showing as 第 5 轮).
|
|
17
|
+
*/
|
|
18
|
+
primeFromLog(sessionId: string, events: readonly {
|
|
19
|
+
readonly type: string;
|
|
20
|
+
readonly turnId?: string;
|
|
21
|
+
readonly stepId?: string;
|
|
22
|
+
}[]): void;
|
|
12
23
|
/**
|
|
13
24
|
* Drop every session-scoped bucket for one session. Called on session
|
|
14
25
|
* eviction so long-running hosts do not retain turn/step counters for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-ids.d.ts","sourceRoot":"","sources":["../../src/adapt/wire-ids.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAc/C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAgB/D;;;;OAIG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAU/B"}
|
|
1
|
+
{"version":3,"file":"wire-ids.d.ts","sourceRoot":"","sources":["../../src/adapt/wire-ids.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IAEvD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAc/C,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAgB/D;;;;;OAKG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI;IAevI;;;;OAIG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAU/B"}
|
|
@@ -37,6 +37,25 @@ export class FaceWireIdMaps {
|
|
|
37
37
|
byStep.set(key, n);
|
|
38
38
|
return n;
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Number every turn/step in durable log order. History must call this
|
|
42
|
+
* before wiring a tail page — otherwise the first `turn/start` in the
|
|
43
|
+
* window becomes wire `1`, and a later loadOlder assigns the real first
|
|
44
|
+
* 轮次 a late number (the 0.5.11 opener showing as 第 5 轮).
|
|
45
|
+
*/
|
|
46
|
+
primeFromLog(sessionId, events) {
|
|
47
|
+
this.clear(sessionId);
|
|
48
|
+
for (const event of events) {
|
|
49
|
+
if (event.type === "turn/start" && typeof event.turnId === "string") {
|
|
50
|
+
this.turn(sessionId, event.turnId);
|
|
51
|
+
}
|
|
52
|
+
else if (event.type === "step/start"
|
|
53
|
+
&& typeof event.turnId === "string"
|
|
54
|
+
&& typeof event.stepId === "string") {
|
|
55
|
+
this.step(sessionId, event.turnId, event.stepId);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
40
59
|
/**
|
|
41
60
|
* Drop every session-scoped bucket for one session. Called on session
|
|
42
61
|
* eviction so long-running hosts do not retain turn/step counters for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-ids.js","sourceRoot":"","sources":["../../src/adapt/wire-ids.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,cAAc;IACR,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/C,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC/C,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvD,IAAI,CAAC,SAAiB,EAAE,MAAc;QACpC,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,SAAiB,EAAE,MAAc,EAAE,MAAc;QACpD,MAAM,GAAG,GAAG,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC;QACnC,IAAI,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QAClC,MAAM,QAAQ,GAAG,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnB,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAiB;QACrB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,oFAAoF;QACpF,MAAM,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"wire-ids.js","sourceRoot":"","sources":["../../src/adapt/wire-ids.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type AgentTeamSpawnRole } from "./agent-team-roles.js";
|
|
2
|
+
import { type PresenceSticker } from "./presence-dressing.js";
|
|
2
3
|
export declare const MEMBER_NAME_MAX = 40;
|
|
3
4
|
export declare const MEMBER_PLAYBOOK_MAX = 8000;
|
|
4
5
|
export declare const MEMBER_FACE_MAX = 80000;
|
|
@@ -15,10 +16,17 @@ export type MemberInject = "subagent" | "minimal";
|
|
|
15
16
|
export interface MemberAppearance {
|
|
16
17
|
readonly shape: MemberShape;
|
|
17
18
|
readonly color: MemberColor;
|
|
18
|
-
/** Optional overlay kit (`none` omitted).
|
|
19
|
+
/** Optional overlay kit (`none` omitted). PNG overlays are separate. */
|
|
19
20
|
readonly kit?: Exclude<MemberKit, "none">;
|
|
20
|
-
/**
|
|
21
|
+
/** @deprecated Use `overlayHat`. Still read as the hat layer. */
|
|
21
22
|
readonly face?: string;
|
|
23
|
+
readonly overlayHat?: string;
|
|
24
|
+
readonly overlayGlasses?: string;
|
|
25
|
+
readonly overlayHeld?: string;
|
|
26
|
+
/** Slot pick: builtin id or `sticker:<id>`. */
|
|
27
|
+
readonly kitHat?: string;
|
|
28
|
+
readonly kitGlasses?: string;
|
|
29
|
+
readonly kitHeld?: string;
|
|
22
30
|
}
|
|
23
31
|
export interface MemberToolPolicy {
|
|
24
32
|
readonly mode: "allow" | "deny";
|
|
@@ -39,12 +47,39 @@ export interface AgentRosterMember {
|
|
|
39
47
|
}
|
|
40
48
|
export type ListedRosterMember = AgentRosterMember & {
|
|
41
49
|
readonly scope: RosterScope;
|
|
50
|
+
/** Catalog example id (`mem_seed_*`), even after the user edits and `seed` drops. */
|
|
51
|
+
readonly catalog?: true;
|
|
42
52
|
};
|
|
53
|
+
export declare function isCatalogSeedMemberId(id: string): boolean;
|
|
54
|
+
/** Built-in catalog ids cannot be updated or deleted; mint a new id to fork. */
|
|
55
|
+
export declare function catalogMemberWriteProblem(raw: unknown): string | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* `mem_`-prefixed id, or `undefined` when none was given (caller mints one).
|
|
58
|
+
* A natural id (`xrk-releaseer`) gets the prefix rather than being dropped;
|
|
59
|
+
* what still cannot match is the caller's bug — ask {@link memberIdProblem}
|
|
60
|
+
* instead of silently handing back a different id.
|
|
61
|
+
*/
|
|
62
|
+
export declare function normalizeMemberId(raw: unknown): string | undefined;
|
|
63
|
+
/** Non-empty when a supplied id can never be valid — surface it, don't blame name/playbook. */
|
|
64
|
+
export declare function memberIdProblem(raw: unknown): string | undefined;
|
|
43
65
|
/** Default allow-list for a file-only 干员 (release / inspect). */
|
|
44
66
|
export declare const MEMBER_FILE_TOOLS: readonly ["bash", "read", "grep", "glob"];
|
|
45
67
|
export declare function parseRosterScope(raw: unknown): RosterScope;
|
|
46
68
|
export declare function rosterRoot(productHome?: string): string;
|
|
69
|
+
/** Transparent PNG/JPEG/WebP/GIF data URL used as a kit overlay (hat / glasses / held). */
|
|
70
|
+
export declare function parseOverlayImage(raw: unknown): string | undefined;
|
|
47
71
|
export declare function parseMemberAppearance(raw: unknown, fallback: MemberAppearance): MemberAppearance;
|
|
72
|
+
export declare function appearanceLookWire(look: MemberAppearance, stickers?: readonly PresenceSticker[]): {
|
|
73
|
+
readonly shape: string;
|
|
74
|
+
readonly color: string;
|
|
75
|
+
readonly kit?: string;
|
|
76
|
+
readonly kitHat?: string;
|
|
77
|
+
readonly kitGlasses?: string;
|
|
78
|
+
readonly kitHeld?: string;
|
|
79
|
+
readonly overlayHat?: string;
|
|
80
|
+
readonly overlayGlasses?: string;
|
|
81
|
+
readonly overlayHeld?: string;
|
|
82
|
+
};
|
|
48
83
|
export declare function parseMemberToolPolicy(raw: unknown): MemberToolPolicy | undefined;
|
|
49
84
|
export declare function parseMemberInject(raw: unknown, fallback: MemberInject): MemberInject;
|
|
50
85
|
/** Deny-only: a 干员 may weaken the parent preset, never add tools. */
|
|
@@ -63,6 +98,7 @@ export declare function rosterPublicFields(row: ListedRosterMember): {
|
|
|
63
98
|
brief: string;
|
|
64
99
|
inject: MemberInject;
|
|
65
100
|
seed: boolean;
|
|
101
|
+
catalog: boolean;
|
|
66
102
|
appearance: MemberAppearance;
|
|
67
103
|
};
|
|
68
104
|
export declare function formatRosterCatalog(members: readonly ListedRosterMember[]): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-roster-store.d.ts","sourceRoot":"","sources":["../src/agent-roster-store.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-roster-store.d.ts","sourceRoot":"","sources":["../src/agent-roster-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ import path from "node:path";
|
|
|
10
10
|
import { resolveXrkHome } from "@xrkseek/server-config";
|
|
11
11
|
import { isAgentTeamSpawnRole, roleDeniedTools, } from "./agent-team-roles.js";
|
|
12
12
|
import { tryWriteJsonSidecar } from "./json-sidecar.js";
|
|
13
|
+
import { GLASSES_BUILTINS, HAT_BUILTINS, HELD_BUILTINS, parseSlotPick, resolveEnginePick, resolveStickerOverlay, splitLegacyKit, stickerIdFromPick, } from "./presence-dressing.js";
|
|
13
14
|
export const MEMBER_NAME_MAX = 40;
|
|
14
15
|
export const MEMBER_PLAYBOOK_MAX = 8_000;
|
|
15
16
|
export const MEMBER_FACE_MAX = 80_000;
|
|
@@ -65,8 +66,60 @@ export const MEMBER_KITS = [
|
|
|
65
66
|
"specs-sun",
|
|
66
67
|
"halo",
|
|
67
68
|
];
|
|
69
|
+
const CATALOG_SEED_MEMBER_IDS = new Set([
|
|
70
|
+
"mem_seed_researcher",
|
|
71
|
+
"mem_seed_worker",
|
|
72
|
+
"mem_seed_reviewer",
|
|
73
|
+
"mem_seed_lead",
|
|
74
|
+
"mem_seed_scout",
|
|
75
|
+
"mem_seed_docs",
|
|
76
|
+
"mem_seed_fixer",
|
|
77
|
+
"mem_seed_tester",
|
|
78
|
+
]);
|
|
79
|
+
export function isCatalogSeedMemberId(id) {
|
|
80
|
+
return CATALOG_SEED_MEMBER_IDS.has(id);
|
|
81
|
+
}
|
|
82
|
+
/** Built-in catalog ids cannot be updated or deleted; mint a new id to fork. */
|
|
83
|
+
export function catalogMemberWriteProblem(raw) {
|
|
84
|
+
const trimmed = typeof raw === "string" ? raw.trim() : "";
|
|
85
|
+
if (!trimmed)
|
|
86
|
+
return undefined;
|
|
87
|
+
const id = normalizeMemberId(trimmed);
|
|
88
|
+
if (!id || !isCatalogSeedMemberId(id))
|
|
89
|
+
return undefined;
|
|
90
|
+
return `catalog member ${id} is built-in; omit id to mint a new role from that template`;
|
|
91
|
+
}
|
|
92
|
+
function listedMember(row, scope) {
|
|
93
|
+
return {
|
|
94
|
+
...row,
|
|
95
|
+
scope,
|
|
96
|
+
...(isCatalogSeedMemberId(row.id) ? { catalog: true } : {}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
68
99
|
const ID_RE = /^mem_[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/;
|
|
69
100
|
const TOOL_NAME_RE = /^[a-zA-Z][a-zA-Z0-9._-]{0,63}$/;
|
|
101
|
+
/**
|
|
102
|
+
* `mem_`-prefixed id, or `undefined` when none was given (caller mints one).
|
|
103
|
+
* A natural id (`xrk-releaseer`) gets the prefix rather than being dropped;
|
|
104
|
+
* what still cannot match is the caller's bug — ask {@link memberIdProblem}
|
|
105
|
+
* instead of silently handing back a different id.
|
|
106
|
+
*/
|
|
107
|
+
export function normalizeMemberId(raw) {
|
|
108
|
+
const trimmed = typeof raw === "string" ? raw.trim() : "";
|
|
109
|
+
if (!trimmed)
|
|
110
|
+
return undefined;
|
|
111
|
+
if (ID_RE.test(trimmed))
|
|
112
|
+
return trimmed;
|
|
113
|
+
const prefixed = `mem_${trimmed}`;
|
|
114
|
+
return ID_RE.test(prefixed) ? prefixed : undefined;
|
|
115
|
+
}
|
|
116
|
+
/** Non-empty when a supplied id can never be valid — surface it, don't blame name/playbook. */
|
|
117
|
+
export function memberIdProblem(raw) {
|
|
118
|
+
const trimmed = typeof raw === "string" ? raw.trim() : "";
|
|
119
|
+
if (!trimmed || normalizeMemberId(trimmed))
|
|
120
|
+
return undefined;
|
|
121
|
+
return `invalid id "${trimmed}": expected mem_ then [A-Za-z0-9][A-Za-z0-9._-]* (max 64 chars); omit id to mint one`;
|
|
122
|
+
}
|
|
70
123
|
/** Default allow-list for a file-only 干员 (release / inspect). */
|
|
71
124
|
export const MEMBER_FILE_TOOLS = ["bash", "read", "grep", "glob"];
|
|
72
125
|
export function parseRosterScope(raw) {
|
|
@@ -100,7 +153,8 @@ function isMemberColor(value) {
|
|
|
100
153
|
function isMemberKit(value) {
|
|
101
154
|
return MEMBER_KITS.includes(value);
|
|
102
155
|
}
|
|
103
|
-
|
|
156
|
+
/** Transparent PNG/JPEG/WebP/GIF data URL used as a kit overlay (hat / glasses / held). */
|
|
157
|
+
export function parseOverlayImage(raw) {
|
|
104
158
|
if (typeof raw !== "string")
|
|
105
159
|
return undefined;
|
|
106
160
|
const face = raw.trim();
|
|
@@ -111,6 +165,12 @@ function parseFace(raw) {
|
|
|
111
165
|
}
|
|
112
166
|
return face.replace(/\s+/g, "");
|
|
113
167
|
}
|
|
168
|
+
function pickOverlay(base, key, fallback) {
|
|
169
|
+
if (Object.prototype.hasOwnProperty.call(base, key)) {
|
|
170
|
+
return parseOverlayImage(base[key]);
|
|
171
|
+
}
|
|
172
|
+
return fallback;
|
|
173
|
+
}
|
|
114
174
|
export function parseMemberAppearance(raw, fallback) {
|
|
115
175
|
const base = raw && typeof raw === "object" && !Array.isArray(raw)
|
|
116
176
|
? raw
|
|
@@ -121,14 +181,59 @@ export function parseMemberAppearance(raw, fallback) {
|
|
|
121
181
|
? base.kit
|
|
122
182
|
: fallback.kit;
|
|
123
183
|
const kit = isMemberKit(kitRaw) && kitRaw !== "none" ? kitRaw : undefined;
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
184
|
+
const overlayHat = pickOverlay(base, "overlayHat", fallback.overlayHat)
|
|
185
|
+
?? (Object.prototype.hasOwnProperty.call(base, "face")
|
|
186
|
+
? parseOverlayImage(base.face)
|
|
187
|
+
: fallback.face);
|
|
188
|
+
const overlayGlasses = pickOverlay(base, "overlayGlasses", fallback.overlayGlasses);
|
|
189
|
+
const overlayHeld = pickOverlay(base, "overlayHeld", fallback.overlayHeld);
|
|
190
|
+
const split = splitLegacyKit(kit);
|
|
191
|
+
const kitHat = parseSlotPick(base.kitHat ?? fallback.kitHat, HAT_BUILTINS)
|
|
192
|
+
?? (split.hat !== "none" ? split.hat : undefined);
|
|
193
|
+
const kitGlasses = parseSlotPick(base.kitGlasses ?? fallback.kitGlasses, GLASSES_BUILTINS)
|
|
194
|
+
?? (split.glasses !== "none" ? split.glasses : undefined);
|
|
195
|
+
const kitHeld = parseSlotPick(base.kitHeld ?? fallback.kitHeld, HELD_BUILTINS);
|
|
127
196
|
return {
|
|
128
197
|
shape,
|
|
129
198
|
color,
|
|
130
199
|
...(kit ? { kit } : {}),
|
|
131
|
-
...(
|
|
200
|
+
...(kitHat && kitHat !== "none" ? { kitHat } : {}),
|
|
201
|
+
...(kitGlasses && kitGlasses !== "none" ? { kitGlasses } : {}),
|
|
202
|
+
...(kitHeld && kitHeld !== "none" ? { kitHeld } : {}),
|
|
203
|
+
...(overlayHat ? { overlayHat, face: overlayHat } : {}),
|
|
204
|
+
...(overlayGlasses ? { overlayGlasses } : {}),
|
|
205
|
+
...(overlayHeld ? { overlayHeld } : {}),
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
export function appearanceLookWire(look, stickers = []) {
|
|
209
|
+
const split = splitLegacyKit(look.kit);
|
|
210
|
+
const kitHat = look.kitHat ?? split.hat;
|
|
211
|
+
const kitGlasses = look.kitGlasses ?? split.glasses;
|
|
212
|
+
const kitHeld = look.kitHeld ?? "none";
|
|
213
|
+
const hatOverlay = resolveStickerOverlay(kitHat, stickers)
|
|
214
|
+
?? (stickerIdFromPick(kitHat) ? undefined : look.overlayHat ?? look.face);
|
|
215
|
+
const glassesOverlay = resolveStickerOverlay(kitGlasses, stickers)
|
|
216
|
+
?? (stickerIdFromPick(kitGlasses) ? undefined : look.overlayGlasses);
|
|
217
|
+
const heldOverlay = resolveStickerOverlay(kitHeld, stickers)
|
|
218
|
+
?? (stickerIdFromPick(kitHeld) ? undefined : look.overlayHeld);
|
|
219
|
+
const engineHat = resolveEnginePick(kitHat, HAT_BUILTINS);
|
|
220
|
+
const engineGlasses = resolveEnginePick(kitGlasses, GLASSES_BUILTINS);
|
|
221
|
+
const engineHeld = resolveEnginePick(kitHeld, HELD_BUILTINS);
|
|
222
|
+
const kit = engineHat !== "none"
|
|
223
|
+
? engineHat
|
|
224
|
+
: engineGlasses !== "none"
|
|
225
|
+
? engineGlasses
|
|
226
|
+
: look.kit;
|
|
227
|
+
return {
|
|
228
|
+
shape: look.shape,
|
|
229
|
+
color: look.color,
|
|
230
|
+
...(kit ? { kit } : {}),
|
|
231
|
+
...(engineHat !== "none" ? { kitHat: engineHat } : {}),
|
|
232
|
+
...(engineGlasses !== "none" ? { kitGlasses: engineGlasses } : {}),
|
|
233
|
+
...(engineHeld !== "none" ? { kitHeld: engineHeld } : {}),
|
|
234
|
+
...(hatOverlay ? { overlayHat: hatOverlay } : {}),
|
|
235
|
+
...(glassesOverlay ? { overlayGlasses: glassesOverlay } : {}),
|
|
236
|
+
...(heldOverlay ? { overlayHeld: heldOverlay } : {}),
|
|
132
237
|
};
|
|
133
238
|
}
|
|
134
239
|
export function parseMemberToolPolicy(raw) {
|
|
@@ -186,6 +291,7 @@ export function rosterPublicFields(row) {
|
|
|
186
291
|
brief: row.brief,
|
|
187
292
|
inject: row.inject,
|
|
188
293
|
seed: row.seed === true,
|
|
294
|
+
catalog: row.catalog === true,
|
|
189
295
|
appearance: row.appearance,
|
|
190
296
|
...(row.tools ? { tools: row.tools } : {}),
|
|
191
297
|
};
|
|
@@ -201,38 +307,18 @@ export function formatRosterCatalog(members) {
|
|
|
201
307
|
: pub.tools?.mode === "deny"
|
|
202
308
|
? ` deny=${pub.tools.names.join(",")}`
|
|
203
309
|
: "";
|
|
204
|
-
return `- ${pub.id} [${pub.scope}] ${pub.name} · ${pub.role} · inject=${pub.inject} · ${pub.brief}${tools}`;
|
|
310
|
+
return `- ${pub.id} [${pub.scope}] ${pub.name} · ${pub.role} · inject=${pub.inject} · ${pub.brief}${tools}${pub.catalog ? " · catalog" : ""}`;
|
|
205
311
|
})
|
|
206
312
|
.join("\n")
|
|
207
313
|
.slice(0, 2_400);
|
|
208
314
|
}
|
|
209
|
-
function sameSeedBody(a, b) {
|
|
210
|
-
return (a.name === b.name &&
|
|
211
|
-
a.role === b.role &&
|
|
212
|
-
a.brief === b.brief &&
|
|
213
|
-
a.inject === b.inject &&
|
|
214
|
-
a.playbook === b.playbook &&
|
|
215
|
-
JSON.stringify(a.appearance) === JSON.stringify(b.appearance) &&
|
|
216
|
-
JSON.stringify(a.tools ?? null) === JSON.stringify(b.tools ?? null));
|
|
217
|
-
}
|
|
218
315
|
export function mergeGlobalSeedMembers(existing, now = Date.now()) {
|
|
219
316
|
const catalog = seedGlobalRosterMembers(now);
|
|
220
317
|
const leftover = new Map(existing.map((row) => [row.id, row]));
|
|
221
318
|
const members = [];
|
|
222
319
|
for (const seed of catalog) {
|
|
223
|
-
const prev = leftover.get(seed.id);
|
|
224
320
|
leftover.delete(seed.id);
|
|
225
|
-
|
|
226
|
-
members.push(seed);
|
|
227
|
-
continue;
|
|
228
|
-
}
|
|
229
|
-
if (prev.seed === true) {
|
|
230
|
-
const next = { ...seed, updatedAt: prev.updatedAt };
|
|
231
|
-
members.push(sameSeedBody(prev, next) ? prev : next);
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
members.push(prev);
|
|
235
|
-
}
|
|
321
|
+
members.push(seed);
|
|
236
322
|
}
|
|
237
323
|
for (const rest of leftover.values()) {
|
|
238
324
|
if (rest.seed === true)
|
|
@@ -293,7 +379,53 @@ export function seedGlobalRosterMembers(now = Date.now()) {
|
|
|
293
379
|
brief: "拆任务、协调干员。",
|
|
294
380
|
playbook: "You are the workspace lead. Break work into clear sub-tasks, coordinate teammates, " +
|
|
295
381
|
"and keep a short status of blockers and next steps. " +
|
|
296
|
-
"When a specialist fits, spawn with subagent member_id from
|
|
382
|
+
"When a specialist fits, spawn with subagent member_id from the live catalog rather than restating tools or playbook.",
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
id: "mem_seed_scout",
|
|
386
|
+
name: "探网员",
|
|
387
|
+
role: "researcher",
|
|
388
|
+
appearance: { shape: "wedge", color: "peach" },
|
|
389
|
+
seed: true,
|
|
390
|
+
updatedAt: now,
|
|
391
|
+
inject: "minimal",
|
|
392
|
+
brief: "查网上公开事实,给出链接与日期。",
|
|
393
|
+
playbook: "You are the web scout. Use web_search and web_fetch for public facts. " +
|
|
394
|
+
"Cite URLs and dates. Do not edit the repo. Prefer primary sources over commentary.",
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
id: "mem_seed_docs",
|
|
398
|
+
name: "文书员",
|
|
399
|
+
role: "worker",
|
|
400
|
+
appearance: { shape: "squircle", color: "butter" },
|
|
401
|
+
seed: true,
|
|
402
|
+
updatedAt: now,
|
|
403
|
+
inject: "minimal",
|
|
404
|
+
brief: "写诚实说明书与发行说明,不编未做能力。",
|
|
405
|
+
playbook: "You are the docs writer. Revise textbook docs in this repo. Follow docs/audiences.md. " +
|
|
406
|
+
"Do not invent APIs. Match existing tone. Use standing skills when they apply; do not paste them.",
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
id: "mem_seed_fixer",
|
|
410
|
+
name: "排障员",
|
|
411
|
+
role: "worker",
|
|
412
|
+
appearance: { shape: "gem", color: "coral" },
|
|
413
|
+
seed: true,
|
|
414
|
+
updatedAt: now,
|
|
415
|
+
inject: "minimal",
|
|
416
|
+
brief: "复现故障、定位、修,并给出证据。",
|
|
417
|
+
playbook: "You are the debugger. Reproduce, isolate, then fix. Show failing evidence before the change. Stay in the given scope.",
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
id: "mem_seed_tester",
|
|
421
|
+
name: "测员",
|
|
422
|
+
role: "worker",
|
|
423
|
+
appearance: { shape: "pill", color: "sage" },
|
|
424
|
+
seed: true,
|
|
425
|
+
updatedAt: now,
|
|
426
|
+
inject: "minimal",
|
|
427
|
+
brief: "跑相关测试,报告失败与最小复现。",
|
|
428
|
+
playbook: "You are the tester. Run the relevant tests. Report failures with the command and output. Do not skip failing tests.",
|
|
297
429
|
},
|
|
298
430
|
];
|
|
299
431
|
}
|
|
@@ -375,8 +507,11 @@ export class FaceAgentRosterStore {
|
|
|
375
507
|
this.save(workspaceId, doc);
|
|
376
508
|
return doc;
|
|
377
509
|
}
|
|
378
|
-
const
|
|
510
|
+
const kept = members.filter((row) => !isCatalogSeedMemberId(row.id));
|
|
511
|
+
const doc = { version: 1, members: kept };
|
|
379
512
|
this.cache.set(workspaceId, doc);
|
|
513
|
+
if (kept.length !== members.length)
|
|
514
|
+
this.save(workspaceId, doc);
|
|
380
515
|
return doc;
|
|
381
516
|
}
|
|
382
517
|
catch {
|
|
@@ -398,21 +533,22 @@ export class FaceAgentRosterStore {
|
|
|
398
533
|
listVisible(workspaceId) {
|
|
399
534
|
const byId = new Map();
|
|
400
535
|
for (const row of this.list(GLOBAL_ROSTER_ID)) {
|
|
401
|
-
byId.set(row.id,
|
|
536
|
+
byId.set(row.id, listedMember(row, "global"));
|
|
402
537
|
}
|
|
403
538
|
if (workspaceId !== GLOBAL_ROSTER_ID) {
|
|
404
539
|
for (const row of this.list(workspaceId)) {
|
|
405
|
-
byId.set(row.id,
|
|
540
|
+
byId.set(row.id, listedMember(row, "workspace"));
|
|
406
541
|
}
|
|
407
542
|
}
|
|
408
543
|
return [...byId.values()];
|
|
409
544
|
}
|
|
410
545
|
get(workspaceId, memberId) {
|
|
411
546
|
const local = this.list(workspaceId).find((row) => row.id === memberId);
|
|
412
|
-
if (local)
|
|
413
|
-
return
|
|
547
|
+
if (local) {
|
|
548
|
+
return listedMember(local, workspaceId === GLOBAL_ROSTER_ID ? "global" : "workspace");
|
|
549
|
+
}
|
|
414
550
|
const global = this.list(GLOBAL_ROSTER_ID).find((row) => row.id === memberId);
|
|
415
|
-
return global ?
|
|
551
|
+
return global ? listedMember(global, "global") : undefined;
|
|
416
552
|
}
|
|
417
553
|
upsert(workspaceId, input) {
|
|
418
554
|
const name = clip(input.name, MEMBER_NAME_MAX);
|
|
@@ -422,13 +558,16 @@ export class FaceAgentRosterStore {
|
|
|
422
558
|
const role = input.role ?? "default";
|
|
423
559
|
const doc = this.load(workspaceId);
|
|
424
560
|
const now = Date.now();
|
|
425
|
-
const
|
|
561
|
+
const rawId = input.id?.trim() ?? "";
|
|
562
|
+
const id = normalizeMemberId(rawId);
|
|
426
563
|
const fallback = { shape: "blob", color: "cream" };
|
|
427
564
|
const inject = parseMemberInject(input.inject, "minimal");
|
|
428
565
|
const tools = input.tools === null ? undefined : parseMemberToolPolicy(input.tools);
|
|
566
|
+
if (rawId && !id)
|
|
567
|
+
return undefined; // illegal id — callers ask memberIdProblem() first
|
|
568
|
+
if (id && isCatalogSeedMemberId(id))
|
|
569
|
+
return undefined;
|
|
429
570
|
if (id) {
|
|
430
|
-
if (!ID_RE.test(id))
|
|
431
|
-
return undefined;
|
|
432
571
|
const index = doc.members.findIndex((row) => row.id === id);
|
|
433
572
|
const prev = index === -1 ? undefined : doc.members[index];
|
|
434
573
|
const appearance = parseMemberAppearance({
|
|
@@ -484,6 +623,8 @@ export class FaceAgentRosterStore {
|
|
|
484
623
|
return member;
|
|
485
624
|
}
|
|
486
625
|
remove(workspaceId, memberId) {
|
|
626
|
+
if (isCatalogSeedMemberId(memberId))
|
|
627
|
+
return false;
|
|
487
628
|
const doc = this.load(workspaceId);
|
|
488
629
|
const members = doc.members.filter((row) => row.id !== memberId);
|
|
489
630
|
if (members.length === doc.members.length)
|