@xrkseek/harness 0.5.9 → 0.5.11
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/@xrkseek/core-agent-loop/dist/index.d.ts +4 -3
- package/node_modules/@xrkseek/core-agent-loop/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js +25 -60
- package/node_modules/@xrkseek/core-agent-loop/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/llm-retry.d.ts +0 -2
- package/node_modules/@xrkseek/core-agent-loop/dist/llm-retry.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/llm-retry.js +7 -3
- package/node_modules/@xrkseek/core-agent-loop/dist/llm-retry.js.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/settle-batch.d.ts +16 -3
- package/node_modules/@xrkseek/core-agent-loop/dist/settle-batch.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-agent-loop/dist/settle-batch.js +24 -8
- package/node_modules/@xrkseek/core-agent-loop/dist/settle-batch.js.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/sqlite-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-session/dist/sqlite-store.js +27 -1
- package/node_modules/@xrkseek/core-session/dist/sqlite-store.js.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/index.d.ts +1 -1
- package/node_modules/@xrkseek/core-tools/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/index.js +1 -1
- package/node_modules/@xrkseek/core-tools/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.d.ts +9 -0
- package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.d.ts.map +1 -1
- package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js +45 -12
- package/node_modules/@xrkseek/core-tools/dist/subagent-prompt.js.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/index.d.ts +9 -1
- package/node_modules/@xrkseek/exec-fs/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/index.js +21 -14
- package/node_modules/@xrkseek/exec-fs/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/paths.d.ts +11 -0
- package/node_modules/@xrkseek/exec-fs/dist/paths.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-fs/dist/paths.js +40 -0
- package/node_modules/@xrkseek/exec-fs/dist/paths.js.map +1 -1
- package/node_modules/@xrkseek/exec-memory/dist/index.d.ts +2 -2
- package/node_modules/@xrkseek/exec-memory/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-memory/dist/index.js +2 -2
- package/node_modules/@xrkseek/exec-memory/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/exec-memory/dist/store.d.ts +18 -0
- package/node_modules/@xrkseek/exec-memory/dist/store.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-memory/dist/store.js +108 -7
- package/node_modules/@xrkseek/exec-memory/dist/store.js.map +1 -1
- package/node_modules/@xrkseek/exec-memory/dist/tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-memory/dist/tools.js +17 -1
- package/node_modules/@xrkseek/exec-memory/dist/tools.js.map +1 -1
- package/node_modules/@xrkseek/exec-memory/dist/write-path.d.ts +2 -0
- package/node_modules/@xrkseek/exec-memory/dist/write-path.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-memory/dist/write-path.js +28 -3
- package/node_modules/@xrkseek/exec-memory/dist/write-path.js.map +1 -1
- package/node_modules/@xrkseek/exec-sandbox/dist/resolve.d.ts +7 -4
- package/node_modules/@xrkseek/exec-sandbox/dist/resolve.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-sandbox/dist/resolve.js +4 -0
- package/node_modules/@xrkseek/exec-sandbox/dist/resolve.js.map +1 -1
- package/node_modules/@xrkseek/exec-sandbox/dist/service.d.ts +7 -0
- package/node_modules/@xrkseek/exec-sandbox/dist/service.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-sandbox/dist/service.js +18 -8
- package/node_modules/@xrkseek/exec-sandbox/dist/service.js.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/tools.d.ts +1 -1
- package/node_modules/@xrkseek/exec-web/dist/tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/exec-web/dist/tools.js +10 -0
- package/node_modules/@xrkseek/exec-web/dist/tools.js.map +1 -1
- package/node_modules/@xrkseek/llm/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/llm/dist/index.js +8 -2
- package/node_modules/@xrkseek/llm/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts +16 -0
- package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
- package/node_modules/@xrkseek/preset-harness/dist/preset.js +13 -2
- 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-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/protocol/dist/session-events.d.ts +5 -0
- package/node_modules/@xrkseek/protocol/dist/session-events.d.ts.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/session-events.js.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/validate.d.ts.map +1 -1
- package/node_modules/@xrkseek/protocol/dist/validate.js +5 -0
- package/node_modules/@xrkseek/protocol/dist/validate.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/index.d.ts +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/index.js +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/index.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/model-route.d.ts +5 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/model-route.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/model-route.js +16 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/model-route.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.d.ts +32 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js +87 -0
- package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.js +29 -2
- package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts +102 -0
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js +495 -0
- package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.d.ts +12 -0
- package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.js +141 -0
- package/node_modules/@xrkseek/server-face/dist/agent-roster-tools.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/agent-team-roles.d.ts +46 -0
- package/node_modules/@xrkseek/server-face/dist/agent-team-roles.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-team-roles.js +150 -1
- package/node_modules/@xrkseek/server-face/dist/agent-team-roles.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-team-tasks.d.ts +5 -0
- package/node_modules/@xrkseek/server-face/dist/agent-team-tasks.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/agent-team-tasks.js +24 -0
- package/node_modules/@xrkseek/server-face/dist/agent-team-tasks.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/capture-member-playbook.d.ts +6 -0
- package/node_modules/@xrkseek/server-face/dist/capture-member-playbook.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/capture-member-playbook.js +43 -0
- package/node_modules/@xrkseek/server-face/dist/capture-member-playbook.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/context.d.ts +21 -4
- package/node_modules/@xrkseek/server-face/dist/context.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/dispatch.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/dispatch.js +19 -0
- package/node_modules/@xrkseek/server-face/dist/dispatch.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/fork-cut.d.ts +3 -2
- package/node_modules/@xrkseek/server-face/dist/fork-cut.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/fork-cut.js +58 -20
- package/node_modules/@xrkseek/server-face/dist/fork-cut.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/job.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/job.js +1 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/job.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 +88 -18
- package/node_modules/@xrkseek/server-face/dist/handlers/session.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/subagent.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/subagent.js +20 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/subagent.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/handlers/team.d.ts +11 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/team.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/team.js +268 -0
- package/node_modules/@xrkseek/server-face/dist/handlers/team.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/index.d.ts +6 -2
- package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/index.js +5 -1
- package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/model-catalog.d.ts +17 -1
- package/node_modules/@xrkseek/server-face/dist/model-catalog.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/model-catalog.js +46 -1
- package/node_modules/@xrkseek/server-face/dist/model-catalog.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/presence-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/presence-tools.js +15 -6
- package/node_modules/@xrkseek/server-face/dist/presence-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/presets-catalog.d.ts +16 -0
- package/node_modules/@xrkseek/server-face/dist/presets-catalog.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/presets-catalog.js +5 -0
- package/node_modules/@xrkseek/server-face/dist/presets-catalog.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.d.ts +8 -2
- 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 +14 -12
- package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/ralph-tool.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/ralph-tool.js +15 -12
- package/node_modules/@xrkseek/server-face/dist/ralph-tool.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 +96 -14
- package/node_modules/@xrkseek/server-face/dist/runtime.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-cwd.d.ts +12 -0
- package/node_modules/@xrkseek/server-face/dist/session-cwd.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-cwd.js +14 -0
- package/node_modules/@xrkseek/server-face/dist/session-cwd.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-model-store.d.ts +2 -0
- package/node_modules/@xrkseek/server-face/dist/session-model-store.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-model-store.js +14 -0
- package/node_modules/@xrkseek/server-face/dist/session-model-store.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-status.d.ts +16 -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 +47 -6
- package/node_modules/@xrkseek/server-face/dist/session-status.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/session-thread-publish.d.ts +17 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-publish.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-publish.js +34 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-publish.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-store.d.ts +38 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-store.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-store.js +207 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-store.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts +12 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js +223 -0
- package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js.map +1 -0
- package/node_modules/@xrkseek/server-face/dist/settings-agent-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/settings-agent-tools.js +13 -1
- package/node_modules/@xrkseek/server-face/dist/settings-agent-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 +10 -11
- 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 +17 -10
- package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-registry.d.ts +46 -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 +111 -8
- package/node_modules/@xrkseek/server-face/dist/subagent-registry.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts +21 -0
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +422 -85
- package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/types.d.ts +9 -0
- package/node_modules/@xrkseek/server-face/dist/types.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/wire/paths.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/wire/paths.js +2 -0
- package/node_modules/@xrkseek/server-face/dist/wire/paths.js.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-face.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-face/dist/workspace-face.js +7 -0
- package/node_modules/@xrkseek/server-face/dist/workspace-face.js.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/agent-cache.d.ts +5 -1
- package/node_modules/@xrkseek/server-host/dist/agent-cache.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/agent-cache.js +29 -3
- package/node_modules/@xrkseek/server-host/dist/agent-cache.js.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/index.d.ts +21 -0
- package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-host/dist/index.js +108 -21
- package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/static.d.ts.map +1 -1
- package/node_modules/@xrkseek/server-http/dist/static.js +45 -5
- package/node_modules/@xrkseek/server-http/dist/static.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.d.ts +8 -0
- package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.js +6 -2
- package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.js.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/index.d.ts +16 -0
- package/node_modules/@xrkseek/workspace/dist/index.d.ts.map +1 -1
- package/node_modules/@xrkseek/workspace/dist/index.js +17 -8
- package/node_modules/@xrkseek/workspace/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace-scoped conversation 主线 catalog. Sessions attach to one thread
|
|
3
|
+
* and keep a short 支线 (current work). Survives session create/delete.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
6
|
+
import { randomUUID } from "node:crypto";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { resolveXrkHome } from "@xrkseek/server-config";
|
|
9
|
+
import { tryWriteJsonSidecar } from "./json-sidecar.js";
|
|
10
|
+
export const THREAD_TITLE_MAX = 80;
|
|
11
|
+
export const THREAD_BRIEF_MAX = 4_000;
|
|
12
|
+
export const SIDELINE_MAX = 200;
|
|
13
|
+
const ID_RE = /^th_[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/;
|
|
14
|
+
export function threadsRoot(productHome) {
|
|
15
|
+
return path.join(path.resolve(productHome ?? resolveXrkHome()), "session-threads");
|
|
16
|
+
}
|
|
17
|
+
function sanitizeWorkspaceId(workspaceId) {
|
|
18
|
+
const trimmed = workspaceId.trim();
|
|
19
|
+
if (!trimmed || trimmed.includes("..") || trimmed.includes("/") || trimmed.includes("\\")) {
|
|
20
|
+
throw new Error(`invalid workspaceId: ${workspaceId}`);
|
|
21
|
+
}
|
|
22
|
+
return trimmed;
|
|
23
|
+
}
|
|
24
|
+
function filePath(workspaceId, productHome) {
|
|
25
|
+
return path.join(threadsRoot(productHome), `${sanitizeWorkspaceId(workspaceId)}.json`);
|
|
26
|
+
}
|
|
27
|
+
function mintId() {
|
|
28
|
+
return `th_${randomUUID().replaceAll("-", "").slice(0, 16)}`;
|
|
29
|
+
}
|
|
30
|
+
function clip(value, max) {
|
|
31
|
+
return value.replace(/\s+/g, " ").trim().slice(0, max);
|
|
32
|
+
}
|
|
33
|
+
function parseBind(raw) {
|
|
34
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
35
|
+
return undefined;
|
|
36
|
+
const o = raw;
|
|
37
|
+
if (typeof o.threadId !== "string" || !ID_RE.test(o.threadId))
|
|
38
|
+
return undefined;
|
|
39
|
+
const sideline = typeof o.sideline === "string" ? clip(o.sideline, SIDELINE_MAX) : "";
|
|
40
|
+
return sideline
|
|
41
|
+
? { threadId: o.threadId, sideline }
|
|
42
|
+
: { threadId: o.threadId };
|
|
43
|
+
}
|
|
44
|
+
function parseThread(raw) {
|
|
45
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
46
|
+
return undefined;
|
|
47
|
+
const o = raw;
|
|
48
|
+
if (typeof o.id !== "string" || !ID_RE.test(o.id))
|
|
49
|
+
return undefined;
|
|
50
|
+
if (typeof o.title !== "string")
|
|
51
|
+
return undefined;
|
|
52
|
+
const title = clip(o.title, THREAD_TITLE_MAX);
|
|
53
|
+
if (!title)
|
|
54
|
+
return undefined;
|
|
55
|
+
const brief = typeof o.brief === "string" ? clip(o.brief, THREAD_BRIEF_MAX) : "";
|
|
56
|
+
const updatedAt = typeof o.updatedAt === "number" && Number.isFinite(o.updatedAt)
|
|
57
|
+
? o.updatedAt
|
|
58
|
+
: 0;
|
|
59
|
+
return { id: o.id, title, brief, updatedAt };
|
|
60
|
+
}
|
|
61
|
+
function emptyDoc() {
|
|
62
|
+
return { version: 1, threads: [], sessions: {} };
|
|
63
|
+
}
|
|
64
|
+
export class FaceSessionThreadStore {
|
|
65
|
+
productHome;
|
|
66
|
+
cache = new Map();
|
|
67
|
+
constructor(productHome) {
|
|
68
|
+
this.productHome = productHome;
|
|
69
|
+
}
|
|
70
|
+
load(workspaceId) {
|
|
71
|
+
const cached = this.cache.get(workspaceId);
|
|
72
|
+
if (cached)
|
|
73
|
+
return cached;
|
|
74
|
+
const file = filePath(workspaceId, this.productHome);
|
|
75
|
+
if (!existsSync(file)) {
|
|
76
|
+
const doc = emptyDoc();
|
|
77
|
+
this.cache.set(workspaceId, doc);
|
|
78
|
+
return doc;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const parsed = JSON.parse(readFileSync(file, "utf8"));
|
|
82
|
+
const o = parsed && typeof parsed === "object" ? parsed : emptyDoc();
|
|
83
|
+
const threads = Array.isArray(o.threads)
|
|
84
|
+
? o.threads.flatMap((row) => {
|
|
85
|
+
const thread = parseThread(row);
|
|
86
|
+
return thread ? [thread] : [];
|
|
87
|
+
})
|
|
88
|
+
: [];
|
|
89
|
+
const sessions = {};
|
|
90
|
+
if (o.sessions && typeof o.sessions === "object") {
|
|
91
|
+
for (const [sessionId, bind] of Object.entries(o.sessions)) {
|
|
92
|
+
const next = parseBind(bind);
|
|
93
|
+
if (next)
|
|
94
|
+
sessions[sessionId] = next;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const doc = { version: 1, threads, sessions };
|
|
98
|
+
this.cache.set(workspaceId, doc);
|
|
99
|
+
return doc;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
const doc = emptyDoc();
|
|
103
|
+
this.cache.set(workspaceId, doc);
|
|
104
|
+
return doc;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
save(workspaceId, doc) {
|
|
108
|
+
this.cache.set(workspaceId, doc);
|
|
109
|
+
const dir = threadsRoot(this.productHome);
|
|
110
|
+
mkdirSync(dir, { recursive: true });
|
|
111
|
+
tryWriteJsonSidecar(filePath(workspaceId, this.productHome), doc);
|
|
112
|
+
}
|
|
113
|
+
list(workspaceId) {
|
|
114
|
+
return this.load(workspaceId).threads;
|
|
115
|
+
}
|
|
116
|
+
get(workspaceId, threadId) {
|
|
117
|
+
return this.load(workspaceId).threads.find((row) => row.id === threadId);
|
|
118
|
+
}
|
|
119
|
+
bindOf(workspaceId, sessionId) {
|
|
120
|
+
return this.load(workspaceId).sessions[sessionId];
|
|
121
|
+
}
|
|
122
|
+
/** Every session currently attached to a 主线 in this workspace. */
|
|
123
|
+
listBinds(workspaceId) {
|
|
124
|
+
return Object.entries(this.load(workspaceId).sessions).map(([sessionId, bind]) => ({
|
|
125
|
+
sessionId,
|
|
126
|
+
...bind,
|
|
127
|
+
}));
|
|
128
|
+
}
|
|
129
|
+
upsert(workspaceId, input) {
|
|
130
|
+
const title = clip(input.title, THREAD_TITLE_MAX);
|
|
131
|
+
if (!title)
|
|
132
|
+
return undefined;
|
|
133
|
+
const brief = clip(input.brief ?? "", THREAD_BRIEF_MAX);
|
|
134
|
+
const doc = this.load(workspaceId);
|
|
135
|
+
const id = input.id?.trim();
|
|
136
|
+
const now = Date.now();
|
|
137
|
+
if (id) {
|
|
138
|
+
if (!ID_RE.test(id))
|
|
139
|
+
return undefined;
|
|
140
|
+
const index = doc.threads.findIndex((row) => row.id === id);
|
|
141
|
+
const next = {
|
|
142
|
+
id,
|
|
143
|
+
title,
|
|
144
|
+
brief,
|
|
145
|
+
updatedAt: now,
|
|
146
|
+
};
|
|
147
|
+
const threads = index === -1
|
|
148
|
+
? [...doc.threads, next]
|
|
149
|
+
: doc.threads.map((row, i) => (i === index ? next : row));
|
|
150
|
+
this.save(workspaceId, { ...doc, threads });
|
|
151
|
+
return next;
|
|
152
|
+
}
|
|
153
|
+
const minted = {
|
|
154
|
+
id: mintId(),
|
|
155
|
+
title,
|
|
156
|
+
brief,
|
|
157
|
+
updatedAt: now,
|
|
158
|
+
};
|
|
159
|
+
this.save(workspaceId, { ...doc, threads: [...doc.threads, minted] });
|
|
160
|
+
return minted;
|
|
161
|
+
}
|
|
162
|
+
switchTo(workspaceId, sessionId, threadId) {
|
|
163
|
+
const doc = this.load(workspaceId);
|
|
164
|
+
if (!doc.threads.some((row) => row.id === threadId))
|
|
165
|
+
return undefined;
|
|
166
|
+
const prev = doc.sessions[sessionId];
|
|
167
|
+
const next = {
|
|
168
|
+
threadId,
|
|
169
|
+
...(prev?.sideline ? { sideline: prev.sideline } : {}),
|
|
170
|
+
};
|
|
171
|
+
this.save(workspaceId, {
|
|
172
|
+
...doc,
|
|
173
|
+
sessions: { ...doc.sessions, [sessionId]: next },
|
|
174
|
+
});
|
|
175
|
+
return next;
|
|
176
|
+
}
|
|
177
|
+
/** Drop a 主线 and every session bind pointing at it. */
|
|
178
|
+
remove(workspaceId, threadId) {
|
|
179
|
+
const doc = this.load(workspaceId);
|
|
180
|
+
if (!doc.threads.some((row) => row.id === threadId))
|
|
181
|
+
return false;
|
|
182
|
+
const threads = doc.threads.filter((row) => row.id !== threadId);
|
|
183
|
+
const sessions = {};
|
|
184
|
+
for (const [sessionId, bind] of Object.entries(doc.sessions)) {
|
|
185
|
+
if (bind.threadId !== threadId)
|
|
186
|
+
sessions[sessionId] = bind;
|
|
187
|
+
}
|
|
188
|
+
this.save(workspaceId, { ...doc, threads, sessions });
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
setSideline(workspaceId, sessionId, sideline) {
|
|
192
|
+
const doc = this.load(workspaceId);
|
|
193
|
+
const prev = doc.sessions[sessionId];
|
|
194
|
+
if (!prev)
|
|
195
|
+
return undefined;
|
|
196
|
+
const clipped = clip(sideline, SIDELINE_MAX);
|
|
197
|
+
const next = clipped
|
|
198
|
+
? { threadId: prev.threadId, sideline: clipped }
|
|
199
|
+
: { threadId: prev.threadId };
|
|
200
|
+
this.save(workspaceId, {
|
|
201
|
+
...doc,
|
|
202
|
+
sessions: { ...doc.sessions, [sessionId]: next },
|
|
203
|
+
});
|
|
204
|
+
return next;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=session-thread-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-thread-store.js","sourceRoot":"","sources":["../src/session-thread-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-facing thread_* / sideline_set — workspace 主线 catalog + session 支线.
|
|
3
|
+
*/
|
|
4
|
+
import type { ToolRegistry } from "@xrkseek/core-tools";
|
|
5
|
+
import type { FaceRuntime } from "./context.js";
|
|
6
|
+
export interface BindSessionThreadToolsOptions {
|
|
7
|
+
readonly runtime: FaceRuntime;
|
|
8
|
+
readonly sessionId: string;
|
|
9
|
+
}
|
|
10
|
+
/** Register thread_list / thread_upsert / thread_switch / thread_delete / sideline_set. */
|
|
11
|
+
export declare function bindSessionThreadTools(tools: ToolRegistry, options: BindSessionThreadToolsOptions): void;
|
|
12
|
+
//# sourceMappingURL=session-thread-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-thread-tools.d.ts","sourceRoot":"","sources":["../src/session-thread-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAShD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AA8DD,2FAA2F;AAC3F,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,6BAA6B,GACrC,IAAI,CAyLN"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { canvasWorkspaceIdForSession } from "./canvas-tools.js";
|
|
2
|
+
import { publishSessionThread, publishSessionThreads, sessionIdsOnThread, } from "./session-thread-publish.js";
|
|
3
|
+
import { SIDELINE_MAX } from "./session-thread-store.js";
|
|
4
|
+
function registerTool(tools, tool) {
|
|
5
|
+
if (tools.get(tool.name))
|
|
6
|
+
return;
|
|
7
|
+
tools.register(tool);
|
|
8
|
+
}
|
|
9
|
+
function readArgs(args) {
|
|
10
|
+
if (!args || typeof args !== "object" || Array.isArray(args))
|
|
11
|
+
return {};
|
|
12
|
+
return args;
|
|
13
|
+
}
|
|
14
|
+
function sidelineOf(runtime, workspaceId, targetId) {
|
|
15
|
+
const bind = runtime.sessionThreads.bindOf(workspaceId, targetId);
|
|
16
|
+
const text = bind?.sideline ?? runtime.presence.get(targetId)?.tips;
|
|
17
|
+
return text ? text : undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Catalog rows for this workspace only: 主线 entries plus parent sessions
|
|
21
|
+
* already attached. Unbound sessions (first-message sidebar titles) stay out.
|
|
22
|
+
*/
|
|
23
|
+
function listCatalog(runtime, workspaceId, selfId) {
|
|
24
|
+
const binds = runtime.sessionThreads.listBinds(workspaceId);
|
|
25
|
+
return runtime.sessionThreads.list(workspaceId).map((thread) => ({
|
|
26
|
+
id: thread.id,
|
|
27
|
+
title: thread.title,
|
|
28
|
+
brief: thread.brief,
|
|
29
|
+
updatedAt: thread.updatedAt,
|
|
30
|
+
sessions: binds.flatMap((row) => {
|
|
31
|
+
if (row.threadId !== thread.id)
|
|
32
|
+
return [];
|
|
33
|
+
if (runtime.subagents.getByChild(row.sessionId))
|
|
34
|
+
return [];
|
|
35
|
+
const sideline = sidelineOf(runtime, workspaceId, row.sessionId);
|
|
36
|
+
return [
|
|
37
|
+
{
|
|
38
|
+
sessionId: row.sessionId,
|
|
39
|
+
self: row.sessionId === selfId,
|
|
40
|
+
...(sideline ? { sideline } : {}),
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
}),
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
/** Register thread_list / thread_upsert / thread_switch / thread_delete / sideline_set. */
|
|
47
|
+
export function bindSessionThreadTools(tools, options) {
|
|
48
|
+
const { runtime, sessionId } = options;
|
|
49
|
+
const ws = () => canvasWorkspaceIdForSession(runtime, sessionId);
|
|
50
|
+
registerTool(tools, {
|
|
51
|
+
name: "thread_list",
|
|
52
|
+
description: "List this workspace's 主线 catalog only (not other workspaces). " +
|
|
53
|
+
"A 主线 is an AI-owned collaboration pin: what this parent session is for, so sibling " +
|
|
54
|
+
"parent sessions in the same workspace can notice it, join it, or read it. " +
|
|
55
|
+
"It is not the user's message text. Do not mint from a greeting, a one-shot question, or a steer. " +
|
|
56
|
+
"When this session becomes a lasting mission, call thread_upsert yourself — do not wait to be asked. " +
|
|
57
|
+
"Each row lists parent sessions already attached. Unbound sessions do not appear. " +
|
|
58
|
+
"Sessions do not have a live chat bus; discover via this list, then session_search / session_read. " +
|
|
59
|
+
"Host may inject with session.prompt. Use thread_upsert / thread_delete yourself — never copy the user verbatim.",
|
|
60
|
+
parameters: { type: "object", properties: {}, additionalProperties: false },
|
|
61
|
+
isConcurrencySafe: () => true,
|
|
62
|
+
presentCall: () => ({
|
|
63
|
+
card: "generic",
|
|
64
|
+
title: "thread_list",
|
|
65
|
+
kind: "search",
|
|
66
|
+
rawInput: {},
|
|
67
|
+
}),
|
|
68
|
+
execute: async () => {
|
|
69
|
+
const workspaceId = ws();
|
|
70
|
+
return {
|
|
71
|
+
content: JSON.stringify({
|
|
72
|
+
workspaceId,
|
|
73
|
+
threads: listCatalog(runtime, workspaceId, sessionId),
|
|
74
|
+
bind: runtime.sessionThreads.bindOf(workspaceId, sessionId) ?? null,
|
|
75
|
+
}),
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
registerTool(tools, {
|
|
80
|
+
name: "thread_upsert",
|
|
81
|
+
description: "Create or revise a workspace 主线 (title + optional brief) that you choose as the collaboration pin. " +
|
|
82
|
+
"When the work is a lasting mission, call this without waiting for the user to ask. " +
|
|
83
|
+
"Do not paste or paraphrase the user's latest message as the title. " +
|
|
84
|
+
"Skip greetings, one-shot Q&A, and mid-turn steers. " +
|
|
85
|
+
"Write a durable mission label siblings can anchor on. Pass id to revise. Default switch=true attaches this session.",
|
|
86
|
+
parameters: {
|
|
87
|
+
type: "object",
|
|
88
|
+
properties: {
|
|
89
|
+
id: { type: "string" },
|
|
90
|
+
title: { type: "string", description: "Short AI-owned 主线 label (sidebar when bound)." },
|
|
91
|
+
brief: { type: "string", description: "What siblings should know this 主线 is for." },
|
|
92
|
+
switch: {
|
|
93
|
+
type: "boolean",
|
|
94
|
+
description: "If true (default), attach this session to the 主线.",
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
required: ["title"],
|
|
98
|
+
additionalProperties: false,
|
|
99
|
+
},
|
|
100
|
+
presentCall: (args) => ({
|
|
101
|
+
card: "generic",
|
|
102
|
+
title: "thread_upsert",
|
|
103
|
+
kind: "execute",
|
|
104
|
+
rawInput: args,
|
|
105
|
+
}),
|
|
106
|
+
execute: async (args) => {
|
|
107
|
+
const a = readArgs(args);
|
|
108
|
+
const title = String(a.title ?? "");
|
|
109
|
+
const brief = typeof a.brief === "string" ? a.brief : "";
|
|
110
|
+
const id = typeof a.id === "string" ? a.id : undefined;
|
|
111
|
+
const shouldSwitch = a.switch !== false;
|
|
112
|
+
const workspaceId = ws();
|
|
113
|
+
const thread = runtime.sessionThreads.upsert(workspaceId, {
|
|
114
|
+
title,
|
|
115
|
+
brief,
|
|
116
|
+
...(id ? { id } : {}),
|
|
117
|
+
});
|
|
118
|
+
if (!thread) {
|
|
119
|
+
return { content: "thread_upsert: title required", isError: true };
|
|
120
|
+
}
|
|
121
|
+
if (shouldSwitch) {
|
|
122
|
+
runtime.sessionThreads.switchTo(workspaceId, sessionId, thread.id);
|
|
123
|
+
}
|
|
124
|
+
const affected = new Set(sessionIdsOnThread(runtime, workspaceId, thread.id));
|
|
125
|
+
affected.add(sessionId);
|
|
126
|
+
publishSessionThreads(runtime, workspaceId, [...affected]);
|
|
127
|
+
return { content: JSON.stringify({ workspaceId, thread }) };
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
registerTool(tools, {
|
|
131
|
+
name: "thread_switch",
|
|
132
|
+
description: "Attach this parent session to an existing workspace 主线 (same pin as a peer). " +
|
|
133
|
+
"Use after thread_list finds a matching 主线 instead of minting a duplicate.",
|
|
134
|
+
parameters: {
|
|
135
|
+
type: "object",
|
|
136
|
+
properties: { id: { type: "string" } },
|
|
137
|
+
required: ["id"],
|
|
138
|
+
additionalProperties: false,
|
|
139
|
+
},
|
|
140
|
+
presentCall: (args) => ({
|
|
141
|
+
card: "generic",
|
|
142
|
+
title: "thread_switch",
|
|
143
|
+
kind: "execute",
|
|
144
|
+
rawInput: args,
|
|
145
|
+
}),
|
|
146
|
+
execute: async (args) => {
|
|
147
|
+
const id = String(readArgs(args).id ?? "").trim();
|
|
148
|
+
const workspaceId = ws();
|
|
149
|
+
const bind = runtime.sessionThreads.switchTo(workspaceId, sessionId, id);
|
|
150
|
+
if (!bind) {
|
|
151
|
+
return { content: "thread_switch: unknown 主线 id", isError: true };
|
|
152
|
+
}
|
|
153
|
+
publishSessionThread(runtime, workspaceId, sessionId);
|
|
154
|
+
return { content: JSON.stringify({ workspaceId, bind }) };
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
registerTool(tools, {
|
|
158
|
+
name: "thread_delete",
|
|
159
|
+
description: "Delete a workspace 主线 you created and drop every session bind to it. " +
|
|
160
|
+
"Does not delete sessions. Only this workspace's catalog.",
|
|
161
|
+
parameters: {
|
|
162
|
+
type: "object",
|
|
163
|
+
properties: { id: { type: "string" } },
|
|
164
|
+
required: ["id"],
|
|
165
|
+
additionalProperties: false,
|
|
166
|
+
},
|
|
167
|
+
presentCall: (args) => ({
|
|
168
|
+
card: "generic",
|
|
169
|
+
title: "thread_delete",
|
|
170
|
+
kind: "execute",
|
|
171
|
+
rawInput: args,
|
|
172
|
+
}),
|
|
173
|
+
execute: async (args) => {
|
|
174
|
+
const id = String(readArgs(args).id ?? "").trim();
|
|
175
|
+
const workspaceId = ws();
|
|
176
|
+
const affected = sessionIdsOnThread(runtime, workspaceId, id);
|
|
177
|
+
const ok = runtime.sessionThreads.remove(workspaceId, id);
|
|
178
|
+
if (!ok) {
|
|
179
|
+
return { content: "thread_delete: unknown 主线 id", isError: true };
|
|
180
|
+
}
|
|
181
|
+
publishSessionThreads(runtime, workspaceId, affected);
|
|
182
|
+
return { content: JSON.stringify({ workspaceId, deleted: true, id }) };
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
registerTool(tools, {
|
|
186
|
+
name: "sideline_set",
|
|
187
|
+
description: "Write this session's 支线 caption (same as presence_set tips). " +
|
|
188
|
+
"Shows under the session name and on the Overview ball so the user sees what you are doing now. " +
|
|
189
|
+
"Does not change the session name. Does not require a 主线. Prefer presence_set when also changing emotion.",
|
|
190
|
+
parameters: {
|
|
191
|
+
type: "object",
|
|
192
|
+
properties: {
|
|
193
|
+
text: { type: "string", description: `Current work caption (≤${SIDELINE_MAX} chars).` },
|
|
194
|
+
},
|
|
195
|
+
required: ["text"],
|
|
196
|
+
additionalProperties: false,
|
|
197
|
+
},
|
|
198
|
+
isConcurrencySafe: () => true,
|
|
199
|
+
presentCall: (args) => ({
|
|
200
|
+
card: "generic",
|
|
201
|
+
title: "sideline_set",
|
|
202
|
+
kind: "other",
|
|
203
|
+
rawInput: args,
|
|
204
|
+
}),
|
|
205
|
+
execute: async (args) => {
|
|
206
|
+
const text = String(readArgs(args).text ?? "");
|
|
207
|
+
const workspaceId = ws();
|
|
208
|
+
const clipped = text.trim().slice(0, SIDELINE_MAX);
|
|
209
|
+
const bind = runtime.sessionThreads.bindOf(workspaceId, sessionId);
|
|
210
|
+
const next = bind
|
|
211
|
+
? runtime.sessionThreads.setSideline(workspaceId, sessionId, clipped)
|
|
212
|
+
: bind;
|
|
213
|
+
const sticky = runtime.presence.get(sessionId);
|
|
214
|
+
runtime.presence.set(sessionId, {
|
|
215
|
+
emotionId: sticky?.emotionId ?? "30",
|
|
216
|
+
tips: clipped,
|
|
217
|
+
});
|
|
218
|
+
publishSessionThread(runtime, workspaceId, sessionId);
|
|
219
|
+
return { content: JSON.stringify({ workspaceId, bind: next ?? null, tips: clipped }) };
|
|
220
|
+
},
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=session-thread-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-thread-tools.js","sourceRoot":"","sources":["../src/session-thread-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-agent-tools.d.ts","sourceRoot":"","sources":["../src/settings-agent-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"settings-agent-tools.d.ts","sourceRoot":"","sources":["../src/settings-agent-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAchD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,WAAW,GACnB,IAAI,CAwGN"}
|
|
@@ -5,6 +5,8 @@ import { createSettingsTools, } from "@xrkseek/core-tools";
|
|
|
5
5
|
import { FACE_PRODUCT_SETTINGS_NAMESPACES } from "./settings-schemas.js";
|
|
6
6
|
import { settingsDescribeFace, settingsMutateFace, } from "./settings-credentials.js";
|
|
7
7
|
const AGENT_SETTINGS_NS = new Set(FACE_PRODUCT_SETTINGS_NAMESPACES.map((s) => s.ns));
|
|
8
|
+
/** The Face-bound instances already installed on a registry (identity guard). */
|
|
9
|
+
const faceBound = new WeakSet();
|
|
8
10
|
export function bindSettingsTools(tools, runtime) {
|
|
9
11
|
const bound = createSettingsTools({
|
|
10
12
|
async get(ns) {
|
|
@@ -82,9 +84,19 @@ export function bindSettingsTools(tools, runtime) {
|
|
|
82
84
|
},
|
|
83
85
|
});
|
|
84
86
|
for (const tool of bound) {
|
|
87
|
+
const prev = tools.get(tool.name);
|
|
85
88
|
// Same identity rule as presence_set — see presence-tools.ts.
|
|
86
|
-
if (
|
|
89
|
+
if (prev && faceBound.has(prev))
|
|
87
90
|
continue;
|
|
91
|
+
// Replace stub `settings_*` (registered by presets/standing tools with no
|
|
92
|
+
// Face impl) instead of skipping: getTool() serves the standing registry
|
|
93
|
+
// first, and its stub returns "unavailable (no Face channel)".
|
|
94
|
+
if (prev) {
|
|
95
|
+
faceBound.add(tool);
|
|
96
|
+
tools.replace(tool);
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
faceBound.add(tool);
|
|
88
100
|
tools.register(tool);
|
|
89
101
|
}
|
|
90
102
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-agent-tools.js","sourceRoot":"","sources":["../src/settings-agent-tools.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"settings-agent-tools.js","sourceRoot":"","sources":["../src/settings-agent-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-document.d.ts","sourceRoot":"","sources":["../src/settings-document.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-document.d.ts","sourceRoot":"","sources":["../src/settings-document.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAoBhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAUxE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAG/D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAE7D;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAEhE;AAUD,8EAA8E;AAC9E,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD;AAiED,2EAA2E;AAC3E,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAWtE;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAoBtE;AAeD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAQ9D;AAoED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhF;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,sBAAsB,GACjC,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlF;AAED,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,GAAG,SAAS,CAgFpB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,GACT,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAarC"}
|
|
@@ -7,6 +7,7 @@ import path from "node:path";
|
|
|
7
7
|
import yaml from "js-yaml";
|
|
8
8
|
import { resolveXrkHome } from "@xrkseek/server-config";
|
|
9
9
|
import { FACE_PRODUCT_SETTINGS_NAMESPACES, schemaEnvelopeOf, } from "./settings-schemas.js";
|
|
10
|
+
import { MEMBER_COLORS, MEMBER_KITS, MEMBER_SHAPES, } from "./agent-roster-store.js";
|
|
10
11
|
import { FACE_AGENT_PRESET_IDS, canonicalAgentPresetId } from "./presets-catalog.js";
|
|
11
12
|
import { isFacePermissionPreset, validateFaceFontSize, } from "./face-schema.js";
|
|
12
13
|
import { listSettingsProviderCredentialRefs, providerApiKeyEnv, } from "./llm-provider-context.js";
|
|
@@ -338,22 +339,20 @@ export function validateSettingsNamespace(ns, merged) {
|
|
|
338
339
|
}
|
|
339
340
|
if (ns === "ui-presence") {
|
|
340
341
|
const shape = merged.shape;
|
|
341
|
-
if (shape !== undefined
|
|
342
|
-
shape
|
|
343
|
-
shape !== "wedge" &&
|
|
344
|
-
shape !== "gem") {
|
|
342
|
+
if (shape !== undefined
|
|
343
|
+
&& !MEMBER_SHAPES.includes(shape)) {
|
|
345
344
|
return `unknown presence shape: ${String(shape)}`;
|
|
346
345
|
}
|
|
347
346
|
const color = merged.color;
|
|
348
|
-
if (color !== undefined
|
|
349
|
-
color
|
|
350
|
-
color !== "mist" &&
|
|
351
|
-
color !== "peach" &&
|
|
352
|
-
color !== "sage" &&
|
|
353
|
-
color !== "lilac" &&
|
|
354
|
-
color !== "slate") {
|
|
347
|
+
if (color !== undefined
|
|
348
|
+
&& !MEMBER_COLORS.includes(color)) {
|
|
355
349
|
return `unknown presence color: ${String(color)}`;
|
|
356
350
|
}
|
|
351
|
+
const kit = merged.kit;
|
|
352
|
+
if (kit !== undefined
|
|
353
|
+
&& !MEMBER_KITS.includes(kit)) {
|
|
354
|
+
return `unknown presence kit: ${String(kit)}`;
|
|
355
|
+
}
|
|
357
356
|
}
|
|
358
357
|
if (ns === "ssh-remote") {
|
|
359
358
|
const host = String(merged.host ?? "").trim();
|