@geminixiang/mikan 1.0.0-beta.37 → 1.0.0-beta.39
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/CHANGELOG.md +21 -0
- package/README.md +1 -1
- package/dist/adapter.js +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/adapters/discord/bot.d.ts +3 -6
- package/dist/adapters/discord/bot.d.ts.map +1 -1
- package/dist/adapters/discord/bot.js +16 -39
- package/dist/adapters/discord/bot.js.map +1 -1
- package/dist/adapters/github/bot.d.ts +2 -0
- package/dist/adapters/github/bot.d.ts.map +1 -1
- package/dist/adapters/github/bot.js +15 -11
- package/dist/adapters/github/bot.js.map +1 -1
- package/dist/adapters/github/github-ops.d.ts +1 -1
- package/dist/adapters/github/github-ops.d.ts.map +1 -1
- package/dist/adapters/github/github-ops.js +2 -1
- package/dist/adapters/github/github-ops.js.map +1 -1
- package/dist/adapters/github/repo.d.ts +2 -1
- package/dist/adapters/github/repo.d.ts.map +1 -1
- package/dist/adapters/github/repo.js +2 -3
- package/dist/adapters/github/repo.js.map +1 -1
- package/dist/adapters/github/types.d.ts +1 -1
- package/dist/adapters/github/types.d.ts.map +1 -1
- package/dist/adapters/github/types.js.map +1 -1
- package/dist/adapters/intake.js +1 -1
- package/dist/adapters/intake.js.map +1 -1
- package/dist/adapters/shared.d.ts +17 -5
- package/dist/adapters/shared.d.ts.map +1 -1
- package/dist/adapters/shared.js +44 -8
- package/dist/adapters/shared.js.map +1 -1
- package/dist/adapters/slack/blocks.d.ts +14 -0
- package/dist/adapters/slack/blocks.d.ts.map +1 -1
- package/dist/adapters/slack/blocks.js +34 -0
- package/dist/adapters/slack/blocks.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +19 -6
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +88 -21
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/types.d.ts +1 -1
- package/dist/adapters/slack/types.js.map +1 -1
- package/dist/adapters/telegram/bot.d.ts +5 -6
- package/dist/adapters/telegram/bot.d.ts.map +1 -1
- package/dist/adapters/telegram/bot.js +29 -51
- package/dist/adapters/telegram/bot.js.map +1 -1
- package/dist/adapters/types.d.ts +19 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/agent.d.ts +0 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +79 -101
- package/dist/agent.js.map +1 -1
- package/dist/cli/ext-dev.d.ts.map +1 -1
- package/dist/cli/ext-dev.js +8 -8
- package/dist/cli/ext-dev.js.map +1 -1
- package/dist/cli/ext.js +3 -3
- package/dist/cli/ext.js.map +1 -1
- package/dist/cli/office.js +2 -2
- package/dist/cli/office.js.map +1 -1
- package/dist/commands/auto-reply.d.ts.map +1 -1
- package/dist/commands/auto-reply.js +1 -2
- package/dist/commands/auto-reply.js.map +1 -1
- package/dist/commands/login.js +1 -1
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/manifest.d.ts.map +1 -1
- package/dist/commands/manifest.js +3 -1
- package/dist/commands/manifest.js.map +1 -1
- package/dist/commands/model.d.ts.map +1 -1
- package/dist/commands/model.js +3 -7
- package/dist/commands/model.js.map +1 -1
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +7 -7
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/session-view.d.ts.map +1 -1
- package/dist/commands/session-view.js +1 -2
- package/dist/commands/session-view.js.map +1 -1
- package/dist/commands/types.d.ts +2 -1
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/commands/types.js.map +1 -1
- package/dist/config.d.ts +10 -18
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -15
- package/dist/config.js.map +1 -1
- package/dist/execution-resolver.d.ts +4 -6
- package/dist/execution-resolver.d.ts.map +1 -1
- package/dist/execution-resolver.js +10 -19
- package/dist/execution-resolver.js.map +1 -1
- package/dist/harness/extensions/loader.js +1 -1
- package/dist/harness/extensions/loader.js.map +1 -1
- package/dist/harness/skills.d.ts +8 -0
- package/dist/harness/skills.d.ts.map +1 -1
- package/dist/harness/skills.js +46 -4
- package/dist/harness/skills.js.map +1 -1
- package/dist/harness/types.d.ts +2 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +16 -16
- package/dist/main.js.map +1 -1
- package/dist/{office-address.d.ts → office/address.d.ts} +13 -14
- package/dist/office/address.d.ts.map +1 -0
- package/dist/{office-address.js → office/address.js} +13 -18
- package/dist/office/address.js.map +1 -0
- package/dist/office/index.d.ts +11 -0
- package/dist/office/index.d.ts.map +1 -0
- package/dist/office/index.js +11 -0
- package/dist/office/index.js.map +1 -0
- package/dist/office/layout.d.ts +20 -0
- package/dist/office/layout.d.ts.map +1 -0
- package/dist/office/layout.js +88 -0
- package/dist/office/layout.js.map +1 -0
- package/dist/{office-migration.d.ts → office/migration.d.ts} +3 -3
- package/dist/office/migration.d.ts.map +1 -0
- package/dist/{office-migration.js → office/migration.js} +8 -12
- package/dist/office/migration.js.map +1 -0
- package/dist/{office-registry.d.ts → office/registry.d.ts} +18 -24
- package/dist/office/registry.d.ts.map +1 -0
- package/dist/{office-registry.js → office/registry.js} +22 -83
- package/dist/office/registry.js.map +1 -0
- package/dist/office/types.d.ts +71 -0
- package/dist/office/types.d.ts.map +1 -0
- package/dist/office/types.js +2 -0
- package/dist/office/types.js.map +1 -0
- package/dist/packages/admin.js +5 -5
- package/dist/packages/admin.js.map +1 -1
- package/dist/packages/inspect.d.ts.map +1 -1
- package/dist/packages/inspect.js +3 -8
- package/dist/packages/inspect.js.map +1 -1
- package/dist/packages/materialize.js +1 -1
- package/dist/packages/materialize.js.map +1 -1
- package/dist/packages/resolve.js +5 -8
- package/dist/packages/resolve.js.map +1 -1
- package/dist/packages/types.d.ts +2 -5
- package/dist/packages/types.d.ts.map +1 -1
- package/dist/packages/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +13 -15
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.js +1 -1
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +3 -2
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/identity.js +1 -1
- package/dist/sandbox/identity.js.map +1 -1
- package/dist/settings-mutation.d.ts +3 -2
- package/dist/settings-mutation.d.ts.map +1 -1
- package/dist/settings-mutation.js +6 -7
- package/dist/settings-mutation.js.map +1 -1
- package/dist/tools/generate-image.d.ts +8 -2
- package/dist/tools/generate-image.d.ts.map +1 -1
- package/dist/tools/generate-image.js +5 -3
- package/dist/tools/generate-image.js.map +1 -1
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/trigger.d.ts +1 -1
- package/dist/trigger.d.ts.map +1 -1
- package/dist/trigger.js +5 -10
- package/dist/trigger.js.map +1 -1
- package/dist/types.d.ts +3 -22
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/vault/index.js +1 -1
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/injection.d.ts +3 -1
- package/dist/vault/injection.d.ts.map +1 -1
- package/dist/vault/injection.js +2 -2
- package/dist/vault/injection.js.map +1 -1
- package/dist/web/admin/portal.d.ts.map +1 -1
- package/dist/web/admin/portal.js +67 -80
- package/dist/web/admin/portal.js.map +1 -1
- package/dist/web/admin/types.d.ts +2 -1
- package/dist/web/admin/types.d.ts.map +1 -1
- package/dist/web/admin/types.js.map +1 -1
- package/dist/web/server.d.ts +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +3 -3
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-view/portal.js +1 -1
- package/dist/web/session-view/portal.js.map +1 -1
- package/dist/workspace-projection/index.d.ts +2 -4
- package/dist/workspace-projection/index.d.ts.map +1 -1
- package/dist/workspace-projection/index.js +21 -56
- package/dist/workspace-projection/index.js.map +1 -1
- package/dist/workspace-projection/types.d.ts +0 -2
- package/dist/workspace-projection/types.d.ts.map +1 -1
- package/dist/workspace-projection/types.js.map +1 -1
- package/package.json +41 -16
- package/dist/office-address.d.ts.map +0 -1
- package/dist/office-address.js.map +0 -1
- package/dist/office-migration.d.ts.map +0 -1
- package/dist/office-migration.js.map +0 -1
- package/dist/office-registry.d.ts.map +0 -1
- package/dist/office-registry.js.map +0 -1
- package/dist/store.d.ts +0 -51
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -185
- package/dist/store.js.map +0 -1
package/dist/commands/sandbox.js
CHANGED
|
@@ -71,10 +71,10 @@ export class SandboxCommandHandler {
|
|
|
71
71
|
return true;
|
|
72
72
|
}
|
|
73
73
|
if (parsed.action === "door") {
|
|
74
|
-
const
|
|
74
|
+
const projection = resolveWorkspaceProjection(context.services.workspace.office(context.address));
|
|
75
75
|
if (parsed.doorPolicy === undefined) {
|
|
76
76
|
await replyDiagnosticWithContext(context.responder, formatCommandSummary("Sandbox Door", [
|
|
77
|
-
`Current: ${
|
|
77
|
+
`Current: ${projection.doorPolicy} / ${projection.layout}`,
|
|
78
78
|
"",
|
|
79
79
|
"用法:`/pi-sandbox door <default|isolated|shared|full>`",
|
|
80
80
|
"- `default`:跟隨全域預設",
|
|
@@ -92,14 +92,14 @@ export class SandboxCommandHandler {
|
|
|
92
92
|
]), { style: "muted" });
|
|
93
93
|
return true;
|
|
94
94
|
}
|
|
95
|
-
const result = applyConversationWorkspacePolicy(context.services.runtime, context.services.
|
|
95
|
+
const result = applyConversationWorkspacePolicy(context.services.runtime, context.services.workspace.office(context.address), choice);
|
|
96
96
|
if (!result.ok) {
|
|
97
97
|
await replyDiagnosticWithContext(context.responder, formatCommandSummary("Sandbox Door", [
|
|
98
98
|
"目前有工作正在執行,無法切換 door policy。等執行結束後再試一次。",
|
|
99
99
|
]), { style: "muted" });
|
|
100
100
|
return true;
|
|
101
101
|
}
|
|
102
|
-
const updated = resolveWorkspaceProjection(context.services.
|
|
102
|
+
const updated = resolveWorkspaceProjection(context.services.workspace.office(context.address));
|
|
103
103
|
await replyDiagnosticWithContext(context.responder, formatCommandSummary("Sandbox Door", [
|
|
104
104
|
`Door policy 已更新。Effective: ${updated.doorPolicy} / ${updated.layout}`,
|
|
105
105
|
"下一則訊息時會以新的掛載重建 sandbox 容器;容器內容會保留。",
|
|
@@ -109,12 +109,12 @@ export class SandboxCommandHandler {
|
|
|
109
109
|
const status = context.services.resourceController.getLimitStatus(containerKey);
|
|
110
110
|
const defaultLimits = context.services.resourceController.getDefaultLimits();
|
|
111
111
|
const boostLimits = context.services.resourceController.getBoostLimits();
|
|
112
|
-
const
|
|
112
|
+
const projection = resolveWorkspaceProjection(context.services.workspace.office(context.address));
|
|
113
113
|
await replyDiagnosticWithContext(context.responder, formatCommandSummary("Sandbox", [
|
|
114
114
|
`Current: ${formatLimits(status.limits)}`,
|
|
115
115
|
`Status: ${status.boosted ? "boosted" : "default"}`,
|
|
116
|
-
`Workspace policy: ${
|
|
117
|
-
`Workspace layout: ${
|
|
116
|
+
`Workspace policy: ${projection.doorPolicy}`,
|
|
117
|
+
`Workspace layout: ${projection.layout}`,
|
|
118
118
|
"",
|
|
119
119
|
`Default: ${formatLimits(defaultLimits)}`,
|
|
120
120
|
boostLimits ? `Boost: ${formatLimits({ ...defaultLimits, ...boostLimits })}` : undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/commands/sandbox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WorkspacePolicyChoice } from \"../config.js\";\nimport { resolveWorkspaceProjection } from \"../workspace-projection/index.js\";\nimport { runtimeResourceKey } from \"../sandbox/identity.js\";\nimport { applyConversationWorkspacePolicy } from \"../settings-mutation.js\";\nimport { slashForms } from \"./manifest.js\";\nimport { matchCommand } from \"./parse.js\";\nimport type { CommandContext, CommandHandler, ParsedSandboxCommand } from \"./types.js\";\nimport { formatCommandSummary, replyDiagnosticWithContext } from \"./utils.js\";\n\n/** Word → selection; null clears the override, undefined is an unknown word. */\nfunction doorChoiceFromWord(word: string): WorkspacePolicyChoice | null | undefined {\n switch (word) {\n case \"default\":\n return null;\n case \"isolated\":\n return { doorPolicy: \"isolated\" };\n case \"shared\":\n case \"shared-support\":\n return { doorPolicy: \"trusted\", layout: \"shared-support\" };\n case \"full\":\n return { doorPolicy: \"trusted\", layout: \"full\" };\n default:\n return undefined;\n }\n}\n\nexport type { ParsedSandboxCommand } from \"./types.js\";\n\nconst SANDBOX_COMMANDS = slashForms(\"sandbox\");\n\nexport function parseSandboxCommand(text: string): ParsedSandboxCommand | null {\n const matched = matchCommand(text, SANDBOX_COMMANDS, { stripMention: true });\n if (!matched) return null;\n\n const action = matched.args.length > 0 ? matched.args[0].toLowerCase() : undefined;\n if (action === \"boost\" && matched.args.length === 1) {\n return { action };\n }\n if (action === \"door\" && matched.args.length <= 2) {\n return {\n action,\n ...(matched.args.length === 2 ? { doorPolicy: matched.args[1].toLowerCase() } : {}),\n };\n }\n return {};\n}\n\nexport class SandboxCommandHandler implements CommandHandler {\n async tryHandle(context: CommandContext): Promise<boolean> {\n const parsed = parseSandboxCommand(context.commandText);\n if (!parsed) return false;\n\n if (\n (context.services.sandbox.type !== \"image\" && context.services.sandbox.type !== \"gondolin\") ||\n !context.services.resourceController\n ) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox\", [\n \"`/pi-sandbox` 目前只支援 `image:*` 與 `gondolin:*` managed sandbox。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const containerKey = runtimeResourceKey(context.services.sandbox, {\n userId: context.platformUserId,\n conversationId: context.conversationId,\n });\n\n if (parsed.action === \"boost\") {\n const boostLimits = context.services.resourceController.getBoostLimits();\n if (!boostLimits?.cpus && !boostLimits?.memory) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Boost\", [\n \"此 mikan instance 尚未設定 sandbox boost 規格。\",\n \"請先在全域 settings.json 設定 `sandbox.boost`。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const status = await context.services.resourceController.boost(containerKey);\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Boost\", [\n \"已暫時提升此 conversation 的 sandbox 規格。\",\n `Current: ${formatLimits(status.limits)}`,\n \"boost 會在此 sandbox runtime 關閉後結束。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n if (parsed.action === \"door\") {\n const workspace = resolveWorkspaceProjection(context.services.workingDir, context.address);\n if (parsed.doorPolicy === undefined) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Door\", [\n `Current: ${workspace.doorPolicy} / ${workspace.layout}`,\n \"\",\n \"用法:`/pi-sandbox door <default|isolated|shared|full>`\",\n \"- `default`:跟隨全域預設\",\n \"- `isolated`:只掛載自己辦公室\",\n \"- `shared`:辦公室 + 共用 MEMORY.md / skills / events\",\n \"- `full`:掛載整個 workspace(全開)\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n const choice = doorChoiceFromWord(parsed.doorPolicy);\n if (choice === undefined) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Door\", [\n `未知的 door policy:\\`${parsed.doorPolicy}\\``,\n \"可用值:`default`、`isolated`、`shared`、`full`\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n const result = applyConversationWorkspacePolicy(\n context.services.runtime,\n context.services.workingDir,\n context.address,\n choice,\n );\n if (!result.ok) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Door\", [\n \"目前有工作正在執行,無法切換 door policy。等執行結束後再試一次。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n const updated = resolveWorkspaceProjection(context.services.workingDir, context.address);\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Door\", [\n `Door policy 已更新。Effective: ${updated.doorPolicy} / ${updated.layout}`,\n \"下一則訊息時會以新的掛載重建 sandbox 容器;容器內容會保留。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const status = context.services.resourceController.getLimitStatus(containerKey);\n const defaultLimits = context.services.resourceController.getDefaultLimits();\n const boostLimits = context.services.resourceController.getBoostLimits();\n const workspace = resolveWorkspaceProjection(context.services.workingDir, context.address);\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\n \"Sandbox\",\n [\n `Current: ${formatLimits(status.limits)}`,\n `Status: ${status.boosted ? \"boosted\" : \"default\"}`,\n `Workspace policy: ${workspace.doorPolicy}`,\n `Workspace layout: ${workspace.layout}`,\n \"\",\n `Default: ${formatLimits(defaultLimits)}`,\n boostLimits ? `Boost: ${formatLimits({ ...defaultLimits, ...boostLimits })}` : undefined,\n ].filter((line): line is string => line !== undefined),\n ),\n { style: \"muted\" },\n );\n return true;\n }\n}\n\nfunction formatLimits(limits: { cpus?: string; memory?: string } | undefined): string {\n return `CPU ${limits?.cpus ?? \"unlimited\"} / Memory ${limits?.memory ?? \"unlimited\"}`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/commands/sandbox.ts"],"names":[],"mappings":"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","sourcesContent":["import type { WorkspacePolicyChoice } from \"../config.js\";\nimport { resolveWorkspaceProjection } from \"../workspace-projection/index.js\";\nimport { runtimeResourceKey } from \"../sandbox/identity.js\";\nimport { applyConversationWorkspacePolicy } from \"../settings-mutation.js\";\nimport { slashForms } from \"./manifest.js\";\nimport { matchCommand } from \"./parse.js\";\nimport type { CommandContext, CommandHandler, ParsedSandboxCommand } from \"./types.js\";\nimport { formatCommandSummary, replyDiagnosticWithContext } from \"./utils.js\";\n\n/** Word → selection; null clears the override, undefined is an unknown word. */\nfunction doorChoiceFromWord(word: string): WorkspacePolicyChoice | null | undefined {\n switch (word) {\n case \"default\":\n return null;\n case \"isolated\":\n return { doorPolicy: \"isolated\" };\n case \"shared\":\n case \"shared-support\":\n return { doorPolicy: \"trusted\", layout: \"shared-support\" };\n case \"full\":\n return { doorPolicy: \"trusted\", layout: \"full\" };\n default:\n return undefined;\n }\n}\n\nexport type { ParsedSandboxCommand } from \"./types.js\";\n\nconst SANDBOX_COMMANDS = slashForms(\"sandbox\");\n\nexport function parseSandboxCommand(text: string): ParsedSandboxCommand | null {\n const matched = matchCommand(text, SANDBOX_COMMANDS, { stripMention: true });\n if (!matched) return null;\n\n const action = matched.args.length > 0 ? matched.args[0].toLowerCase() : undefined;\n if (action === \"boost\" && matched.args.length === 1) {\n return { action };\n }\n if (action === \"door\" && matched.args.length <= 2) {\n return {\n action,\n ...(matched.args.length === 2 ? { doorPolicy: matched.args[1].toLowerCase() } : {}),\n };\n }\n return {};\n}\n\nexport class SandboxCommandHandler implements CommandHandler {\n async tryHandle(context: CommandContext): Promise<boolean> {\n const parsed = parseSandboxCommand(context.commandText);\n if (!parsed) return false;\n\n if (\n (context.services.sandbox.type !== \"image\" && context.services.sandbox.type !== \"gondolin\") ||\n !context.services.resourceController\n ) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox\", [\n \"`/pi-sandbox` 目前只支援 `image:*` 與 `gondolin:*` managed sandbox。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const containerKey = runtimeResourceKey(context.services.sandbox, {\n userId: context.platformUserId,\n conversationId: context.conversationId,\n });\n\n if (parsed.action === \"boost\") {\n const boostLimits = context.services.resourceController.getBoostLimits();\n if (!boostLimits?.cpus && !boostLimits?.memory) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Boost\", [\n \"此 mikan instance 尚未設定 sandbox boost 規格。\",\n \"請先在全域 settings.json 設定 `sandbox.boost`。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const status = await context.services.resourceController.boost(containerKey);\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Boost\", [\n \"已暫時提升此 conversation 的 sandbox 規格。\",\n `Current: ${formatLimits(status.limits)}`,\n \"boost 會在此 sandbox runtime 關閉後結束。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n if (parsed.action === \"door\") {\n const projection = resolveWorkspaceProjection(\n context.services.workspace.office(context.address),\n );\n if (parsed.doorPolicy === undefined) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Door\", [\n `Current: ${projection.doorPolicy} / ${projection.layout}`,\n \"\",\n \"用法:`/pi-sandbox door <default|isolated|shared|full>`\",\n \"- `default`:跟隨全域預設\",\n \"- `isolated`:只掛載自己辦公室\",\n \"- `shared`:辦公室 + 共用 MEMORY.md / skills / events\",\n \"- `full`:掛載整個 workspace(全開)\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n const choice = doorChoiceFromWord(parsed.doorPolicy);\n if (choice === undefined) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Door\", [\n `未知的 door policy:\\`${parsed.doorPolicy}\\``,\n \"可用值:`default`、`isolated`、`shared`、`full`\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n const result = applyConversationWorkspacePolicy(\n context.services.runtime,\n context.services.workspace.office(context.address),\n choice,\n );\n if (!result.ok) {\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Door\", [\n \"目前有工作正在執行,無法切換 door policy。等執行結束後再試一次。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n const updated = resolveWorkspaceProjection(\n context.services.workspace.office(context.address),\n );\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\"Sandbox Door\", [\n `Door policy 已更新。Effective: ${updated.doorPolicy} / ${updated.layout}`,\n \"下一則訊息時會以新的掛載重建 sandbox 容器;容器內容會保留。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const status = context.services.resourceController.getLimitStatus(containerKey);\n const defaultLimits = context.services.resourceController.getDefaultLimits();\n const boostLimits = context.services.resourceController.getBoostLimits();\n const projection = resolveWorkspaceProjection(\n context.services.workspace.office(context.address),\n );\n await replyDiagnosticWithContext(\n context.responder,\n formatCommandSummary(\n \"Sandbox\",\n [\n `Current: ${formatLimits(status.limits)}`,\n `Status: ${status.boosted ? \"boosted\" : \"default\"}`,\n `Workspace policy: ${projection.doorPolicy}`,\n `Workspace layout: ${projection.layout}`,\n \"\",\n `Default: ${formatLimits(defaultLimits)}`,\n boostLimits ? `Boost: ${formatLimits({ ...defaultLimits, ...boostLimits })}` : undefined,\n ].filter((line): line is string => line !== undefined),\n ),\n { style: \"muted\" },\n );\n return true;\n }\n}\n\nfunction formatLimits(limits: { cpus?: string; memory?: string } | undefined): string {\n return `CPU ${limits?.cpus ?? \"unlimited\"} / Memory ${limits?.memory ?? \"unlimited\"}`;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-view.d.ts","sourceRoot":"","sources":["../../src/commands/session-view.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"session-view.d.ts","sourceRoot":"","sources":["../../src/commands/session-view.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjE,qBAAa,yBAA0B,YAAW,cAAc;IACxD,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAiEzD;CACF"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { resolveExistingSessionFile } from "../web/session-view/service.js";
|
|
2
2
|
import { parseSessionViewCommand } from "../web/session-view/command.js";
|
|
3
3
|
import { formatCommandSummary, replyPrivatelyWithContext } from "./utils.js";
|
|
4
|
-
import { conversationOfficeDir } from "../office-address.js";
|
|
5
4
|
export class SessionViewCommandHandler {
|
|
6
5
|
async tryHandle(context) {
|
|
7
6
|
if (!parseSessionViewCommand(context.commandText))
|
|
@@ -19,7 +18,7 @@ export class SessionViewCommandHandler {
|
|
|
19
18
|
]), { style: "muted" });
|
|
20
19
|
return true;
|
|
21
20
|
}
|
|
22
|
-
const sessionFile = resolveExistingSessionFile(
|
|
21
|
+
const sessionFile = resolveExistingSessionFile(context.services.workspace.office(context.address).dir, context.sessionKey);
|
|
23
22
|
if (!sessionFile) {
|
|
24
23
|
await replyPrivatelyWithContext(context, formatCommandSummary("Session", [
|
|
25
24
|
"目前還沒有可查看的 session。",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-view.js","sourceRoot":"","sources":["../../src/commands/session-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"session-view.js","sourceRoot":"","sources":["../../src/commands/session-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE7E,MAAM,OAAO,yBAAyB;IACpC,KAAK,CAAC,SAAS,CAAC,OAAuB;QACrC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAC;QAEhE,IAAI,CAAC,OAAO,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;YAC7D,MAAM,yBAAyB,CAC7B,OAAO,EACP,oBAAoB,CAAC,SAAS,EAAE;gBAC9B,4CAA4C;aAC7C,CAAC,EACF,EAAE,KAAK,EAAE,OAAO,EAAE,CACnB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;YACpC,MAAM,yBAAyB,CAC7B,OAAO,EACP,oBAAoB,CAAC,SAAS,EAAE;gBAC9B,mCAAmC;gBACnC,0DAA0D;aAC3D,CAAC,EACF,EAAE,KAAK,EAAE,OAAO,EAAE,CACnB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,0BAA0B,CAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EACtD,OAAO,CAAC,UAAU,CACnB,CAAC;QACF,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,yBAAyB,CAC7B,OAAO,EACP,oBAAoB,CAAC,SAAS,EAAE;gBAC9B,oBAAoB;gBACpB,2BAA2B;aAC5B,CAAC,EACF,EAAE,KAAK,EAAE,OAAO,EAAE,CACnB,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG;aAC7B,gBAAgB,EAAE;aAClB,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,WAAW,CAAC;QAE7E,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CACzD,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,UAAU,EAClB,WAAW,EACX,gBAAgB,CACjB,CAAC;QAEF,MAAM,yBAAyB,CAC7B,OAAO,EACP,oBAAoB,CAAC,SAAS,EAAE;YAC9B,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,kBAAkB,KAAK,CAAC,KAAK,EAAE;YAChE,mBAAmB;SACpB,CAAC,EACF,EAAE,KAAK,EAAE,OAAO,EAAE,CACnB,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import { resolveExistingSessionFile } from \"../web/session-view/service.js\";\nimport { parseSessionViewCommand } from \"../web/session-view/command.js\";\nimport type { CommandContext, CommandHandler } from \"./types.js\";\nimport { formatCommandSummary, replyPrivatelyWithContext } from \"./utils.js\";\n\nexport class SessionViewCommandHandler implements CommandHandler {\n async tryHandle(context: CommandContext): Promise<boolean> {\n if (!parseSessionViewCommand(context.commandText)) return false;\n\n if (!context.privateConversation && !context.bot.postPrivate) {\n await replyPrivatelyWithContext(\n context,\n formatCommandSummary(\"Session\", [\n \"為了保護對話內容,`/session` 目前只能在與機器人的私訊 / DM 中使用。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n if (!context.services.portalBaseUrl) {\n await replyPrivatelyWithContext(\n context,\n formatCommandSummary(\"Session\", [\n \"Session viewer is not configured.\",\n \"Set `MIKAN_LINK_URL` or `MIKAN_LINK_PORT` on the server.\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const sessionFile = resolveExistingSessionFile(\n context.services.workspace.office(context.address).dir,\n context.sessionKey,\n );\n if (!sessionFile) {\n await replyPrivatelyWithContext(\n context,\n formatCommandSummary(\"Session\", [\n \"目前還沒有可查看的 session。\",\n \"先和機器人對話一次,建立 session 後再試。\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n\n const platformUser = context.bot\n .getMessagingInfo()\n .users.find((user) => user.id === context.platformUserId);\n const platformUserName = platformUser?.userName || platformUser?.displayName;\n\n const token = context.services.sessionViewTokenStore.create(\n context.platform,\n context.platformUserId,\n context.conversationId,\n context.sessionKey,\n sessionFile,\n platformUserName,\n );\n\n await replyPrivatelyWithContext(\n context,\n formatCommandSummary(\"Session\", [\n `${context.services.portalBaseUrl}/session?token=${token.token}`,\n \"Expires: 24 hours\",\n ]),\n { style: \"muted\" },\n );\n return true;\n }\n}\n"]}
|
package/dist/commands/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
2
|
import type { Api, Model } from "@earendil-works/pi-ai";
|
|
3
3
|
import type { MessagingBot, ConversationContext, OfficeAddress, PlatformName } from "../adapter.js";
|
|
4
|
+
import type { Workspace } from "../office/index.js";
|
|
4
5
|
import type { DockerContainerManager } from "../provisioner.js";
|
|
5
6
|
import type { SandboxConfig } from "../sandbox/index.js";
|
|
6
7
|
import type { SandboxResourceController } from "../types.js";
|
|
@@ -74,7 +75,7 @@ interface CommandRuntimeBridge {
|
|
|
74
75
|
refreshConversationEnvironment(address: OfficeAddress): boolean;
|
|
75
76
|
}
|
|
76
77
|
export interface CommandServices {
|
|
77
|
-
|
|
78
|
+
workspace: Workspace;
|
|
78
79
|
runtime?: CommandRuntimeBridge;
|
|
79
80
|
sandbox: SandboxConfig;
|
|
80
81
|
vaultManager: VaultManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { MessagingBot, ConversationContext, OfficeAddress, PlatformName } from \"../adapter.js\";\nimport type { DockerContainerManager } from \"../provisioner.js\";\nimport type { SandboxConfig } from \"../sandbox/index.js\";\nimport type { SandboxResourceController } from \"../types.js\";\nimport type { VaultManager } from \"../vault/index.js\";\n\ninterface CommandArgSpec {\n name: string;\n description: string;\n required: boolean;\n}\n\n/**\n * Data for the Slack adapter's generic slash route (how the synthesized\n * command event is built). All flags default to false.\n */\nexport interface SlackSlashRoute {\n /** Append the slash payload's free text to the synthesized command text. */\n includeText?: boolean;\n /** Scope the event to the invoking thread (thread-scoped session key). */\n thread?: boolean;\n /** Outside DMs, mark the event `private_command` so replies stay between the bot and the user. */\n privateCommand?: boolean;\n}\n\nexport interface CommandManifestEntry {\n /** Canonical name without slash, e.g. \"login\"; `/login` and `/pi-login` are derived. */\n name: string;\n description: string;\n /** Extra accepted spellings beyond `name` (e.g. \"autoreply\"); each also gets a `pi-` form. */\n aliases?: readonly string[];\n /** Optional single free-text argument for platforms that register typed args. */\n arg?: CommandArgSpec;\n /** Accepted without a leading slash. Per CONTEXT.md, only `session`. */\n bare?: boolean;\n /**\n * Routed by conversation intake as a magic word, never by a command\n * handler. Such an entry exists for platform registration/UI only.\n */\n magicWord?: boolean;\n /** Slack slash-command name, e.g. \"/pi-login\". Absent = not a Slack slash command. */\n slackCommand?: string;\n /** Slack routing data; absent for `new`, whose Slack dispatch is bespoke. */\n slackRoute?: SlackSlashRoute;\n /** Registered as a Discord application command. */\n discord?: boolean;\n /** Listed in Telegram's command menu; `description` overrides the shared one. */\n telegramMenu?: { description?: string };\n}\n\nexport interface LinkTokenStoreLike {\n create(\n platform: PlatformName,\n platformUserId: string,\n conversationId: string,\n vaultId: string,\n providerId: string,\n ): { token: string };\n}\n\nexport interface SessionViewTokenStoreLike {\n create(\n platform: PlatformName,\n platformUserId: string,\n conversationId: string,\n sessionKey: string,\n sessionFile: string,\n platformUserName?: string,\n ): { token: string };\n}\n\nexport interface AdminTokenStoreLike {\n create(args: {\n platform: PlatformName;\n platformUserId: string;\n conversationId: string;\n platformUserName?: string;\n }): { token: string };\n}\n\ninterface CommandRuntimeBridge {\n handleNewCommand(\n sessionKey: string,\n conversationId: string,\n bot: MessagingBot,\n message: ConversationContext[\"message\"],\n responder: ConversationContext[\"responder\"],\n platform: ConversationContext[\"platform\"],\n ): Promise<void>;\n switchConversationModel(address: OfficeAddress, provider: string, model: string): boolean;\n refreshConversationEnvironment(address: OfficeAddress): boolean;\n}\n\nexport interface CommandServices {\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/commands/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport type { MessagingBot, ConversationContext, OfficeAddress, PlatformName } from \"../adapter.js\";\nimport type { Workspace } from \"../office/index.js\";\nimport type { DockerContainerManager } from \"../provisioner.js\";\nimport type { SandboxConfig } from \"../sandbox/index.js\";\nimport type { SandboxResourceController } from \"../types.js\";\nimport type { VaultManager } from \"../vault/index.js\";\n\ninterface CommandArgSpec {\n name: string;\n description: string;\n required: boolean;\n}\n\n/**\n * Data for the Slack adapter's generic slash route (how the synthesized\n * command event is built). All flags default to false.\n */\nexport interface SlackSlashRoute {\n /** Append the slash payload's free text to the synthesized command text. */\n includeText?: boolean;\n /** Scope the event to the invoking thread (thread-scoped session key). */\n thread?: boolean;\n /** Outside DMs, mark the event `private_command` so replies stay between the bot and the user. */\n privateCommand?: boolean;\n}\n\nexport interface CommandManifestEntry {\n /** Canonical name without slash, e.g. \"login\"; `/login` and `/pi-login` are derived. */\n name: string;\n description: string;\n /** Extra accepted spellings beyond `name` (e.g. \"autoreply\"); each also gets a `pi-` form. */\n aliases?: readonly string[];\n /** Optional single free-text argument for platforms that register typed args. */\n arg?: CommandArgSpec;\n /** Accepted without a leading slash. Per CONTEXT.md, only `session`. */\n bare?: boolean;\n /**\n * Routed by conversation intake as a magic word, never by a command\n * handler. Such an entry exists for platform registration/UI only.\n */\n magicWord?: boolean;\n /** Slack slash-command name, e.g. \"/pi-login\". Absent = not a Slack slash command. */\n slackCommand?: string;\n /** Slack routing data; absent for `new`, whose Slack dispatch is bespoke. */\n slackRoute?: SlackSlashRoute;\n /** Registered as a Discord application command. */\n discord?: boolean;\n /** Listed in Telegram's command menu; `description` overrides the shared one. */\n telegramMenu?: { description?: string };\n}\n\nexport interface LinkTokenStoreLike {\n create(\n platform: PlatformName,\n platformUserId: string,\n conversationId: string,\n vaultId: string,\n providerId: string,\n ): { token: string };\n}\n\nexport interface SessionViewTokenStoreLike {\n create(\n platform: PlatformName,\n platformUserId: string,\n conversationId: string,\n sessionKey: string,\n sessionFile: string,\n platformUserName?: string,\n ): { token: string };\n}\n\nexport interface AdminTokenStoreLike {\n create(args: {\n platform: PlatformName;\n platformUserId: string;\n conversationId: string;\n platformUserName?: string;\n }): { token: string };\n}\n\ninterface CommandRuntimeBridge {\n handleNewCommand(\n sessionKey: string,\n conversationId: string,\n bot: MessagingBot,\n message: ConversationContext[\"message\"],\n responder: ConversationContext[\"responder\"],\n platform: ConversationContext[\"platform\"],\n ): Promise<void>;\n switchConversationModel(address: OfficeAddress, provider: string, model: string): boolean;\n refreshConversationEnvironment(address: OfficeAddress): boolean;\n}\n\nexport interface CommandServices {\n workspace: Workspace;\n runtime?: CommandRuntimeBridge;\n sandbox: SandboxConfig;\n vaultManager: VaultManager;\n provisioner?: DockerContainerManager;\n resourceController?: SandboxResourceController;\n linkTokenStore: LinkTokenStoreLike;\n sessionViewTokenStore: SessionViewTokenStoreLike;\n adminTokenStore: AdminTokenStoreLike;\n portalBaseUrl?: string;\n}\n\nexport interface CommandContext {\n bot: MessagingBot;\n responder: ConversationContext[\"responder\"];\n platform: PlatformName;\n address: import(\"../adapter.js\").OfficeAddress;\n platformUserId: string;\n platformUserName?: string;\n conversationId: string;\n vaultConversationId?: string;\n sessionKey: string;\n commandText: string;\n privateConversation: boolean;\n services: CommandServices;\n}\n\nexport interface CommandHandler {\n tryHandle(context: CommandContext): Promise<boolean>;\n}\n\n/** Minimal model lookup contract used by the model command. */\nexport interface ModelRegistry {\n find(provider: string, modelId: string): Model<Api> | undefined;\n}\n\n// ── command-specific parsed types ────────────────────────────────────────────\n\nexport interface ParsedModelCommand {\n provider?: string;\n /** Model id without a thinking-level suffix, when one was supplied. */\n model?: string;\n /** Complete model id candidate, including a possible colon suffix. */\n modelCandidate?: string;\n /** Suffix kept for handler-side validation after exact model lookup. */\n thinkingLevelCandidate?: string;\n thinkingLevel?: ThinkingLevel;\n error?: \"invalid_spec\";\n}\n\nexport interface ParsedSandboxCommand {\n action?: \"boost\" | \"door\";\n /** Raw door-policy argument; the handler validates it so typos get a usage reply. */\n doorPolicy?: string;\n}\n\nexport type ParsedLoginCommand =\n | { action: \"setup\" }\n | { action: \"shared_create\" | \"shared_update\" | \"shared_delete\"; name: string }\n | { action: \"shared_list\" }\n | { action: \"copy_shared\"; name: string };\n"]}
|
package/dist/config.d.ts
CHANGED
|
@@ -4,21 +4,13 @@ export declare class MissingGlobalSettingsError extends Error {
|
|
|
4
4
|
}
|
|
5
5
|
export type { AgentConfig, AutoReplyConfig, JudgeModelConfig, SandboxSettings } from "./types.js";
|
|
6
6
|
import type { AgentConfig, AutoReplyConfig, JudgeModelConfig } from "./types.js";
|
|
7
|
-
import type {
|
|
7
|
+
import type { Office } from "./office/index.js";
|
|
8
8
|
export declare function loadGlobalSettings(): AgentConfig;
|
|
9
|
-
/**
|
|
10
|
-
* Explicit identity for conversation-settings access. The state-dir key is
|
|
11
|
-
* the office key derived from the address; the workspace directory is only
|
|
12
|
-
* the legacy pre-host-migration settings location. Callers name both — the
|
|
13
|
-
* key is never inferred from the directory basename.
|
|
14
|
-
*/
|
|
15
|
-
export interface ConversationSettingsScope {
|
|
16
|
-
address: OfficeAddress;
|
|
17
|
-
conversationDir: string;
|
|
18
|
-
}
|
|
19
9
|
/**
|
|
20
10
|
* Host-authoritative location of a conversation's settings file:
|
|
21
|
-
* `<
|
|
11
|
+
* `<office state dir>/settings.json`. The Office value names both the
|
|
12
|
+
* state-dir key and the legacy pre-host-migration location (its workspace
|
|
13
|
+
* dir) — the key is never inferred from a directory basename.
|
|
22
14
|
*
|
|
23
15
|
* Conversation settings used to live at `<conversationDir>/settings.json`,
|
|
24
16
|
* but conversation dirs are bind-mounted read-write into sandbox containers
|
|
@@ -33,8 +25,8 @@ export interface ConversationSettingsScope {
|
|
|
33
25
|
* migration marker — a legacy file (re)appearing later, e.g. planted from
|
|
34
26
|
* inside the sandbox, is never read again.
|
|
35
27
|
*/
|
|
36
|
-
export declare function conversationSettingsPath(
|
|
37
|
-
export declare function resolveConversationSettings(
|
|
28
|
+
export declare function conversationSettingsPath(office: Office): string;
|
|
29
|
+
export declare function resolveConversationSettings(office: Office): AgentConfig;
|
|
38
30
|
/**
|
|
39
31
|
* Resolve the model used to judge auto-reply rules. Falls back to the main
|
|
40
32
|
* llm.{provider,model} when llm.autoReply is not set, so a missing override
|
|
@@ -42,7 +34,7 @@ export declare function resolveConversationSettings(scope: ConversationSettingsS
|
|
|
42
34
|
*
|
|
43
35
|
* @deprecated Auto-reply is kept for compatibility while its future is undecided.
|
|
44
36
|
*/
|
|
45
|
-
export declare function loadAutoReplyJudgeModel(
|
|
37
|
+
export declare function loadAutoReplyJudgeModel(office?: Office): JudgeModelConfig;
|
|
46
38
|
/**
|
|
47
39
|
* Load the mom-compatible auto-reply marker file state for a conversation.
|
|
48
40
|
*
|
|
@@ -83,7 +75,7 @@ export declare function createGlobalSettingsFile(stateDir: string): string;
|
|
|
83
75
|
*/
|
|
84
76
|
export declare function resolveLinkBaseUrl(): string | undefined;
|
|
85
77
|
export declare function updateGlobalSettings(patch: Partial<AgentConfig>): void;
|
|
86
|
-
export declare function updateConversationSettings(
|
|
78
|
+
export declare function updateConversationSettings(office: Office, patch: Partial<AgentConfig>): void;
|
|
87
79
|
/** An explicit office door-policy selection; `layout` only exists behind a trusted door. */
|
|
88
80
|
export type WorkspacePolicyChoice = {
|
|
89
81
|
doorPolicy: "isolated";
|
|
@@ -95,7 +87,7 @@ export type WorkspacePolicyChoice = {
|
|
|
95
87
|
* The conversation's own door-policy override (legacy `image.workspaceMount`
|
|
96
88
|
* included), or null when the office follows the global default.
|
|
97
89
|
*/
|
|
98
|
-
export declare function loadConversationWorkspaceOverride(
|
|
99
|
-
export declare function setConversationWorkspacePolicy(
|
|
90
|
+
export declare function loadConversationWorkspaceOverride(office: Office): WorkspacePolicyChoice | null;
|
|
91
|
+
export declare function setConversationWorkspacePolicy(office: Office, choice: WorkspacePolicyChoice | null): void;
|
|
100
92
|
export declare function setGlobalWorkspacePolicy(choice: WorkspacePolicyChoice | null): void;
|
|
101
93
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,qBAAa,0BAA2B,SAAQ,KAAK;aACvB,YAAY,EAAE,MAAM;IAAhD,YAA4B,YAAY,EAAE,MAAM,EAG/C;CACF;AAED,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,qBAAa,0BAA2B,SAAQ,KAAK;aACvB,YAAY,EAAE,MAAM;IAAhD,YAA4B,YAAY,EAAE,MAAM,EAG/C;CACF;AAED,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAmB,MAAM,YAAY,CAAC;AAClG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAsQhD,wBAAgB,kBAAkB,IAAI,WAAW,CAEhD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA6B/D;AAcD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAoBvE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAQzE;AAUD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,eAAe,EAAE,MAAM,GAAG,eAAe,CAYxF;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,eAAe,GACtB,IAAI,CAaN;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAInE;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,IAAI,CAWN;AAOD,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAGrD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQjE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,GAAG,SAAS,CAIvD;AA+ED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAEtE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAE5F;AAED,4FAA4F;AAC5F,MAAM,MAAM,qBAAqB,GAC7B;IAAE,UAAU,EAAE,UAAU,CAAA;CAAE,GAC1B;IAAE,UAAU,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAA;CAAE,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAe9F;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,qBAAqB,GAAG,IAAI,GACnC,IAAI,CAEN;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAEnF"}
|
package/dist/config.js
CHANGED
|
@@ -13,7 +13,6 @@ export class MissingGlobalSettingsError extends Error {
|
|
|
13
13
|
this.name = "MissingGlobalSettingsError";
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
import { officeStateDir } from "./office-address.js";
|
|
17
16
|
const ONBOARD_SETTINGS = {
|
|
18
17
|
llm: {
|
|
19
18
|
provider: "anthropic",
|
|
@@ -228,7 +227,9 @@ export function loadGlobalSettings() {
|
|
|
228
227
|
}
|
|
229
228
|
/**
|
|
230
229
|
* Host-authoritative location of a conversation's settings file:
|
|
231
|
-
* `<
|
|
230
|
+
* `<office state dir>/settings.json`. The Office value names both the
|
|
231
|
+
* state-dir key and the legacy pre-host-migration location (its workspace
|
|
232
|
+
* dir) — the key is never inferred from a directory basename.
|
|
232
233
|
*
|
|
233
234
|
* Conversation settings used to live at `<conversationDir>/settings.json`,
|
|
234
235
|
* but conversation dirs are bind-mounted read-write into sandbox containers
|
|
@@ -243,14 +244,14 @@ export function loadGlobalSettings() {
|
|
|
243
244
|
* migration marker — a legacy file (re)appearing later, e.g. planted from
|
|
244
245
|
* inside the sandbox, is never read again.
|
|
245
246
|
*/
|
|
246
|
-
export function conversationSettingsPath(
|
|
247
|
-
const hostPath = join(
|
|
247
|
+
export function conversationSettingsPath(office) {
|
|
248
|
+
const hostPath = join(office.stateDir, "settings.json");
|
|
248
249
|
if (existsSync(hostPath)) {
|
|
249
250
|
assertSettingsFile(hostPath, "Host conversation settings");
|
|
250
251
|
return hostPath;
|
|
251
252
|
}
|
|
252
253
|
ensureDirExists(dirname(hostPath));
|
|
253
|
-
const legacyPath = join(
|
|
254
|
+
const legacyPath = join(office.dir, "settings.json");
|
|
254
255
|
let content = "{}\n";
|
|
255
256
|
let migrated = false;
|
|
256
257
|
if (existsSync(legacyPath)) {
|
|
@@ -285,9 +286,9 @@ function assertSettingsFile(path, label) {
|
|
|
285
286
|
throw new Error(`${label} must be a regular non-symlink file: ${path}`);
|
|
286
287
|
}
|
|
287
288
|
}
|
|
288
|
-
export function resolveConversationSettings(
|
|
289
|
+
export function resolveConversationSettings(office) {
|
|
289
290
|
const globalConfig = loadRawGlobalSettings();
|
|
290
|
-
const conversationConfig = normalizeSettingsConfig(loadSettingsFile(conversationSettingsPath(
|
|
291
|
+
const conversationConfig = normalizeSettingsConfig(loadSettingsFile(conversationSettingsPath(office)) ?? {});
|
|
291
292
|
// The sandbox group merges at the leaf level (see mergeSandboxSettings):
|
|
292
293
|
// a conversation that only sets sandbox.memory keeps the global sandbox.cpus.
|
|
293
294
|
const sandbox = mergeSandboxSettings(globalConfig.sandbox, conversationConfig.sandbox);
|
|
@@ -311,9 +312,9 @@ export function resolveConversationSettings(scope) {
|
|
|
311
312
|
*
|
|
312
313
|
* @deprecated Auto-reply is kept for compatibility while its future is undecided.
|
|
313
314
|
*/
|
|
314
|
-
export function loadAutoReplyJudgeModel(
|
|
315
|
+
export function loadAutoReplyJudgeModel(office) {
|
|
315
316
|
const global = requireGlobalSettings();
|
|
316
|
-
const local =
|
|
317
|
+
const local = office ? (loadSettingsFile(conversationSettingsPath(office)) ?? {}) : {};
|
|
317
318
|
const merged = { ...global.llm, ...local.llm };
|
|
318
319
|
const judge = { ...global.llm?.autoReply, ...local.llm?.autoReply };
|
|
319
320
|
const provider = requireString(judge.provider ?? merged?.provider, "llm.autoReply.provider");
|
|
@@ -484,15 +485,15 @@ function updateSettingsFile(settingsPath, patch, defaultSettings) {
|
|
|
484
485
|
export function updateGlobalSettings(patch) {
|
|
485
486
|
updateSettingsFile(join(getStateDir(), "settings.json"), patch, ONBOARD_SETTINGS);
|
|
486
487
|
}
|
|
487
|
-
export function updateConversationSettings(
|
|
488
|
-
updateSettingsFile(conversationSettingsPath(
|
|
488
|
+
export function updateConversationSettings(office, patch) {
|
|
489
|
+
updateSettingsFile(conversationSettingsPath(office), patch, {});
|
|
489
490
|
}
|
|
490
491
|
/**
|
|
491
492
|
* The conversation's own door-policy override (legacy `image.workspaceMount`
|
|
492
493
|
* included), or null when the office follows the global default.
|
|
493
494
|
*/
|
|
494
|
-
export function loadConversationWorkspaceOverride(
|
|
495
|
-
const file = loadSettingsFile(conversationSettingsPath(
|
|
495
|
+
export function loadConversationWorkspaceOverride(office) {
|
|
496
|
+
const file = loadSettingsFile(conversationSettingsPath(office));
|
|
496
497
|
const sandbox = file?.sandbox;
|
|
497
498
|
if (sandbox?.workspace?.doorPolicy === "isolated")
|
|
498
499
|
return { doorPolicy: "isolated" };
|
|
@@ -509,8 +510,8 @@ export function loadConversationWorkspaceOverride(scope) {
|
|
|
509
510
|
}
|
|
510
511
|
return null;
|
|
511
512
|
}
|
|
512
|
-
export function setConversationWorkspacePolicy(
|
|
513
|
-
writeWorkspacePolicy(conversationSettingsPath(
|
|
513
|
+
export function setConversationWorkspacePolicy(office, choice) {
|
|
514
|
+
writeWorkspacePolicy(conversationSettingsPath(office), choice, {});
|
|
514
515
|
}
|
|
515
516
|
export function setGlobalWorkspacePolicy(choice) {
|
|
516
517
|
writeWorkspacePolicy(join(getStateDir(), "settings.json"), choice, ONBOARD_SETTINGS);
|