negotium 0.1.8 → 0.1.10
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/README.md +24 -0
- package/dist/canonical-mcp-bridge.js +14 -0
- package/dist/canonical-mcp-bridge.js.map +9 -0
- package/dist/{chunk-n17yxpa8.js → chunk-1jdws5ns.js} +3 -3
- package/dist/chunk-1msje2zf.js +23 -0
- package/dist/chunk-1msje2zf.js.map +10 -0
- package/dist/{chunk-0ay6cjdy.js → chunk-1vth6t3y.js} +10 -10
- package/dist/{chunk-0ay6cjdy.js.map → chunk-1vth6t3y.js.map} +1 -1
- package/dist/{chunk-gxma4c70.js → chunk-2p2hds67.js} +22 -17
- package/dist/{chunk-gxma4c70.js.map → chunk-2p2hds67.js.map} +2 -2
- package/dist/{chunk-j2behpy7.js → chunk-39czd64s.js} +9 -9
- package/dist/{chunk-5ahkew9c.js → chunk-4f43r1nd.js} +8 -108
- package/dist/{chunk-5ahkew9c.js.map → chunk-4f43r1nd.js.map} +6 -9
- package/dist/{chunk-hkdqhm34.js → chunk-4yvkqxmm.js} +1 -1
- package/dist/{chunk-ghs2j1fr.js → chunk-5rmbpqy9.js} +18 -15
- package/dist/{chunk-ghs2j1fr.js.map → chunk-5rmbpqy9.js.map} +2 -2
- package/dist/chunk-9krt5z40.js +113 -0
- package/dist/chunk-9krt5z40.js.map +12 -0
- package/dist/{chunk-hpa0cpzh.js → chunk-9webgemt.js} +24 -19
- package/dist/{chunk-hpa0cpzh.js.map → chunk-9webgemt.js.map} +2 -2
- package/dist/{chunk-9p0ww3tk.js → chunk-a3ypq5pp.js} +5 -3
- package/dist/{chunk-9p0ww3tk.js.map → chunk-a3ypq5pp.js.map} +2 -2
- package/dist/{chunk-e4407g8x.js → chunk-abme0zjm.js} +23 -18
- package/dist/{chunk-e4407g8x.js.map → chunk-abme0zjm.js.map} +2 -2
- package/dist/{chunk-t9zcg8f1.js → chunk-cp37k2wg.js} +24 -12
- package/dist/chunk-cp37k2wg.js.map +13 -0
- package/dist/{chunk-fka9eqe1.js → chunk-cphmr4g4.js} +24 -18
- package/dist/chunk-cphmr4g4.js.map +11 -0
- package/dist/{chunk-w13jjf4a.js → chunk-dj7cpy9k.js} +21 -16
- package/dist/{chunk-w13jjf4a.js.map → chunk-dj7cpy9k.js.map} +2 -2
- package/dist/{chunk-7xqj7aex.js → chunk-f5xgprg1.js} +2 -20
- package/dist/{chunk-7xqj7aex.js.map → chunk-f5xgprg1.js.map} +3 -4
- package/dist/{chunk-xfq68rch.js → chunk-f97qybwk.js} +3 -2
- package/dist/{chunk-xfq68rch.js.map → chunk-f97qybwk.js.map} +2 -2
- package/dist/{chunk-g82jygez.js → chunk-fcskj4xy.js} +6 -6
- package/dist/chunk-gdb8ywgf.js +981 -0
- package/dist/chunk-gdb8ywgf.js.map +16 -0
- package/dist/{chunk-q5bcpf23.js → chunk-grn9fxdn.js} +63 -55
- package/dist/{chunk-q5bcpf23.js.map → chunk-grn9fxdn.js.map} +3 -3
- package/dist/{chunk-6kctn20e.js → chunk-gsk494xn.js} +29 -24
- package/dist/{chunk-6kctn20e.js.map → chunk-gsk494xn.js.map} +2 -2
- package/dist/{chunk-gmy11efb.js → chunk-hsq7j9jk.js} +3 -2
- package/dist/{chunk-gmy11efb.js.map → chunk-hsq7j9jk.js.map} +2 -2
- package/dist/chunk-j0kjscb7.js +53 -0
- package/dist/chunk-j0kjscb7.js.map +10 -0
- package/dist/chunk-jkencnkw.js +2385 -0
- package/dist/chunk-jkencnkw.js.map +26 -0
- package/dist/chunk-k9z47mab.js.map +1 -1
- package/dist/{chunk-exd0v74a.js → chunk-ka8rv918.js} +155 -101
- package/dist/{chunk-exd0v74a.js.map → chunk-ka8rv918.js.map} +4 -4
- package/dist/{chunk-a92a7nrk.js → chunk-mamgm6gb.js} +1 -1
- package/dist/chunk-mhty3nna.js +150 -0
- package/dist/chunk-mhty3nna.js.map +11 -0
- package/dist/chunk-pkdmypdd.js +147 -0
- package/dist/chunk-pkdmypdd.js.map +11 -0
- package/dist/{chunk-p3cr2ejg.js → chunk-q00djwra.js} +39 -31
- package/dist/{chunk-p3cr2ejg.js.map → chunk-q00djwra.js.map} +3 -3
- package/dist/{chunk-ns3ke88n.js → chunk-rj7w44t0.js} +21 -16
- package/dist/{chunk-ns3ke88n.js.map → chunk-rj7w44t0.js.map} +2 -2
- package/dist/{chunk-cds1qxsf.js → chunk-rx58pnss.js} +162 -97
- package/dist/chunk-rx58pnss.js.map +18 -0
- package/dist/{chunk-sm6fh5c5.js → chunk-sxf7krrx.js} +20 -15
- package/dist/{chunk-sm6fh5c5.js.map → chunk-sxf7krrx.js.map} +2 -2
- package/dist/{chunk-naa09ags.js → chunk-tdxmdy6s.js} +28 -22
- package/dist/{chunk-naa09ags.js.map → chunk-tdxmdy6s.js.map} +3 -3
- package/dist/{chunk-fgrme9tr.js → chunk-waf61p58.js} +373 -2643
- package/dist/chunk-waf61p58.js.map +29 -0
- package/dist/{chunk-rafc55bs.js → chunk-wfhghtdz.js} +21 -16
- package/dist/{chunk-rafc55bs.js.map → chunk-wfhghtdz.js.map} +2 -2
- package/dist/{chunk-jzkw2f01.js → chunk-wgrk1d2n.js} +23 -18
- package/dist/{chunk-jzkw2f01.js.map → chunk-wgrk1d2n.js.map} +2 -2
- package/dist/{chunk-jkqq5ef6.js → chunk-y3de7fp3.js} +22 -17
- package/dist/{chunk-jkqq5ef6.js.map → chunk-y3de7fp3.js.map} +2 -2
- package/dist/{chunk-rbrxjvbj.js → chunk-yx2dvsye.js} +93 -36
- package/dist/chunk-yx2dvsye.js.map +24 -0
- package/dist/{chunk-jc0at0tc.js → chunk-z2xy5n2q.js} +3 -2
- package/dist/{chunk-jc0at0tc.js.map → chunk-z2xy5n2q.js.map} +2 -2
- package/dist/{chunk-e5pbggsh.js → chunk-z6654rf6.js} +21 -16
- package/dist/{chunk-e5pbggsh.js.map → chunk-z6654rf6.js.map} +2 -2
- package/dist/cron.js +12976 -0
- package/dist/cron.js.map +134 -0
- package/dist/hosted-agent.js +63 -0
- package/dist/hosted-agent.js.map +10 -0
- package/dist/main.js +12 -12
- package/dist/main.js.map +1 -1
- package/dist/mcp-servers.js +47 -0
- package/dist/mcp-servers.js.map +10 -0
- package/dist/prompts.js +451 -0
- package/dist/prompts.js.map +13 -0
- package/dist/registry.js +258 -0
- package/dist/registry.js.map +17 -0
- package/dist/rollout.js +43 -0
- package/dist/rollout.js.map +10 -0
- package/dist/runtime/cron/background-sessions.ts +91 -0
- package/dist/runtime/cron/context.ts +123 -0
- package/dist/runtime/cron/host.ts +67 -0
- package/dist/runtime/cron/index.ts +92 -0
- package/dist/runtime/cron/mcp-server.ts +517 -0
- package/dist/runtime/cron/module.ts +169 -0
- package/dist/runtime/cron/schedule.ts +211 -0
- package/dist/runtime/cron/scheduler.ts +444 -0
- package/dist/runtime/cron/scripts.ts +181 -0
- package/dist/runtime/cron/store.ts +1043 -0
- package/dist/runtime/cron/summarize.ts +115 -0
- package/dist/runtime/src/agents/execution-host.ts +20 -0
- package/dist/runtime/src/agents/hosted-agent.ts +23 -8
- package/dist/runtime/src/agents/mcp-tools/spawn-subagent.ts +75 -1
- package/dist/runtime/src/agents/rollout/index.ts +20 -0
- package/dist/runtime/src/agents/rollout/shared.ts +36 -3
- package/dist/runtime/src/application/submit-user-message.ts +3 -0
- package/dist/runtime/src/mcp/runtime-spec.ts +3 -0
- package/dist/runtime/src/platform/mcp-config.ts +13 -0
- package/dist/runtime/src/prompts/builders.ts +21 -10
- package/dist/runtime/src/query/active-rooms.ts +33 -11
- package/dist/runtime/src/runtime/inbox.ts +146 -49
- package/dist/runtime/src/runtime/public-helpers.ts +11 -0
- package/dist/runtime/src/runtime/task-format.ts +18 -0
- package/dist/runtime/src/runtime/tasks.ts +2 -16
- package/dist/runtime/src/runtime/turn-runner.ts +78 -16
- package/dist/runtime/src/storage/runtime-turn-requests.ts +1 -0
- package/dist/runtime/src/storage/vault-crypto.ts +11 -5
- package/dist/runtime/src/storage/vault-public.ts +27 -0
- package/dist/runtime/src/storage/vault.ts +95 -42
- package/dist/runtime/src/types/api.ts +2 -0
- package/dist/runtime/src/types.ts +2 -0
- package/dist/runtime/src/version.ts +1 -1
- package/dist/runtime-helpers.js +465 -0
- package/dist/runtime-helpers.js.map +18 -0
- package/dist/types/apps/negotium/src/mcp-servers.d.ts +7 -0
- package/dist/types/packages/core/src/agents/claude-provider.d.ts +23 -0
- package/dist/types/packages/core/src/agents/claude-registry.d.ts +2 -0
- package/dist/types/packages/core/src/agents/codex-native-multi-agent.d.ts +8 -0
- package/dist/types/packages/core/src/agents/codex-provider.d.ts +45 -0
- package/dist/types/packages/core/src/agents/codex-registry.d.ts +2 -0
- package/dist/types/packages/core/src/agents/codex-tree-kill.d.ts +78 -0
- package/dist/types/packages/core/src/agents/contracts.d.ts +63 -0
- package/dist/types/packages/core/src/agents/deep-map.d.ts +2 -0
- package/dist/types/packages/core/src/agents/execution-host.d.ts +31 -0
- package/dist/types/packages/core/src/agents/hosted-agent.d.ts +11 -0
- package/dist/types/packages/core/src/agents/maestro-provider.d.ts +67 -0
- package/dist/types/packages/core/src/agents/maestro-registry.d.ts +17 -0
- package/dist/types/packages/core/src/agents/registry.d.ts +4 -0
- package/dist/types/packages/core/src/agents/rollout/claude.d.ts +72 -0
- package/dist/types/packages/core/src/agents/rollout/codex.d.ts +70 -0
- package/dist/types/packages/core/src/agents/rollout/index.d.ts +6 -0
- package/dist/types/packages/core/src/agents/rollout/shared.d.ts +50 -0
- package/dist/types/packages/core/src/agents/vault-tool-policy.d.ts +4 -0
- package/dist/types/packages/core/src/mcp/canonical-bridge-config.d.ts +21 -0
- package/dist/types/packages/core/src/mcp/runtime-spec.d.ts +36 -0
- package/dist/types/packages/core/src/mcp/session-comm/bridge-ipc-config.d.ts +6 -0
- package/dist/types/packages/core/src/media/file-events.d.ts +14 -0
- package/dist/types/packages/core/src/platform/config.d.ts +95 -0
- package/dist/types/packages/core/src/platform/error.d.ts +6 -0
- package/dist/types/packages/core/src/platform/file-utils.d.ts +6 -0
- package/dist/types/packages/core/src/platform/jsonl.d.ts +33 -0
- package/dist/types/packages/core/src/platform/logger.d.ts +14 -0
- package/dist/types/packages/core/src/platform/maestro-bootstrap-env.d.ts +0 -0
- package/dist/types/packages/core/src/platform/mcp-config.d.ts +227 -0
- package/dist/types/packages/core/src/prompts/builders.d.ts +32 -0
- package/dist/types/packages/core/src/runtime/attachments.d.ts +36 -0
- package/dist/types/packages/core/src/runtime/channel-context.d.ts +13 -0
- package/dist/types/packages/core/src/runtime/file-hooks.d.ts +38 -0
- package/dist/types/packages/core/src/runtime/public-helpers.d.ts +3 -0
- package/dist/types/packages/core/src/runtime/task-format.d.ts +4 -0
- package/dist/types/packages/core/src/runtime/visual-html.d.ts +13 -0
- package/dist/types/packages/core/src/security/sanitize.d.ts +16 -0
- package/dist/types/packages/core/src/security/sensitive-path.d.ts +1 -0
- package/dist/types/packages/core/src/storage/api-messages.d.ts +111 -0
- package/dist/types/packages/core/src/storage/conversations.d.ts +123 -0
- package/dist/types/packages/core/src/storage/forum-db.d.ts +1 -0
- package/dist/types/packages/core/src/storage/sqlite.d.ts +4 -0
- package/dist/types/packages/core/src/storage/vault-crypto.d.ts +11 -0
- package/dist/types/packages/core/src/storage/vault-public.d.ts +3 -0
- package/dist/types/packages/core/src/storage/vault.d.ts +39 -0
- package/dist/types/packages/core/src/types/api.d.ts +472 -0
- package/dist/types/packages/core/src/types.d.ts +249 -0
- package/dist/types/packages/core/src/version.d.ts +1 -0
- package/dist/types/packages/module-cron/src/background-sessions.d.ts +2 -0
- package/dist/types/packages/module-cron/src/context.d.ts +15 -0
- package/dist/types/packages/module-cron/src/host.d.ts +23 -0
- package/dist/types/packages/module-cron/src/index.d.ts +14 -0
- package/dist/types/packages/module-cron/src/module.d.ts +13 -0
- package/dist/types/packages/module-cron/src/schedule.d.ts +23 -0
- package/dist/types/packages/module-cron/src/scheduler.d.ts +46 -0
- package/dist/types/packages/module-cron/src/scripts.d.ts +23 -0
- package/dist/types/packages/module-cron/src/store.d.ts +127 -0
- package/dist/types/packages/module-cron/src/summarize.d.ts +4 -0
- package/dist/vault.js +533 -0
- package/dist/vault.js.map +15 -0
- package/package.json +52 -2
- package/dist/chunk-6cpn7ht2.js +0 -287
- package/dist/chunk-6cpn7ht2.js.map +0 -13
- package/dist/chunk-cds1qxsf.js.map +0 -17
- package/dist/chunk-fgrme9tr.js.map +0 -47
- package/dist/chunk-fka9eqe1.js.map +0 -11
- package/dist/chunk-rbrxjvbj.js.map +0 -23
- package/dist/chunk-t9zcg8f1.js.map +0 -13
- /package/dist/{chunk-n17yxpa8.js.map → chunk-1jdws5ns.js.map} +0 -0
- /package/dist/{chunk-j2behpy7.js.map → chunk-39czd64s.js.map} +0 -0
- /package/dist/{chunk-hkdqhm34.js.map → chunk-4yvkqxmm.js.map} +0 -0
- /package/dist/{chunk-g82jygez.js.map → chunk-fcskj4xy.js.map} +0 -0
- /package/dist/{chunk-a92a7nrk.js.map → chunk-mamgm6gb.js.map} +0 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../adapters/terminal/src/history-store.ts", "../../../adapters/terminal/src/client.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { db } from \"@negotium/core\";\n\nconst MAX_STORED_HISTORY = 500;\n\ninterface HistoryRow {\n text: string;\n}\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS terminal_input_history (\n seq INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id TEXT NOT NULL,\n text TEXT NOT NULL,\n created_at INTEGER NOT NULL\n )\n`);\ndb.exec(\n \"CREATE INDEX IF NOT EXISTS idx_terminal_input_history_user_seq ON terminal_input_history(user_id, seq)\",\n);\n\nexport function loadTerminalInputHistory(userId: string, limit = 200): string[] {\n const safeLimit = Math.max(1, Math.min(limit, MAX_STORED_HISTORY));\n return db\n .query<HistoryRow, [string, number]>(\n `SELECT text FROM (\n SELECT seq, text\n FROM terminal_input_history\n WHERE user_id = ?\n ORDER BY seq DESC\n LIMIT ?\n ) ORDER BY seq ASC`,\n )\n .all(userId, safeLimit)\n .map((row) => row.text);\n}\n\nexport function appendTerminalInputHistory(userId: string, value: string): void {\n const text = value.trim();\n if (!text) return;\n db.transaction(() => {\n const latest = db\n .query<HistoryRow, [string]>(\n \"SELECT text FROM terminal_input_history WHERE user_id = ? ORDER BY seq DESC LIMIT 1\",\n )\n .get(userId);\n if (latest?.text === text) return;\n db.query(\"INSERT INTO terminal_input_history (user_id, text, created_at) VALUES (?, ?, ?)\").run(\n userId,\n text,\n Date.now(),\n );\n db.query(\n `DELETE FROM terminal_input_history\n WHERE user_id = ? AND seq NOT IN (\n SELECT seq FROM terminal_input_history\n WHERE user_id = ? ORDER BY seq DESC LIMIT ?\n )`,\n ).run(userId, userId, MAX_STORED_HISTORY);\n }).immediate();\n}\n",
|
|
6
|
+
"import {\n type AgentKind,\n type BackgroundSessionDto,\n deleteVaultEntry,\n type EffortLevel,\n ensurePersonalGeneral,\n executeVaultCommand,\n getAllMessagesForTopic,\n getApiMessage,\n getVisibleTopics,\n listApiMessages,\n listBackgroundSessionsForUser,\n listRecentRuntimeEventsForTopic,\n listRunningTopicQueries,\n listVaultEntries,\n type MessageDto,\n type RuntimeBusEvent,\n runtimeBus,\n type SaveVaultEntryResult,\n saveVaultEntry,\n submitUserMessage,\n switchTopicEffort,\n switchTopicModel,\n type TopicDto,\n topicService,\n type VaultEntry,\n} from \"@negotium/core\";\nimport {\n NODE_CONTROL_BASE_PATH,\n NODE_CONTROL_PROTOCOL_VERSION,\n type NodeDaemonConnection,\n type NodeHandle,\n startDefaultNode,\n} from \"@negotium/node\";\nimport { appendTerminalInputHistory, loadTerminalInputHistory } from \"@/history-store\";\n\nexport type ClientResult<T> = T | Promise<T>;\n\nexport const MESSAGE_HISTORY_PAGE_SIZE = 50;\nexport const INITIAL_MESSAGE_HISTORY_PAGE_COUNT = 3;\nexport const INITIAL_MESSAGE_HISTORY_LIMIT =\n MESSAGE_HISTORY_PAGE_SIZE * INITIAL_MESSAGE_HISTORY_PAGE_COUNT;\n\nexport interface MessageHistoryPage {\n messages: MessageDto[];\n cursor?: string;\n hasMore: boolean;\n}\n\nexport interface NegotiumClient {\n start(onEvent: (event: RuntimeBusEvent) => void): Promise<void>;\n stop(): Promise<void>;\n listTopics(): ClientResult<TopicDto[]>;\n listBackgroundSessions?(): ClientResult<BackgroundSessionDto[]>;\n listMessages(topicId: string): ClientResult<MessageDto[]>;\n listMessagePage?(\n topicId: string,\n cursor?: string,\n limit?: number,\n ): ClientResult<MessageHistoryPage>;\n createTopic(title: string, agent?: AgentKind): ClientResult<TopicDto>;\n deriveTopic(topic: TopicDto, copyHistory: boolean, name?: string): Promise<TopicDto>;\n resetTopic(topic: TopicDto): Promise<string>;\n compactTopic(topic: TopicDto): Promise<string>;\n setModel(topic: TopicDto, model: string): ClientResult<string>;\n setEffort(topic: TopicDto, effort: EffortLevel): ClientResult<string>;\n deleteTopic(topic: TopicDto): Promise<void>;\n sendMessage(topic: TopicDto, text: string): ClientResult<MessageDto>;\n answerQuestion(\n topicId: string,\n messageId: string,\n label: string,\n ): ClientResult<{ ok: boolean; error?: string }>;\n abort(topicId: string): ClientResult<boolean>;\n runVaultCommand?(commandLine: string): ClientResult<string | null>;\n listVaultEntries?(): ClientResult<VaultEntry[]>;\n saveVaultEntry?(\n key: string,\n value: string,\n description: string,\n ): ClientResult<SaveVaultEntryResult>;\n deleteVaultEntry?(key: string): ClientResult<boolean>;\n listInputHistory?(): string[];\n appendInputHistory?(text: string): void;\n listRecentEvents?(topicId: string): ClientResult<RuntimeBusEvent[]>;\n}\n\nexport interface EmbeddedClientOptions {\n userId: string;\n port?: number;\n /** Start and own a node. False attaches to an already-running in-process node. */\n startNode?: boolean;\n}\n\n/**\n * Explicit in-process recovery/development host. The default CLI path uses\n * RemoteNegotiumClient so the UI does not own the node or active turns.\n */\nexport class EmbeddedNegotiumClient implements NegotiumClient {\n readonly #userId: string;\n readonly #port: number;\n readonly #startNode: boolean;\n #node: NodeHandle | null = null;\n #unsubscribe: (() => void) | null = null;\n #started = false;\n\n constructor(options: EmbeddedClientOptions) {\n this.#userId = options.userId;\n this.#port = options.port ?? 0;\n this.#startNode = options.startNode !== false;\n }\n\n async start(onEvent: (event: RuntimeBusEvent) => void): Promise<void> {\n if (this.#started) return;\n this.#started = true;\n this.#unsubscribe = runtimeBus().subscribe(onEvent);\n try {\n if (this.#startNode) this.#node = await startDefaultNode({ port: this.#port });\n ensurePersonalGeneral(this.#userId);\n } catch (error) {\n this.#unsubscribe?.();\n this.#unsubscribe = null;\n this.#started = false;\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n this.#unsubscribe?.();\n this.#unsubscribe = null;\n this.#started = false;\n const node = this.#node;\n this.#node = null;\n if (node) await node.stop();\n }\n\n listTopics(): TopicDto[] {\n const runningTopics = listRunningTopicQueries();\n return getVisibleTopics()\n .filter((topic) =>\n topic.participants.some((participant) => participant.userId === this.#userId),\n )\n .map((topic) => {\n const runningQueryId = runningTopics.get(topic.id);\n return { ...topic, running: Boolean(runningQueryId), runningQueryId };\n });\n }\n\n listBackgroundSessions(): BackgroundSessionDto[] {\n return listBackgroundSessionsForUser(this.#userId);\n }\n\n listMessages(topicId: string): MessageDto[] {\n const rows = getAllMessagesForTopic(topicId) as Array<{ id?: unknown }>;\n return rows\n .map((row) => (typeof row.id === \"string\" ? getApiMessage(topicId, row.id) : null))\n .filter((message): message is MessageDto => message !== null);\n }\n\n listMessagePage(\n topicId: string,\n cursor?: string,\n limit = MESSAGE_HISTORY_PAGE_SIZE,\n ): MessageHistoryPage {\n const result = listApiMessages(topicId, { cursor, limit });\n return { messages: result.page, cursor: result.cursor, hasMore: result.hasMore };\n }\n\n listRecentEvents(topicId: string): RuntimeBusEvent[] {\n return listRecentRuntimeEventsForTopic(topicId).map((event) => ({\n type: event.type,\n topicId: event.topicId,\n payload: event.payload,\n seq: event.seq,\n createdAt: event.createdAt,\n }));\n }\n\n createTopic(title: string, agent?: AgentKind): TopicDto {\n return topicService.create({\n title,\n userId: this.#userId,\n kind: \"agent\",\n ...(agent ? { agent } : {}),\n });\n }\n\n async deriveTopic(topic: TopicDto, copyHistory: boolean, name?: string): Promise<TopicDto> {\n const derived = await topicService.derive({\n sourceTopicId: topic.id,\n userId: this.#userId,\n copyHistory,\n ...(name ? { name } : {}),\n });\n if (!derived) throw new Error(`Failed to ${copyHistory ? \"fork\" : \"spawn\"} \"${topic.title}\"`);\n return derived;\n }\n\n async resetTopic(topic: TopicDto): Promise<string> {\n const result = await topicService.reset({\n topicId: topic.id,\n userId: this.#userId,\n reason: \"terminal-session-reset\",\n });\n if (result.isError) throw new Error(result.text);\n return result.text;\n }\n\n async compactTopic(topic: TopicDto): Promise<string> {\n const result = await topicService.compact({\n topicId: topic.id,\n userId: this.#userId,\n reason: \"terminal-session-compact\",\n });\n if (result.isError) throw new Error(result.text);\n return result.text;\n }\n\n setModel(topic: TopicDto, model: string): string {\n const result = switchTopicModel({ topicId: topic.id, userId: this.#userId, model });\n if (!result.ok) throw new Error(result.error);\n return result.text;\n }\n\n setEffort(topic: TopicDto, effort: EffortLevel): string {\n const result = switchTopicEffort({ topicId: topic.id, userId: this.#userId, effort });\n if (!result.ok) throw new Error(result.error);\n return result.text;\n }\n\n async deleteTopic(topic: TopicDto): Promise<void> {\n await topicService.delete({ topicId: topic.id, userId: this.#userId });\n }\n\n sendMessage(topic: TopicDto, text: string): MessageDto {\n return submitUserMessage({\n topic,\n userId: this.#userId,\n text,\n sourceAdapter: \"terminal\",\n visualTools: false,\n }).message;\n }\n\n answerQuestion(\n topicId: string,\n messageId: string,\n label: string,\n ): { ok: boolean; error?: string } {\n const result = topicService.answerQuestion(topicId, messageId, label, this.#userId);\n return result.ok ? { ok: true } : { ok: false, error: result.error };\n }\n\n abort(topicId: string): boolean {\n return topicService.abortTurn(topicId, this.#userId);\n }\n\n runVaultCommand(commandLine: string): string | null {\n return executeVaultCommand(this.#userId, commandLine);\n }\n\n listVaultEntries(): VaultEntry[] {\n return listVaultEntries(this.#userId);\n }\n\n saveVaultEntry(key: string, value: string, description: string): SaveVaultEntryResult {\n return saveVaultEntry(this.#userId, key, value, description);\n }\n\n deleteVaultEntry(key: string): boolean {\n return deleteVaultEntry(this.#userId, key);\n }\n\n listInputHistory(): string[] {\n return loadTerminalInputHistory(this.#userId);\n }\n\n appendInputHistory(text: string): void {\n appendTerminalInputHistory(this.#userId, text);\n }\n}\n\nexport interface RemoteClientOptions extends NodeDaemonConnection {\n userId: string;\n}\n\ninterface ApiEnvelope {\n ok?: boolean;\n error?: string;\n [key: string]: unknown;\n}\n\nfunction missingControlRoute(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /not found|http 404/i.test(message);\n}\n\nfunction parseLegacyVaultList(output: string | null): VaultEntry[] {\n if (!output || /vault is empty/i.test(output)) return [];\n return output\n .split(\"\\n\")\n .slice(1)\n .flatMap((line) => {\n const match = line.match(/^- ([A-Z][A-Z0-9_]*)(?:: (.*))?$/);\n return match?.[1] ? [{ key: match[1], description: match[2] ?? \"\" }] : [];\n });\n}\n\nfunction isSecureControlTransport(baseUrl: string): boolean {\n const url = new URL(baseUrl);\n if (url.protocol === \"https:\") return true;\n if (url.protocol !== \"http:\") return false;\n const hostname = url.hostname.toLowerCase();\n if (hostname === \"localhost\" || hostname === \"::1\" || hostname === \"[::1]\") return true;\n const octets = hostname.split(\".\");\n return (\n octets.length === 4 &&\n octets[0] === \"127\" &&\n octets.every((octet) => /^\\d{1,3}$/.test(octet) && Number(octet) <= 255)\n );\n}\n\n/** REST/SSE client. Stopping it only disconnects the UI; it never stops the node. */\nexport class RemoteNegotiumClient implements NegotiumClient {\n readonly #userId: string;\n readonly #baseUrl: string;\n readonly #token: string;\n #onEvent: ((event: RuntimeBusEvent) => void) | null = null;\n #eventAbort: AbortController | null = null;\n #eventTask: Promise<void> | null = null;\n #started = false;\n\n constructor(options: RemoteClientOptions) {\n this.#userId = options.userId;\n this.#baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n if (!isSecureControlTransport(this.#baseUrl)) {\n throw new Error(\"Remote node control requires HTTPS or loopback HTTP\");\n }\n this.#token = options.token;\n }\n\n async start(onEvent: (event: RuntimeBusEvent) => void): Promise<void> {\n if (this.#started) return;\n const session = await this.#request(`/session?user=${encodeURIComponent(this.#userId)}`);\n if (session.protocolVersion !== NODE_CONTROL_PROTOCOL_VERSION) {\n throw new Error(\n `Node protocol ${String(session.protocolVersion)} is incompatible with terminal protocol ${NODE_CONTROL_PROTOCOL_VERSION}`,\n );\n }\n const cursor = Number(session.cursor ?? 0);\n this.#onEvent = onEvent;\n this.#eventAbort = new AbortController();\n try {\n const first = await this.#openEventStream(cursor, this.#eventAbort.signal);\n this.#started = true;\n this.#eventTask = this.#runEventLoop(first, cursor, this.#eventAbort.signal);\n } catch (error) {\n this.#eventAbort = null;\n this.#onEvent = null;\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n this.#started = false;\n this.#eventAbort?.abort();\n this.#eventAbort = null;\n await this.#eventTask?.catch(() => {});\n this.#eventTask = null;\n this.#onEvent = null;\n }\n\n async listTopics(): Promise<TopicDto[]> {\n const result = await this.#request(`/topics?user=${encodeURIComponent(this.#userId)}`);\n return (result.topics ?? []) as TopicDto[];\n }\n\n async listBackgroundSessions(): Promise<BackgroundSessionDto[]> {\n const result = await this.#request(\n `/background-sessions?user=${encodeURIComponent(this.#userId)}`,\n );\n return (result.sessions ?? []) as BackgroundSessionDto[];\n }\n\n async listMessages(topicId: string): Promise<MessageDto[]> {\n const result = await this.#request(\n `/topics/${encodeURIComponent(topicId)}/messages?user=${encodeURIComponent(this.#userId)}`,\n );\n return (result.messages ?? []) as MessageDto[];\n }\n\n async listMessagePage(\n topicId: string,\n cursor?: string,\n limit = MESSAGE_HISTORY_PAGE_SIZE,\n ): Promise<MessageHistoryPage> {\n const query = new URLSearchParams({ user: this.#userId, limit: String(limit) });\n if (cursor) query.set(\"cursor\", cursor);\n const result = await this.#request(\n `/topics/${encodeURIComponent(topicId)}/messages?${query.toString()}`,\n );\n return {\n messages: (result.messages ?? []) as MessageDto[],\n cursor: typeof result.cursor === \"string\" ? result.cursor : undefined,\n hasMore: result.hasMore === true,\n };\n }\n\n async listRecentEvents(topicId: string): Promise<RuntimeBusEvent[]> {\n const result = await this.#request(\n `/topics/${encodeURIComponent(topicId)}/recent-events?user=${encodeURIComponent(this.#userId)}`,\n );\n return (result.events ?? []) as RuntimeBusEvent[];\n }\n\n async createTopic(title: string, agent?: AgentKind): Promise<TopicDto> {\n const result = await this.#request(\"/topics\", {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId, title, agent }),\n });\n return result.topic as TopicDto;\n }\n\n async deriveTopic(topic: TopicDto, copyHistory: boolean, name?: string): Promise<TopicDto> {\n const result = await this.#request(`/topics/${encodeURIComponent(topic.id)}/derive`, {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId, copyHistory, ...(name ? { name } : {}) }),\n });\n return result.topic as TopicDto;\n }\n\n async resetTopic(topic: TopicDto): Promise<string> {\n const result = await this.#request(`/topics/${encodeURIComponent(topic.id)}/session/reset`, {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId }),\n });\n return String(result.result ?? `Session reset for \"${topic.title}\".`);\n }\n\n async compactTopic(topic: TopicDto): Promise<string> {\n const result = await this.#request(\n `/topics/${encodeURIComponent(topic.id)}/session/compact`,\n {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId }),\n },\n 180_000,\n );\n return String(result.result ?? `Compacted context for \"${topic.title}\".`);\n }\n\n async setModel(topic: TopicDto, model: string): Promise<string> {\n const result = await this.#request(`/topics/${encodeURIComponent(topic.id)}/model`, {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId, model }),\n });\n return String(result.result ?? `Model set to '${model}'.`);\n }\n\n async setEffort(topic: TopicDto, effort: EffortLevel): Promise<string> {\n const result = await this.#request(`/topics/${encodeURIComponent(topic.id)}/effort`, {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId, effort }),\n });\n return String(result.result ?? `Effort set to '${effort}'.`);\n }\n\n async deleteTopic(topic: TopicDto): Promise<void> {\n await this.#request(\n `/topics/${encodeURIComponent(topic.id)}?user=${encodeURIComponent(this.#userId)}`,\n { method: \"DELETE\" },\n );\n }\n\n async sendMessage(topic: TopicDto, text: string): Promise<MessageDto> {\n const result = await this.#request(`/topics/${encodeURIComponent(topic.id)}/messages`, {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId, text }),\n });\n return result.message as MessageDto;\n }\n\n async answerQuestion(\n topicId: string,\n messageId: string,\n label: string,\n ): Promise<{ ok: boolean; error?: string }> {\n try {\n const result = await this.#request(`/questions/${encodeURIComponent(messageId)}/answer`, {\n method: \"POST\",\n body: JSON.stringify({ topicId, userId: this.#userId, label }),\n });\n return result.ok ? { ok: true } : { ok: false, error: result.error };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n async abort(topicId: string): Promise<boolean> {\n const result = await this.#request(`/topics/${encodeURIComponent(topicId)}/abort`, {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId }),\n });\n return result.aborted === true;\n }\n\n async runVaultCommand(commandLine: string): Promise<string | null> {\n const result = await this.#request(\"/vault/command\", {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId, commandLine }),\n });\n return typeof result.result === \"string\" ? result.result : null;\n }\n\n async listVaultEntries(): Promise<VaultEntry[]> {\n try {\n const result = await this.#request(`/vault?user=${encodeURIComponent(this.#userId)}`);\n return (result.entries ?? []) as VaultEntry[];\n } catch (error) {\n if (!missingControlRoute(error)) throw error;\n return parseLegacyVaultList(await this.runVaultCommand(\"/vault list\"));\n }\n }\n\n async saveVaultEntry(\n key: string,\n value: string,\n description: string,\n ): Promise<SaveVaultEntryResult> {\n try {\n const result = await this.#request(\"/vault\", {\n method: \"POST\",\n body: JSON.stringify({ userId: this.#userId, key, value, description }),\n });\n return result.result as SaveVaultEntryResult;\n } catch (error) {\n if (!missingControlRoute(error)) throw error;\n if (/\\s\\|\\s/.test(value)) {\n throw new Error(\"Restart the Negotium node before saving a secret containing ' | '.\");\n }\n const output = await this.runVaultCommand(\n // Always include the legacy value/description delimiter. Without it,\n // a multi-word value with an empty description is parsed by old nodes\n // as a one-word secret plus a description, silently corrupting it.\n `/vault set ${key} ${value} | ${description}`,\n );\n if (!output) throw new Error(\"Vault save failed.\");\n return { key, updated: output.startsWith(\"Updated\") };\n }\n }\n\n async deleteVaultEntry(key: string): Promise<boolean> {\n try {\n const result = await this.#request(\n `/vault?user=${encodeURIComponent(this.#userId)}&key=${encodeURIComponent(key)}`,\n { method: \"DELETE\" },\n );\n return result.deleted === true;\n } catch (error) {\n if (!missingControlRoute(error)) throw error;\n const output = await this.runVaultCommand(`/vault del ${key}`);\n return output?.startsWith(\"Deleted\") === true;\n }\n }\n\n listInputHistory(): string[] {\n return loadTerminalInputHistory(this.#userId);\n }\n\n appendInputHistory(text: string): void {\n appendTerminalInputHistory(this.#userId, text);\n }\n\n async #request(path: string, init: RequestInit = {}, timeoutMs = 15_000): Promise<ApiEnvelope> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetch(`${this.#baseUrl}${NODE_CONTROL_BASE_PATH}${path}`, {\n ...init,\n signal: controller.signal,\n headers: {\n authorization: `Bearer ${this.#token}`,\n ...(init.body ? { \"content-type\": \"application/json\" } : {}),\n ...init.headers,\n },\n });\n const result = (await response.json().catch(() => ({}))) as ApiEnvelope;\n if (!response.ok || result.ok === false) {\n throw new Error(result.error || `Node request failed with HTTP ${response.status}`);\n }\n return result;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async #openEventStream(after: number, signal: AbortSignal): Promise<Response> {\n const response = await fetch(\n `${this.#baseUrl}${NODE_CONTROL_BASE_PATH}/events?user=${encodeURIComponent(this.#userId)}&after=${after}`,\n {\n signal,\n headers: {\n accept: \"text/event-stream\",\n authorization: `Bearer ${this.#token}`,\n },\n },\n );\n if (!response.ok || !response.body) {\n const result = (await response.json().catch(() => ({}))) as ApiEnvelope;\n throw new Error(result.error || `Event stream failed with HTTP ${response.status}`);\n }\n return response;\n }\n\n async #runEventLoop(first: Response, initialCursor: number, signal: AbortSignal): Promise<void> {\n let response = first;\n let cursor = initialCursor;\n while (!signal.aborted) {\n try {\n cursor = await this.#consumeEventStream(response, cursor, signal);\n } catch {\n if (signal.aborted) break;\n }\n if (signal.aborted) break;\n await new Promise((resolvePromise) => setTimeout(resolvePromise, 250));\n try {\n response = await this.#openEventStream(cursor, signal);\n } catch {\n if (signal.aborted) break;\n await new Promise((resolvePromise) => setTimeout(resolvePromise, 750));\n }\n }\n }\n\n async #consumeEventStream(\n response: Response,\n initialCursor: number,\n signal: AbortSignal,\n ): Promise<number> {\n const reader = response.body?.getReader();\n if (!reader) return initialCursor;\n const decoder = new TextDecoder();\n let cursor = initialCursor;\n let buffer = \"\";\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true }).replaceAll(\"\\r\\n\", \"\\n\");\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary >= 0) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n const fields = new Map<string, string>();\n for (const line of block.split(\"\\n\")) {\n if (!line || line.startsWith(\":\")) continue;\n const separator = line.indexOf(\":\");\n if (separator < 0) continue;\n fields.set(line.slice(0, separator), line.slice(separator + 1).trimStart());\n }\n const id = Number.parseInt(fields.get(\"id\") ?? \"\", 10);\n if (Number.isFinite(id)) cursor = Math.max(cursor, id);\n if (fields.get(\"event\") === \"runtime\" && fields.has(\"data\")) {\n try {\n this.#onEvent?.(JSON.parse(fields.get(\"data\") ?? \"null\") as RuntimeBusEvent);\n } catch {\n // Ignore one malformed event without dropping the durable stream.\n }\n }\n boundary = buffer.indexOf(\"\\n\\n\");\n }\n }\n return cursor;\n }\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "BFBE6191C0A68B8A64756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -1,24 +1,29 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import"./chunk-
|
|
3
|
-
import"./chunk-
|
|
4
|
-
import"./chunk-
|
|
2
|
+
import"./chunk-ka8rv918.js";
|
|
3
|
+
import"./chunk-x1arr7ze.js";
|
|
4
|
+
import"./chunk-sxf7krrx.js";
|
|
5
|
+
import"./chunk-z2xy5n2q.js";
|
|
5
6
|
import"./chunk-sgsz2fpq.js";
|
|
6
7
|
import"./chunk-1k7t7bnx.js";
|
|
7
|
-
import"./chunk-
|
|
8
|
+
import"./chunk-yx2dvsye.js";
|
|
8
9
|
import {
|
|
9
10
|
getVisibleTopics
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import"./chunk-
|
|
12
|
-
import"./chunk-
|
|
13
|
-
import"./chunk-
|
|
14
|
-
import"./chunk-
|
|
11
|
+
} from "./chunk-5rmbpqy9.js";
|
|
12
|
+
import"./chunk-waf61p58.js";
|
|
13
|
+
import"./chunk-1vth6t3y.js";
|
|
14
|
+
import"./chunk-f97qybwk.js";
|
|
15
|
+
import"./chunk-a3ypq5pp.js";
|
|
16
|
+
import"./chunk-9krt5z40.js";
|
|
17
|
+
import"./chunk-mhty3nna.js";
|
|
15
18
|
import"./chunk-vp2db42d.js";
|
|
16
|
-
import"./chunk-
|
|
17
|
-
import"./chunk-
|
|
18
|
-
import"./chunk-
|
|
19
|
-
import"./chunk-
|
|
20
|
-
import"./chunk-
|
|
21
|
-
import"./chunk-
|
|
19
|
+
import"./chunk-hsq7j9jk.js";
|
|
20
|
+
import"./chunk-jkencnkw.js";
|
|
21
|
+
import"./chunk-4f43r1nd.js";
|
|
22
|
+
import"./chunk-pkdmypdd.js";
|
|
23
|
+
import"./chunk-j0kjscb7.js";
|
|
24
|
+
import"./chunk-cp37k2wg.js";
|
|
25
|
+
import"./chunk-1msje2zf.js";
|
|
26
|
+
import"./chunk-f5xgprg1.js";
|
|
22
27
|
import"./chunk-k9z47mab.js";
|
|
23
28
|
import"./chunk-hwy3n31w.js";
|
|
24
29
|
|
|
@@ -43,4 +48,4 @@ export {
|
|
|
43
48
|
topicsCommand
|
|
44
49
|
};
|
|
45
50
|
|
|
46
|
-
//# debugId=
|
|
51
|
+
//# debugId=28549910187B357664756E2164756E21
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"/** `negotium topics` — list topics on this node. */\n\nimport { getVisibleTopics } from \"@negotium/core\";\n\nexport function topicsCommand(): void {\n const topics = getVisibleTopics();\n if (topics.length === 0) {\n console.log(\"no topics yet — `negotium chat <name>` creates one\");\n return;\n }\n for (const t of topics) {\n const model = t.effectiveModel ?? t.defaultModel;\n const flags = [\n t.accessMode ?? \"private\",\n t.isSubagent ? \"subagent\" : null,\n t.isFork ? \"fork\" : null,\n ]\n .filter(Boolean)\n .join(\",\");\n console.log(\n `${t.title} ${t.agent ?? \"no-ai\"}${model ? `/${model}` : \"\"}` +\n `${flags ? ` [${flags}]` : \"\"} ${t.id}`,\n );\n }\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,aAAa,GAAS;AAAA,EACpC,MAAM,SAAS,iBAAiB;AAAA,EAChC,IAAI,OAAO,WAAW,GAAG;AAAA,IACvB,QAAQ,IAAI,yDAAmD;AAAA,IAC/D;AAAA,EACF;AAAA,EACA,WAAW,KAAK,QAAQ;AAAA,IACtB,MAAM,QAAQ,EAAE,kBAAkB,EAAE;AAAA,IACpC,MAAM,QAAQ;AAAA,MACZ,EAAE,cAAc;AAAA,MAChB,EAAE,aAAa,aAAa;AAAA,MAC5B,EAAE,SAAS,SAAS;AAAA,IACtB,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACX,QAAQ,IACN,GAAG,EAAE,UAAU,EAAE,SAAS,UAAU,QAAQ,IAAI,UAAU,OACxD,GAAG,QAAQ,MAAM,WAAW,OAAO,EAAE,IACzC;AAAA,EACF;AAAA;",
|
|
8
|
+
"debugId": "28549910187B357664756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
SESSIONS_DB
|
|
3
|
-
} from "./chunk-k9z47mab.js";
|
|
4
1
|
import {
|
|
5
2
|
__require,
|
|
6
3
|
__toESM
|
|
7
4
|
} from "./chunk-hwy3n31w.js";
|
|
8
5
|
|
|
9
|
-
// ../../packages/core/src/storage/forum-db.ts
|
|
10
|
-
import { mkdirSync } from "fs";
|
|
11
|
-
import { dirname } from "path";
|
|
12
|
-
|
|
13
6
|
// ../../packages/core/src/storage/sqlite.ts
|
|
14
7
|
var isBun = typeof process.versions.bun === "string";
|
|
15
8
|
var Database;
|
|
@@ -61,17 +54,6 @@ if (isBun) {
|
|
|
61
54
|
Database = NodeDatabase;
|
|
62
55
|
}
|
|
63
56
|
|
|
64
|
-
|
|
65
|
-
mkdirSync(dirname(SESSIONS_DB), { recursive: true });
|
|
66
|
-
var db = new Database(SESSIONS_DB, { create: true });
|
|
67
|
-
db.exec("PRAGMA journal_mode = WAL");
|
|
68
|
-
db.exec("PRAGMA foreign_keys = ON");
|
|
69
|
-
db.exec("PRAGMA busy_timeout = 5000");
|
|
70
|
-
db.exec("PRAGMA wal_autocheckpoint = 1000");
|
|
71
|
-
try {
|
|
72
|
-
db.exec("PRAGMA wal_checkpoint(TRUNCATE)");
|
|
73
|
-
} catch {}
|
|
74
|
-
|
|
75
|
-
export { Database, db };
|
|
57
|
+
export { Database };
|
|
76
58
|
|
|
77
|
-
//# debugId=
|
|
59
|
+
//# debugId=AD00EEC8F204EDFF64756E2164756E21
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../packages/core/src/storage/
|
|
3
|
+
"sources": ["../../../packages/core/src/storage/sqlite.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { SESSIONS_DB } from \"#platform/config\";\nimport { Database } from \"#storage/sqlite\";\n\nmkdirSync(dirname(SESSIONS_DB), { recursive: true });\n\nexport const db = new Database(SESSIONS_DB, { create: true });\ndb.exec(\"PRAGMA journal_mode = WAL\");\ndb.exec(\"PRAGMA foreign_keys = ON\");\ndb.exec(\"PRAGMA busy_timeout = 5000\");\n// Auto-checkpoint every ~1000 WAL pages (~4 MB at 4KB page size) to keep the\n// WAL file from growing unbounded during long-running pm2 sessions. The\n// default is 1000 but we set it explicitly so the policy is auditable.\ndb.exec(\"PRAGMA wal_autocheckpoint = 1000\");\n// Also run a TRUNCATE checkpoint on startup to reclaim any WAL space\n// accumulated while the bot was stopped (checkpointer doesn't run when\n// no connections are open).\ntry {\n db.exec(\"PRAGMA wal_checkpoint(TRUNCATE)\");\n} catch {\n // Non-fatal; a concurrent writer may hold the WAL briefly.\n}\n",
|
|
6
5
|
"// Runtime-adaptive SQLite façade.\n//\n// Why this exists: Otium normally runs on bun and uses `bun:sqlite` (native,\n// fast, zero-build). But the `codex` agent's MCP servers must run on pure node\n// — codex 0.135's rmcp stdio client can't handshake with bun-spawned servers\n// (see serverLaunch in platform/mcp-config.ts). `bun:sqlite` doesn't exist\n// under node, so any MCP server that touches the DB would crash on import.\n//\n// This module picks the backend at runtime and re-exports it as `Database`:\n// - under bun → the real `bun:sqlite` Database (unchanged behavior)\n// - under node → a thin shim over node:sqlite's DatabaseSync exposing the\n// exact subset Otium uses: new Database(path, {readonly?,create?}),\n// .query()/.prepare() → statement, .exec(), .run(), .transaction(fn),\n// .close(); statements support positional `?` params via .run()/.get()/\n// .all(). (No named-object params / .values()/.iterate()/.as() are used in\n// this codebase, so the shim intentionally omits them.)\n//\n// The TYPE of the exported `Database` is bun:sqlite's own class type (imported\n// type-only, so it's erased at runtime and never resolved under node). That\n// keeps every existing call site — including generic `.query<Row, Params>()`\n// usages — type-checking exactly as before with zero changes.\n//\n// The bun branch uses a dynamic import so node never resolves the `bun:sqlite`\n// specifier (dead code under node), and the node branch's `node:sqlite` import\n// never runs under bun.\n\nimport type { Database as BunDatabase } from \"bun:sqlite\";\n\n// `mock.module()` can replace the Bun global while a test graph is being\n// evaluated. The runtime version flag is stable and is also the documented\n// cross-runtime discriminator.\nconst isBun = typeof process.versions.bun === \"string\";\n\ntype DatabaseCtor = typeof BunDatabase;\n\nlet Database: DatabaseCtor;\n\nif (isBun) {\n ({ Database } = await import(\"bun:sqlite\"));\n} else {\n // node:sqlite has no type declarations under our tsconfig (`types: bun-types`\n // only), and `bun-types` doesn't ship them — so type the dynamic import\n // locally and use a `string` specifier to keep tsc from trying to resolve it.\n type NodeStatement = {\n run(...params: unknown[]): unknown;\n get(...params: unknown[]): unknown;\n all(...params: unknown[]): unknown[];\n };\n type NodeDatabaseSync = {\n prepare(sql: string): NodeStatement;\n exec(sql: string): void;\n close(): void;\n };\n type NodeSqliteModule = {\n DatabaseSync: new (path: string, options?: { readOnly?: boolean }) => NodeDatabaseSync;\n };\n // Keep Bun's resolver from eagerly resolving the Node-only builtin even\n // though this branch is dead there (notably under `bun test` + mock.module).\n const nodeSqliteSpecifier = [\"node\", \"sqlite\"].join(\":\");\n const { DatabaseSync } = (await import(nodeSqliteSpecifier)) as NodeSqliteModule;\n\n type DbOptions = { readonly?: boolean; create?: boolean };\n\n class NodeDatabase {\n #db: NodeDatabaseSync;\n\n constructor(path: string, options: DbOptions = {}) {\n // node:sqlite opens read-write and creates-if-missing by default, which\n // matches bun's `{create:true}`. For readonly we must not create.\n this.#db = options.readonly\n ? new DatabaseSync(path, { readOnly: true })\n : new DatabaseSync(path);\n }\n\n query(sql: string) {\n return this.#db.prepare(sql);\n }\n\n prepare(sql: string) {\n return this.#db.prepare(sql);\n }\n\n exec(sql: string): void {\n this.#db.exec(sql);\n }\n\n run(sql: string, ...params: unknown[]) {\n return this.#db.prepare(sql).run(...params);\n }\n\n transaction<Args extends unknown[], R>(fn: (...args: Args) => R): (...args: Args) => R {\n // bun's db.transaction(fn) returns a function that runs fn inside a\n // transaction when called. node:sqlite has no helper, so emulate with\n // BEGIN/COMMIT/ROLLBACK. It also exposes deferred/immediate/exclusive\n // variants; mirror those so Node-launched MCP servers can share call\n // sites with Bun.\n const run =\n (begin: \"BEGIN\" | \"BEGIN DEFERRED\" | \"BEGIN IMMEDIATE\" | \"BEGIN EXCLUSIVE\") =>\n (...args: Args): R => {\n this.#db.exec(begin);\n try {\n const result = fn(...args);\n this.#db.exec(\"COMMIT\");\n return result;\n } catch (err) {\n this.#db.exec(\"ROLLBACK\");\n throw err;\n }\n };\n const tx = run(\"BEGIN\") as ((...args: Args) => R) & {\n deferred: (...args: Args) => R;\n immediate: (...args: Args) => R;\n exclusive: (...args: Args) => R;\n };\n tx.deferred = run(\"BEGIN DEFERRED\");\n tx.immediate = run(\"BEGIN IMMEDIATE\");\n tx.exclusive = run(\"BEGIN EXCLUSIVE\");\n return tx;\n }\n\n close(): void {\n this.#db.close();\n }\n }\n\n Database = NodeDatabase as unknown as DatabaseCtor;\n}\n\nexport { Database };\n"
|
|
7
6
|
],
|
|
8
|
-
"mappings": "
|
|
9
|
-
"debugId": "
|
|
7
|
+
"mappings": ";;;;;;AA+BA,IAAM,QAAQ,OAAO,QAAQ,SAAS,QAAQ;AAI9C,IAAI;AAEJ,IAAI,OAAO;AAAA,GACR,EAAE,SAAS,IAAI,MAAa;AAC/B,EAAO;AAAA,EAmBL,MAAM,sBAAsB,CAAC,QAAQ,QAAQ,EAAE,KAAK,GAAG;AAAA,EACvD,QAAQ,iBAAkB,MAAa;AAAA;AAAA,EAIvC,MAAM,aAAa;AAAA,IACjB;AAAA,IAEA,WAAW,CAAC,MAAc,UAAqB,CAAC,GAAG;AAAA,MAGjD,KAAK,MAAM,QAAQ,WACf,IAAI,aAAa,MAAM,EAAE,UAAU,KAAK,CAAC,IACzC,IAAI,aAAa,IAAI;AAAA;AAAA,IAG3B,KAAK,CAAC,KAAa;AAAA,MACjB,OAAO,KAAK,IAAI,QAAQ,GAAG;AAAA;AAAA,IAG7B,OAAO,CAAC,KAAa;AAAA,MACnB,OAAO,KAAK,IAAI,QAAQ,GAAG;AAAA;AAAA,IAG7B,IAAI,CAAC,KAAmB;AAAA,MACtB,KAAK,IAAI,KAAK,GAAG;AAAA;AAAA,IAGnB,GAAG,CAAC,QAAgB,QAAmB;AAAA,MACrC,OAAO,KAAK,IAAI,QAAQ,GAAG,EAAE,IAAI,GAAG,MAAM;AAAA;AAAA,IAG5C,WAAsC,CAAC,IAAgD;AAAA,MAMrF,MAAM,MACJ,CAAC,UACD,IAAI,SAAkB;AAAA,QACpB,KAAK,IAAI,KAAK,KAAK;AAAA,QACnB,IAAI;AAAA,UACF,MAAM,SAAS,GAAG,GAAG,IAAI;AAAA,UACzB,KAAK,IAAI,KAAK,QAAQ;AAAA,UACtB,OAAO;AAAA,UACP,OAAO,KAAK;AAAA,UACZ,KAAK,IAAI,KAAK,UAAU;AAAA,UACxB,MAAM;AAAA;AAAA;AAAA,MAGZ,MAAM,KAAK,IAAI,OAAO;AAAA,MAKtB,GAAG,WAAW,IAAI,gBAAgB;AAAA,MAClC,GAAG,YAAY,IAAI,iBAAiB;AAAA,MACpC,GAAG,YAAY,IAAI,iBAAiB;AAAA,MACpC,OAAO;AAAA;AAAA,IAGT,KAAK,GAAS;AAAA,MACZ,KAAK,IAAI,MAAM;AAAA;AAAA,EAEnB;AAAA,EAEA,WAAW;AAAA;",
|
|
8
|
+
"debugId": "AD00EEC8F204EDFF64756E2164756E21",
|
|
10
9
|
"names": []
|
|
11
10
|
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
db
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-1msje2zf.js";
|
|
5
|
+
import"./chunk-f5xgprg1.js";
|
|
5
6
|
import {
|
|
6
7
|
logger
|
|
7
8
|
} from "./chunk-k9z47mab.js";
|
|
@@ -580,4 +581,4 @@ export {
|
|
|
580
581
|
|
|
581
582
|
export { FROM_AUTO_CONTINUE, FROM_SELF_SCHEDULE, RESERVED_TOPIC_NAMES, GENERAL_TOPIC_ID, setApiTopicAgent, isTopicShared, isTopicVisible, normalizeTopicKind, inferTopicKind, normalizeTopicState, upsertTopic, listTopics, getTopic, getManagerTopicForUser, getTopicMemoryOrigin, findTopicTitleConflict, getTopicByNameForUser, setTopicSessionId, clearTopicSessionId, getTopicSessionId, deleteTopic, reparentTopicChildren };
|
|
582
583
|
|
|
583
|
-
//# debugId=
|
|
584
|
+
//# debugId=4CD1739060477B3C64756E2164756E21
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"/** \"from\" field for session-inbox entries injected after a setting change. */\nexport const FROM_AUTO_CONTINUE = \"auto-continue\";\n\n/** \"from\" field for durable delayed continuations created by schedule_self. */\nexport const FROM_SELF_SCHEDULE = \"self-schedule\";\n\n/** Topic names that collide with internal sentinels and must not be used. */\nexport const RESERVED_TOPIC_NAMES: ReadonlySet<string> = new Set([\n FROM_AUTO_CONTINUE,\n FROM_SELF_SCHEDULE,\n \"general\",\n]);\n\n/** Legacy shared General id. New General rooms use per-user UUIDs. */\nexport const GENERAL_TOPIC_ID = \"general\";\n\n/** Internal topic name for the forum manager session (General topic). */\nexport const TOPIC_MANAGER = \"__manager__\";\n",
|
|
6
6
|
"// Persistent topic store backed by shared SQLite.\n\nimport { GENERAL_TOPIC_ID } from \"#platform/constants\";\nimport { logger } from \"#platform/logger\";\nimport { db } from \"#storage/forum-db\";\nimport type { AgentKind, EffortLevel } from \"#types\";\nimport type {\n AiMode,\n ParticipantDto,\n TopicAccessMode,\n TopicDto,\n TopicKind,\n TopicVisibility,\n} from \"#types/api\";\n\nconst DEFAULT_AGENT_ROOM_AGENT: AgentKind = \"maestro\";\n\nfunction tableColumns(table: string): Set<string> {\n const rows = db.query(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n return new Set(rows.map((row) => row.name));\n}\n\n/** Persist the authoritative agent and, when supplied, its normalized base defaults. */\nexport function setApiTopicAgent(\n topicId: string,\n agent: AgentKind,\n defaults?: { model: string; effort?: EffortLevel },\n): void {\n if (!defaults) {\n db.query(\"UPDATE api_topics SET agent = ? WHERE id = ?\").run(agent, topicId);\n return;\n }\n db.query(\"UPDATE api_topics SET agent = ?, base_model = ?, base_effort = ? WHERE id = ?\").run(\n agent,\n defaults.model,\n defaults.effort ?? null,\n topicId,\n );\n}\n\ndb.exec(`\n CREATE TABLE IF NOT EXISTS api_topics (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n kind TEXT NOT NULL DEFAULT 'channel',\n description TEXT,\n agent TEXT,\n default_model TEXT,\n default_effort TEXT,\n participants TEXT,\n created_at TEXT NOT NULL,\n last_message_at TEXT,\n is_archived INTEGER NOT NULL DEFAULT 0,\n ai_mention INTEGER NOT NULL DEFAULT 0,\n ai_mode TEXT\n )\n`);\n\nconst initialTopicColumns = tableColumns(\"api_topics\");\nconst legacyTopicSchema = !initialTopicColumns.has(\"response_policy\");\nconst needsCanonicalTopicRebuild = legacyTopicSchema || !initialTopicColumns.has(\"agent\");\nif (legacyTopicSchema) {\n // Rename the legacy column once; new databases are created with `agent`.\n try {\n db.exec(\"ALTER TABLE api_topics RENAME COLUMN default_agent TO agent\");\n } catch {\n // Already migrated or freshly created.\n }\n\n // Migrate existing DBs that predate the ai_mention column (team-mode topics).\n try {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN ai_mention INTEGER NOT NULL DEFAULT 0\");\n } catch {\n // Column already exists — nothing to do.\n }\n\n // Migrate for spawn/fork tracking (R1).\n try {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN parent_topic_id TEXT\");\n } catch {\n // Column already exists.\n }\n try {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN is_fork INTEGER NOT NULL DEFAULT 0\");\n } catch {\n // Column already exists.\n }\n\n // Migrate for agent-spawned subagent worker rooms.\n try {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN is_subagent INTEGER NOT NULL DEFAULT 0\");\n } catch {\n // Column already exists.\n }\n\n // Migrate for session persistence.\n try {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN session_id TEXT\");\n } catch {\n // Column already exists.\n }\n\n try {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN kind TEXT NOT NULL DEFAULT 'channel'\");\n } catch {\n // Column already exists.\n }\n\n try {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN ai_mode TEXT\");\n } catch {\n // Column already exists.\n }\n\n db.exec(`\n CREATE TABLE IF NOT EXISTS api_schema_migrations (\n key TEXT PRIMARY KEY,\n applied_at TEXT NOT NULL\n )\n`);\n\n const ALWAYS_RESPOND_MIGRATION = \"api_topics_ai_invited_default_always_respond_20260623\";\n const alwaysRespondMigration = db\n .query(\"SELECT key FROM api_schema_migrations WHERE key = ?\")\n .get(ALWAYS_RESPOND_MIGRATION);\n if (!alwaysRespondMigration) {\n db.transaction(() => {\n db.query(\"UPDATE api_topics SET ai_mention = 0 WHERE agent IS NOT NULL\").run();\n db.query(\"INSERT INTO api_schema_migrations (key, applied_at) VALUES (?, ?)\").run(\n ALWAYS_RESPOND_MIGRATION,\n new Date().toISOString(),\n );\n })();\n }\n\n const GENERAL_AGENT_KIND_MIGRATION = \"api_topics_general_agent_kind_20260704\";\n const generalAgentKindMigration = db\n .query(\"SELECT key FROM api_schema_migrations WHERE key = ?\")\n .get(GENERAL_AGENT_KIND_MIGRATION);\n if (!generalAgentKindMigration) {\n db.transaction(() => {\n db.query(\"UPDATE api_topics SET kind = 'agent', ai_mention = 0 WHERE id = ?\").run(\n GENERAL_TOPIC_ID,\n );\n db.query(\"INSERT INTO api_schema_migrations (key, applied_at) VALUES (?, ?)\").run(\n GENERAL_AGENT_KIND_MIGRATION,\n new Date().toISOString(),\n );\n })();\n }\n\n const AI_MODE_MIGRATION = \"api_topics_ai_mode_20260704\";\n const aiModeMigration = db\n .query(\"SELECT key FROM api_schema_migrations WHERE key = ?\")\n .get(AI_MODE_MIGRATION);\n if (!aiModeMigration) {\n db.transaction(() => {\n db.query(\n `UPDATE api_topics\n SET\n kind = CASE\n WHEN id = ? THEN 'agent'\n WHEN kind = 'channel' AND agent IS NOT NULL AND ai_mention = 0 THEN 'agent'\n ELSE kind\n END,\n ai_mode = CASE\n WHEN id = ? THEN 'always'\n WHEN agent IS NULL THEN 'off'\n WHEN kind = 'agent' THEN 'always'\n WHEN kind = 'channel' AND ai_mention != 0 THEN 'mention'\n WHEN kind = 'channel' AND ai_mention = 0 THEN 'always'\n WHEN ai_mention != 0 THEN 'mention'\n ELSE 'always'\n END`,\n ).run(GENERAL_TOPIC_ID, GENERAL_TOPIC_ID);\n db.query(\"INSERT INTO api_schema_migrations (key, applied_at) VALUES (?, ?)\").run(\n AI_MODE_MIGRATION,\n new Date().toISOString(),\n );\n })();\n }\n\n const GENERAL_MANAGER_KIND_MIGRATION = \"api_topics_general_manager_kind_20260704\";\n const generalManagerKindMigration = db\n .query(\"SELECT key FROM api_schema_migrations WHERE key = ?\")\n .get(GENERAL_MANAGER_KIND_MIGRATION);\n if (!generalManagerKindMigration) {\n db.transaction(() => {\n db.query(\n \"UPDATE api_topics SET kind = 'manager', ai_mention = 0, ai_mode = 'always' WHERE id = ?\",\n ).run(GENERAL_TOPIC_ID);\n db.query(\"INSERT INTO api_schema_migrations (key, applied_at) VALUES (?, ?)\").run(\n GENERAL_MANAGER_KIND_MIGRATION,\n new Date().toISOString(),\n );\n })();\n }\n}\n\nfunction createCanonicalTopicsTable(name: string): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS ${name} (\n id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n kind TEXT NOT NULL CHECK (kind IN ('channel','agent','manager')),\n description TEXT,\n agent TEXT CHECK (agent IS NULL OR agent IN ('maestro','claude','codex')),\n base_model TEXT,\n base_effort TEXT CHECK (base_effort IS NULL OR base_effort IN ('low','medium','high','xhigh','max')),\n response_policy TEXT NOT NULL CHECK (response_policy IN ('off','mention','always')),\n created_at TEXT NOT NULL,\n last_message_at TEXT,\n parent_topic_id TEXT,\n is_fork INTEGER NOT NULL DEFAULT 0 CHECK (is_fork IN (0,1)),\n is_subagent INTEGER NOT NULL DEFAULT 0 CHECK (is_subagent IN (0,1)),\n visibility TEXT NOT NULL DEFAULT 'visible' CHECK (visibility IN ('visible','hidden')),\n access_mode TEXT NOT NULL DEFAULT 'private' CHECK (access_mode IN ('private','shared')),\n browser_profile TEXT NOT NULL DEFAULT 'default',\n browser_profile_owner TEXT,\n session_id TEXT,\n CHECK (\n (kind = 'channel' AND response_policy = 'off' AND agent IS NULL) OR\n (kind = 'channel' AND response_policy = 'mention' AND agent IS NOT NULL) OR\n (kind IN ('agent','manager') AND response_policy = 'always' AND agent IS NOT NULL)\n )\n )\n `);\n}\n\nfunction createTopicMembersTable(): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS topic_members (\n topic_id TEXT NOT NULL REFERENCES api_topics(id) ON DELETE CASCADE,\n user_id TEXT NOT NULL,\n role TEXT NOT NULL CHECK (role IN ('owner','member')),\n PRIMARY KEY (topic_id, user_id)\n )\n `);\n db.exec(\"CREATE INDEX IF NOT EXISTS idx_topic_members_user ON topic_members(user_id)\");\n}\n\nif (needsCanonicalTopicRebuild) {\n const legacyRows = db.query(\"SELECT * FROM api_topics\").all() as Array<Record<string, unknown>>;\n const existingMemberRows = tableColumns(\"topic_members\").has(\"topic_id\")\n ? (db.query(\"SELECT topic_id, user_id, role FROM topic_members\").all() as Array<{\n topic_id: string;\n user_id: string;\n role: string;\n }>)\n : [];\n const configColumns = tableColumns(\"api_topic_config\");\n const legacyAgentOverrides = configColumns.has(\"agent\")\n ? new Map(\n (\n db\n .query(\"SELECT topic_id, agent FROM api_topic_config WHERE agent IS NOT NULL\")\n .all() as Array<{ topic_id: string; agent: AgentKind }>\n ).map((row) => [row.topic_id, row.agent]),\n )\n : new Map<string, AgentKind>();\n const previousForeignKeys = db\n .query<{ foreign_keys: number }, []>(\"PRAGMA foreign_keys\")\n .get()?.foreign_keys;\n db.exec(\"PRAGMA foreign_keys = OFF\");\n try {\n db.transaction(() => {\n createCanonicalTopicsTable(\"api_topics_next\");\n for (const row of legacyRows) {\n const selectedAgent = (legacyAgentOverrides.get(String(row.id)) ??\n row.agent ??\n row.runtime_agent ??\n row.default_agent ??\n undefined) as AgentKind | undefined;\n const normalized = normalizeTopicState({\n id: String(row.id),\n kind: normalizeTopicKind(row.kind),\n agent: selectedAgent,\n aiMode: normalizeAiMode(row.response_policy ?? row.ai_mode),\n aiMention: Number(row.ai_mention ?? 0) !== 0,\n });\n const legacyBaseModel = row.base_model ?? row.default_model;\n const legacyBaseEffort = row.base_effort ?? row.default_effort;\n db.query(\n `INSERT INTO api_topics_next\n (id,title,kind,description,agent,base_model,base_effort,response_policy,\n created_at,last_message_at,parent_topic_id,is_fork,is_subagent,visibility,access_mode,session_id)\n VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`,\n ).run(\n String(row.id),\n String(row.title),\n normalized.kind,\n typeof row.description === \"string\" ? row.description : null,\n normalized.agent ?? null,\n typeof legacyBaseModel === \"string\" ? legacyBaseModel : null,\n typeof legacyBaseEffort === \"string\" ? legacyBaseEffort : null,\n normalized.aiMode,\n String(row.created_at),\n typeof row.last_message_at === \"string\" ? row.last_message_at : null,\n typeof row.parent_topic_id === \"string\" ? row.parent_topic_id : null,\n Number(row.is_fork ?? 0) !== 0 ? 1 : 0,\n Number(row.is_subagent ?? 0) !== 0 ? 1 : 0,\n row.visibility === \"hidden\" ? \"hidden\" : \"visible\",\n row.access_mode === \"shared\" ? \"shared\" : \"private\",\n typeof row.session_id === \"string\" ? row.session_id : null,\n );\n }\n db.exec(\"DROP TABLE IF EXISTS topic_members\");\n db.exec(\"DROP TABLE api_topics\");\n db.exec(\"ALTER TABLE api_topics_next RENAME TO api_topics\");\n createTopicMembersTable();\n if (existingMemberRows.length > 0) {\n for (const member of existingMemberRows) {\n db.query(\n \"INSERT OR REPLACE INTO topic_members (topic_id,user_id,role) VALUES (?,?,?)\",\n ).run(member.topic_id, member.user_id, member.role === \"owner\" ? \"owner\" : \"member\");\n }\n } else {\n for (const row of legacyRows) {\n let participants: ParticipantDto[] = [];\n try {\n const parsed = JSON.parse(String(row.participants ?? \"[]\"));\n if (Array.isArray(parsed)) participants = parsed as ParticipantDto[];\n } catch {\n participants = [];\n }\n for (const participant of participants) {\n if (!participant?.userId) continue;\n db.query(\n \"INSERT OR REPLACE INTO topic_members (topic_id,user_id,role) VALUES (?,?,?)\",\n ).run(\n String(row.id),\n participant.userId,\n participant.role === \"owner\" ? \"owner\" : \"member\",\n );\n }\n }\n }\n })();\n } finally {\n db.exec(`PRAGMA foreign_keys = ${previousForeignKeys ? \"ON\" : \"OFF\"}`);\n }\n} else {\n createCanonicalTopicsTable(\"api_topics\");\n createTopicMembersTable();\n}\n\n// Canonical databases created before explicit adapter visibility need a\n// lightweight additive migration; fresh/rebuilt databases already have it.\nif (!tableColumns(\"api_topics\").has(\"visibility\")) {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN visibility TEXT NOT NULL DEFAULT 'visible'\");\n}\nif (!tableColumns(\"api_topics\").has(\"access_mode\")) {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN access_mode TEXT NOT NULL DEFAULT 'private'\");\n}\nif (!tableColumns(\"api_topics\").has(\"browser_profile\")) {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN browser_profile TEXT NOT NULL DEFAULT 'default'\");\n}\nif (!tableColumns(\"api_topics\").has(\"browser_profile_owner\")) {\n db.exec(\"ALTER TABLE api_topics ADD COLUMN browser_profile_owner TEXT\");\n}\ndb.exec(`\n UPDATE api_topics\n SET browser_profile_owner = (\n SELECT m.user_id FROM topic_members m\n WHERE m.topic_id = api_topics.id AND m.role = 'owner'\n ORDER BY m.rowid\n LIMIT 1\n )\n WHERE browser_profile_owner IS NULL\n`);\n\ninterface TopicRow {\n id: string;\n title: string;\n kind: string | null;\n description: string | null;\n agent: string | null;\n base_model: string | null;\n base_effort: string | null;\n response_policy: string;\n created_at: string;\n last_message_at: string | null;\n parent_topic_id: string | null;\n is_fork: number;\n is_subagent: number;\n visibility: string | null;\n access_mode: string | null;\n browser_profile_owner: string | null;\n session_id: string | null;\n}\n\ninterface TopicSessionLogContext {\n reason?: string;\n queryId?: string;\n agent?: AgentKind;\n}\n\nfunction shortSessionId(sessionId: string | null | undefined): string | null {\n return sessionId ? sessionId.slice(0, 8) : null;\n}\n\nfunction getTopicParticipants(topicId: string): ParticipantDto[] {\n return db\n .query<{ user_id: string; role: \"owner\" | \"member\" }, string>(\n \"SELECT user_id, role FROM topic_members WHERE topic_id = ? ORDER BY rowid\",\n )\n .all(topicId)\n .map((row) => ({ userId: row.user_id, role: row.role }));\n}\n\nfunction getAllTopicParticipants(): Map<string, ParticipantDto[]> {\n const grouped = new Map<string, ParticipantDto[]>();\n const rows = db\n .query<{ topic_id: string; user_id: string; role: \"owner\" | \"member\" }, []>(\n \"SELECT topic_id, user_id, role FROM topic_members ORDER BY rowid\",\n )\n .all();\n for (const row of rows) {\n const participants = grouped.get(row.topic_id) ?? [];\n participants.push({ userId: row.user_id, role: row.role });\n grouped.set(row.topic_id, participants);\n }\n return grouped;\n}\n\nfunction rowToDto(r: TopicRow, participants = getTopicParticipants(r.id)): TopicDto {\n const normalized = normalizeTopicState({\n id: r.id,\n kind: normalizeTopicKind(r.kind),\n agent: (r.agent as AgentKind | null) ?? undefined,\n aiMode: normalizeAiMode(r.response_policy),\n });\n return {\n id: r.id,\n title: r.title,\n kind: normalized.kind,\n description: r.description ?? undefined,\n agent: normalized.agent,\n defaultModel: r.base_model ?? \"deepseek-pro\",\n defaultEffort: (r.base_effort as EffortLevel) ?? undefined,\n aiMode: normalized.aiMode,\n aiMention: aiMentionFromMode(normalized.aiMode),\n participants,\n createdAt: r.created_at,\n lastMessageAt: r.last_message_at ?? new Date().toISOString(),\n parentTopicId: r.parent_topic_id ?? undefined,\n isFork: r.is_fork !== 0,\n ...(r.is_subagent !== 0 ? { isSubagent: true } : {}),\n visibility: normalizeTopicVisibility(r.visibility),\n accessMode: normalizeTopicAccessMode(r.access_mode),\n };\n}\n\nexport function normalizeTopicAccessMode(value: unknown): TopicAccessMode {\n return value === \"shared\" ? \"shared\" : \"private\";\n}\n\n/** Otium and other non-local adapters may only address shared topics. */\nexport function isTopicShared(topic: Pick<TopicDto, \"accessMode\">): boolean {\n return topic.accessMode === \"shared\";\n}\n\nexport function normalizeTopicVisibility(value: unknown): TopicVisibility {\n return value === \"hidden\" ? \"hidden\" : \"visible\";\n}\n\n/** Discovery boundary shared by user-facing adapters. */\nexport function isTopicVisible(topic: Pick<TopicDto, \"visibility\">): boolean {\n return topic.visibility !== \"hidden\";\n}\n\nexport function normalizeTopicKind(value: unknown): TopicKind | null {\n return value === \"channel\" || value === \"agent\" || value === \"manager\" ? value : null;\n}\n\nexport function normalizeAiMode(value: unknown): AiMode | null {\n return value === \"off\" || value === \"mention\" || value === \"always\" ? value : null;\n}\n\nexport function aiMentionFromMode(mode: AiMode): boolean {\n return mode === \"mention\";\n}\n\nexport function inferTopicKind(input: {\n agent?: string | null;\n aiMention?: boolean | null;\n}): TopicKind {\n return input.agent && input.aiMention !== true ? \"agent\" : \"channel\";\n}\n\nexport function inferAiMode(input: {\n kind?: TopicKind | null;\n agent?: string | null;\n aiMode?: AiMode | null;\n aiMention?: boolean | null;\n}): AiMode {\n if (input.kind === \"manager\") return \"always\";\n if (input.kind === \"agent\") return \"always\";\n if (input.kind === \"channel\") {\n if (!input.agent) return \"off\";\n if (input.aiMode === \"mention\") return \"mention\";\n if (input.aiMention === true) return \"mention\";\n return \"mention\";\n }\n if (!input.agent) return \"off\";\n if (input.aiMode) return input.aiMode;\n return input.aiMention === true ? \"mention\" : \"always\";\n}\n\nexport function normalizeTopicState(input: {\n id?: string;\n kind?: TopicKind | null;\n agent?: AgentKind | null;\n aiMode?: AiMode | null;\n aiMention?: boolean | null;\n}): { kind: TopicKind; aiMode: AiMode; agent?: AgentKind } {\n if (input.kind === \"manager\" || input.id === GENERAL_TOPIC_ID) {\n return {\n kind: \"manager\",\n aiMode: \"always\",\n agent: input.agent ?? DEFAULT_AGENT_ROOM_AGENT,\n };\n }\n\n const requestedKind = input.kind;\n const kind =\n requestedKind ??\n (input.aiMode === \"always\"\n ? \"agent\"\n : input.aiMode === \"mention\" || input.aiMode === \"off\"\n ? \"channel\"\n : input.agent && input.aiMention !== true\n ? \"agent\"\n : \"channel\");\n\n if (kind === \"agent\") {\n return {\n kind: \"agent\",\n aiMode: \"always\",\n agent: input.agent ?? DEFAULT_AGENT_ROOM_AGENT,\n };\n }\n\n const agent = input.aiMode === \"off\" ? undefined : (input.agent ?? undefined);\n return {\n kind: \"channel\",\n aiMode: agent ? \"mention\" : \"off\",\n agent,\n };\n}\n\nfunction normalizedTitle(title: string): string {\n return title.trim().toLowerCase();\n}\n\nexport function upsertTopic(t: TopicDto): void {\n const normalized = normalizeTopicState({\n id: t.id,\n kind: normalizeTopicKind(t.kind),\n agent: t.agent ?? undefined,\n aiMode: normalizeAiMode(t.aiMode),\n aiMention: t.aiMention,\n });\n db.transaction(() => {\n db.query(\n `INSERT INTO api_topics\n (id,title,kind,description,agent,base_model,base_effort,response_policy,\n created_at,last_message_at,parent_topic_id,is_fork,is_subagent,visibility,access_mode)\n VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)\n ON CONFLICT(id) DO UPDATE SET\n title = excluded.title,\n kind = excluded.kind,\n description = excluded.description,\n agent = excluded.agent,\n base_model = excluded.base_model,\n base_effort = excluded.base_effort,\n response_policy = excluded.response_policy,\n created_at = excluded.created_at,\n last_message_at = excluded.last_message_at,\n parent_topic_id = excluded.parent_topic_id,\n is_fork = excluded.is_fork,\n is_subagent = excluded.is_subagent,\n visibility = excluded.visibility,\n access_mode = excluded.access_mode`,\n ).run(\n t.id,\n t.title,\n normalized.kind,\n t.description ?? null,\n normalized.agent ?? null,\n t.defaultModel ?? null,\n t.defaultEffort ?? null,\n normalized.aiMode,\n t.createdAt,\n t.lastMessageAt ?? null,\n t.parentTopicId ?? null,\n t.isFork ? 1 : 0,\n t.isSubagent ? 1 : 0,\n normalizeTopicVisibility(t.visibility),\n normalizeTopicAccessMode(t.accessMode),\n );\n db.query(\"DELETE FROM topic_members WHERE topic_id = ?\").run(t.id);\n for (const participant of t.participants) {\n db.query(\"INSERT INTO topic_members (topic_id,user_id,role) VALUES (?,?,?)\").run(\n t.id,\n participant.userId,\n participant.role,\n );\n }\n const initialBrowserProfileOwner = t.participants.find(\n (participant) => participant.role === \"owner\",\n )?.userId;\n if (initialBrowserProfileOwner) {\n db.query(\n `UPDATE api_topics\n SET browser_profile_owner = COALESCE(browser_profile_owner, ?)\n WHERE id = ?`,\n ).run(initialBrowserProfileOwner, t.id);\n }\n })();\n}\n\nexport function listTopics(): TopicDto[] {\n const rows = db\n .query(\"SELECT * FROM api_topics ORDER BY last_message_at DESC\")\n .all() as TopicRow[];\n const participants = getAllTopicParticipants();\n return rows.map((row) => rowToDto(row, participants.get(row.id) ?? []));\n}\n\nexport function getTopic(id: string): TopicDto | null {\n const r = db.query(\"SELECT * FROM api_topics WHERE id = ?\").get(id) as TopicRow | undefined;\n return r ? rowToDto(r) : null;\n}\n\n/** Return the private manager room owned by a user, excluding the retired shared General row. */\nexport function getManagerTopicForUser(userId: string): TopicDto | null {\n const row = db\n .query<TopicRow, [string, string]>(\n `SELECT t.* FROM api_topics t\n JOIN topic_members m ON m.topic_id = t.id\n WHERE t.kind = 'manager'\n AND t.id != ?\n AND m.user_id = ?\n AND m.role = 'owner'\n ORDER BY t.created_at ASC\n LIMIT 1`,\n )\n .get(GENERAL_TOPIC_ID, userId);\n return row ? rowToDto(row) : null;\n}\n\n/**\n * Resolve the topic whose wiki memory should be used for this topic.\n *\n * Derived rooms keep `parentTopicId` as an immediate UI link, but memory follows\n * Otium's `forkOrigin` semantics: a fork/spawn chain writes to and reads from\n * the original root topic.\n */\nexport function getTopicMemoryOrigin(id: string): TopicDto | null {\n let current = getTopic(id);\n if (!current) return null;\n\n const seen = new Set<string>([current.id]);\n while (current.parentTopicId && !seen.has(current.parentTopicId)) {\n const parent = getTopic(current.parentTopicId);\n if (!parent) break;\n current = parent;\n seen.add(current.id);\n }\n\n return current;\n}\n\n/** Look up a topic by its user-visible title (case-insensitive exact match). */\nexport function getTopicByName(title: string): TopicDto | null {\n const r = db.query(\"SELECT * FROM api_topics WHERE LOWER(title) = LOWER(?)\").get(title) as\n | TopicRow\n | undefined;\n return r ? rowToDto(r) : null;\n}\n\nexport function getTopicByNameAndKind(title: string, kind: TopicKind): TopicDto | null {\n const r = db\n .query(\"SELECT * FROM api_topics WHERE LOWER(title) = LOWER(?) AND kind = ?\")\n .get(title, kind) as TopicRow | undefined;\n return r ? rowToDto(r) : null;\n}\n\nexport function findTopicTitleConflict(\n title: string,\n kind: TopicKind,\n opts: { excludeTopicId?: string } = {},\n): TopicDto | null {\n const wanted = normalizedTitle(title);\n const generalTitleRequested = wanted === normalizedTitle(GENERAL_TOPIC_ID);\n if (generalTitleRequested && opts.excludeTopicId !== GENERAL_TOPIC_ID) {\n const general = db.query(\"SELECT * FROM api_topics WHERE id = ?\").get(GENERAL_TOPIC_ID) as\n | TopicRow\n | undefined;\n if (general) return rowToDto(general);\n }\n\n const params: string[] = [wanted];\n let sql = \"SELECT * FROM api_topics WHERE LOWER(TRIM(title)) = ?\";\n if (kind !== \"manager\") {\n sql += \" AND (kind = ? OR id = ?)\";\n params.push(kind, GENERAL_TOPIC_ID);\n }\n if (opts.excludeTopicId) {\n sql += \" AND id != ?\";\n params.push(opts.excludeTopicId);\n }\n sql += \" LIMIT 1\";\n const row = db.query<TopicRow, string[]>(sql).get(...params);\n return row ? rowToDto(row) : null;\n}\n\n/** Look up a topic by title, restricted to topics where `userId` participates. */\nexport function getTopicByNameForUser(title: string, userId: string): TopicDto | null {\n const trimmed = title.trim();\n const qualified = /^(agent|channel|manager):(.+)$/i.exec(trimmed);\n const requestedKind = qualified ? normalizeTopicKind(qualified[1]?.toLowerCase()) : null;\n const requestedTitle = qualified ? qualified[2]!.trim() : trimmed;\n const rows = db\n .query(\n `SELECT t.* FROM api_topics t\n WHERE LOWER(t.title) = LOWER(?)\n AND t.id != ?\n AND t.visibility != 'hidden'\n AND EXISTS (\n SELECT 1 FROM topic_members m WHERE m.topic_id = t.id AND m.user_id = ?\n )`,\n )\n .all(requestedTitle, GENERAL_TOPIC_ID, userId) as TopicRow[];\n const matches = requestedKind ? rows.filter((row) => row.kind === requestedKind) : rows;\n return matches.length === 1 ? rowToDto(matches[0]!) : null;\n}\n\n/** Persist the agent session ID for a topic after a successful turn. */\nexport function setTopicSessionId(\n topicId: string,\n sessionId: string,\n context: TopicSessionLogContext = {},\n): void {\n const previous = getTopicSessionId(topicId);\n const result = db\n .query(\"UPDATE api_topics SET session_id = ? WHERE id = ?\")\n .run(sessionId, topicId);\n const changes = Number(result.changes ?? 0);\n const logContext = {\n topicId,\n previousSessionId: shortSessionId(previous),\n sessionId: shortSessionId(sessionId),\n reason: context.reason,\n queryId: context.queryId,\n agent: context.agent,\n };\n if (changes === 0) {\n logger.warn(logContext, \"api-topic session_id update missed topic\");\n } else if (previous !== sessionId) {\n logger.debug(logContext, \"api-topic session_id updated\");\n } else {\n logger.debug(logContext, \"api-topic session_id unchanged\");\n }\n}\n\n/** Clear the session ID (e.g. on topic reset). */\nexport function clearTopicSessionId(topicId: string, reason = \"unspecified\"): void {\n const previous = getTopicSessionId(topicId);\n const result = db.query(\"UPDATE api_topics SET session_id = NULL WHERE id = ?\").run(topicId);\n const changes = Number(result.changes ?? 0);\n const logContext = { topicId, previousSessionId: shortSessionId(previous), reason };\n if (changes === 0) {\n logger.warn(logContext, \"api-topic session_id clear missed topic\");\n } else if (previous) {\n logger.info(logContext, \"api-topic session_id cleared\");\n } else {\n logger.debug(logContext, \"api-topic session_id already clear\");\n }\n}\n\n/** Read the persisted session ID for a topic, or null if none. */\nexport function getTopicSessionId(topicId: string): string | null {\n const r = db\n .query<{ session_id: string | null }, string>(\"SELECT session_id FROM api_topics WHERE id = ?\")\n .get(topicId);\n return r?.session_id ?? null;\n}\n\n/**\n * Hard-delete a topic row. Irreversible — the caller is responsible for also\n * deleting the topic's messages (see `deleteMessagesForTopic`). Returns false\n * if the topic didn't exist.\n */\nexport function deleteTopic(id: string, options: { allowManager?: boolean } = {}): boolean {\n const r = db\n .query<{ id: string; kind: string }, string>(\"SELECT id, kind FROM api_topics WHERE id = ?\")\n .get(id);\n if (!r) return false;\n if (id === GENERAL_TOPIC_ID || (r.kind === \"manager\" && !options.allowManager)) return false;\n db.query(\"DELETE FROM api_topics WHERE id = ?\").run(id);\n return true;\n}\n\n/**\n * Preserve a derived-topic chain when an intermediate parent is deleted.\n * Direct children move to the deleted topic's parent (or become roots) rather\n * than retaining a dangling parent id that would break memory-origin lookup.\n */\nexport function reparentTopicChildren(\n deletedTopicId: string,\n replacementParentTopicId: string | null,\n): string[] {\n const rows = db\n .query<{ id: string }, string>(\"SELECT id FROM api_topics WHERE parent_topic_id = ?\")\n .all(deletedTopicId);\n if (rows.length === 0) return [];\n db.query(\"UPDATE api_topics SET parent_topic_id = ? WHERE parent_topic_id = ?\").run(\n replacementParentTopicId,\n deletedTopicId,\n );\n return rows.map((row) => row.id);\n}\n\nexport function addParticipantToDB(\n topicId: string,\n userId: string,\n role: \"member\" | \"owner\",\n): boolean {\n if (!db.query(\"SELECT 1 FROM api_topics WHERE id = ?\").get(topicId)) return false;\n db.query(\"INSERT OR IGNORE INTO topic_members (topic_id,user_id,role) VALUES (?,?,?)\").run(\n topicId,\n userId,\n role,\n );\n return true;\n}\n\nexport function removeParticipantFromDB(topicId: string, userId: string): boolean {\n if (!db.query(\"SELECT 1 FROM api_topics WHERE id = ?\").get(topicId)) return false;\n db.query(\"DELETE FROM topic_members WHERE topic_id = ? AND user_id = ?\").run(topicId, userId);\n return true;\n}\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";;;;;;;;;;AACO,IAAM,qBAAqB;AAG3B,IAAM,qBAAqB;AAG3B,IAAM,uBAA4C,IAAI,IAAI;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,mBAAmB;;;ACChC,IAAM,2BAAsC;AAE5C,SAAS,YAAY,CAAC,OAA4B;AAAA,EAChD,MAAM,OAAO,GAAG,MAAM,qBAAqB,QAAQ,EAAE,IAAI;AAAA,EACzD,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AAAA;AAIrC,SAAS,gBAAgB,CAC9B,SACA,OACA,UACM;AAAA,EACN,KAAK,UAAU;AAAA,IACb,GAAG,MAAM,8CAA8C,EAAE,IAAI,OAAO,OAAO;AAAA,IAC3E;AAAA,EACF;AAAA,EACA,GAAG,MAAM,+EAA+E,EAAE,IACxF,OACA,SAAS,OACT,SAAS,UAAU,MACnB,OACF;AAAA;AAGF,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAgBP;AAED,IAAM,sBAAsB,aAAa,YAAY;AACrD,IAAM,qBAAqB,oBAAoB,IAAI,iBAAiB;AACpE,IAAM,6BAA6B,sBAAsB,oBAAoB,IAAI,OAAO;AACxF,IAAI,mBAAmB;AAAA,EAErB,IAAI;AAAA,IACF,GAAG,KAAK,6DAA6D;AAAA,IACrE,MAAM;AAAA,EAKR,IAAI;AAAA,IACF,GAAG,KAAK,yEAAyE;AAAA,IACjF,MAAM;AAAA,EAKR,IAAI;AAAA,IACF,GAAG,KAAK,wDAAwD;AAAA,IAChE,MAAM;AAAA,EAGR,IAAI;AAAA,IACF,GAAG,KAAK,sEAAsE;AAAA,IAC9E,MAAM;AAAA,EAKR,IAAI;AAAA,IACF,GAAG,KAAK,0EAA0E;AAAA,IAClF,MAAM;AAAA,EAKR,IAAI;AAAA,IACF,GAAG,KAAK,mDAAmD;AAAA,IAC3D,MAAM;AAAA,EAIR,IAAI;AAAA,IACF,GAAG,KAAK,wEAAwE;AAAA,IAChF,MAAM;AAAA,EAIR,IAAI;AAAA,IACF,GAAG,KAAK,gDAAgD;AAAA,IACxD,MAAM;AAAA,EAIR,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,CAKT;AAAA,EAEC,MAAM,2BAA2B;AAAA,EACjC,MAAM,yBAAyB,GAC5B,MAAM,qDAAqD,EAC3D,IAAI,wBAAwB;AAAA,EAC/B,KAAK,wBAAwB;AAAA,IAC3B,GAAG,YAAY,MAAM;AAAA,MACnB,GAAG,MAAM,8DAA8D,EAAE,IAAI;AAAA,MAC7E,GAAG,MAAM,mEAAmE,EAAE,IAC5E,0BACA,IAAI,KAAK,EAAE,YAAY,CACzB;AAAA,KACD,EAAE;AAAA,EACL;AAAA,EAEA,MAAM,+BAA+B;AAAA,EACrC,MAAM,4BAA4B,GAC/B,MAAM,qDAAqD,EAC3D,IAAI,4BAA4B;AAAA,EACnC,KAAK,2BAA2B;AAAA,IAC9B,GAAG,YAAY,MAAM;AAAA,MACnB,GAAG,MAAM,mEAAmE,EAAE,IAC5E,gBACF;AAAA,MACA,GAAG,MAAM,mEAAmE,EAAE,IAC5E,8BACA,IAAI,KAAK,EAAE,YAAY,CACzB;AAAA,KACD,EAAE;AAAA,EACL;AAAA,EAEA,MAAM,oBAAoB;AAAA,EAC1B,MAAM,kBAAkB,GACrB,MAAM,qDAAqD,EAC3D,IAAI,iBAAiB;AAAA,EACxB,KAAK,iBAAiB;AAAA,IACpB,GAAG,YAAY,MAAM;AAAA,MACnB,GAAG,MACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAgBF,EAAE,IAAI,kBAAkB,gBAAgB;AAAA,MACxC,GAAG,MAAM,mEAAmE,EAAE,IAC5E,mBACA,IAAI,KAAK,EAAE,YAAY,CACzB;AAAA,KACD,EAAE;AAAA,EACL;AAAA,EAEA,MAAM,iCAAiC;AAAA,EACvC,MAAM,8BAA8B,GACjC,MAAM,qDAAqD,EAC3D,IAAI,8BAA8B;AAAA,EACrC,KAAK,6BAA6B;AAAA,IAChC,GAAG,YAAY,MAAM;AAAA,MACnB,GAAG,MACD,yFACF,EAAE,IAAI,gBAAgB;AAAA,MACtB,GAAG,MAAM,mEAAmE,EAAE,IAC5E,gCACA,IAAI,KAAK,EAAE,YAAY,CACzB;AAAA,KACD,EAAE;AAAA,EACL;AACF;AAEA,SAAS,0BAA0B,CAAC,MAAoB;AAAA,EACtD,GAAG,KAAK;AAAA,iCACuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAyB9B;AAAA;AAGH,SAAS,uBAAuB,GAAS;AAAA,EACvC,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOP;AAAA,EACD,GAAG,KAAK,6EAA6E;AAAA;AAGvF,IAAI,4BAA4B;AAAA,EAC9B,MAAM,aAAa,GAAG,MAAM,0BAA0B,EAAE,IAAI;AAAA,EAC5D,MAAM,qBAAqB,aAAa,eAAe,EAAE,IAAI,UAAU,IAClE,GAAG,MAAM,mDAAmD,EAAE,IAAI,IAKnE,CAAC;AAAA,EACL,MAAM,gBAAgB,aAAa,kBAAkB;AAAA,EACrD,MAAM,uBAAuB,cAAc,IAAI,OAAO,IAClD,IAAI,IAEA,GACG,MAAM,sEAAsE,EAC5E,IAAI,EACP,IAAI,CAAC,QAAQ,CAAC,IAAI,UAAU,IAAI,KAAK,CAAC,CAC1C,IACA,IAAI;AAAA,EACR,MAAM,sBAAsB,GACzB,MAAoC,qBAAqB,EACzD,IAAI,GAAG;AAAA,EACV,GAAG,KAAK,2BAA2B;AAAA,EACnC,IAAI;AAAA,IACF,GAAG,YAAY,MAAM;AAAA,MACnB,2BAA2B,iBAAiB;AAAA,MAC5C,WAAW,OAAO,YAAY;AAAA,QAC5B,MAAM,gBAAiB,qBAAqB,IAAI,OAAO,IAAI,EAAE,CAAC,KAC5D,IAAI,SACJ,IAAI,iBACJ,IAAI,iBACJ;AAAA,QACF,MAAM,aAAa,oBAAoB;AAAA,UACrC,IAAI,OAAO,IAAI,EAAE;AAAA,UACjB,MAAM,mBAAmB,IAAI,IAAI;AAAA,UACjC,OAAO;AAAA,UACP,QAAQ,gBAAgB,IAAI,mBAAmB,IAAI,OAAO;AAAA,UAC1D,WAAW,OAAO,IAAI,cAAc,CAAC,MAAM;AAAA,QAC7C,CAAC;AAAA,QACD,MAAM,kBAAkB,IAAI,cAAc,IAAI;AAAA,QAC9C,MAAM,mBAAmB,IAAI,eAAe,IAAI;AAAA,QAChD,GAAG,MACD;AAAA;AAAA;AAAA,oDAIF,EAAE,IACA,OAAO,IAAI,EAAE,GACb,OAAO,IAAI,KAAK,GAChB,WAAW,MACX,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc,MACxD,WAAW,SAAS,MACpB,OAAO,oBAAoB,WAAW,kBAAkB,MACxD,OAAO,qBAAqB,WAAW,mBAAmB,MAC1D,WAAW,QACX,OAAO,IAAI,UAAU,GACrB,OAAO,IAAI,oBAAoB,WAAW,IAAI,kBAAkB,MAChE,OAAO,IAAI,oBAAoB,WAAW,IAAI,kBAAkB,MAChE,OAAO,IAAI,WAAW,CAAC,MAAM,IAAI,IAAI,GACrC,OAAO,IAAI,eAAe,CAAC,MAAM,IAAI,IAAI,GACzC,IAAI,eAAe,WAAW,WAAW,WACzC,IAAI,gBAAgB,WAAW,WAAW,WAC1C,OAAO,IAAI,eAAe,WAAW,IAAI,aAAa,IACxD;AAAA,MACF;AAAA,MACA,GAAG,KAAK,oCAAoC;AAAA,MAC5C,GAAG,KAAK,uBAAuB;AAAA,MAC/B,GAAG,KAAK,kDAAkD;AAAA,MAC1D,wBAAwB;AAAA,MACxB,IAAI,mBAAmB,SAAS,GAAG;AAAA,QACjC,WAAW,UAAU,oBAAoB;AAAA,UACvC,GAAG,MACD,6EACF,EAAE,IAAI,OAAO,UAAU,OAAO,SAAS,OAAO,SAAS,UAAU,UAAU,QAAQ;AAAA,QACrF;AAAA,MACF,EAAO;AAAA,QACL,WAAW,OAAO,YAAY;AAAA,UAC5B,IAAI,eAAiC,CAAC;AAAA,UACtC,IAAI;AAAA,YACF,MAAM,SAAS,KAAK,MAAM,OAAO,IAAI,gBAAgB,IAAI,CAAC;AAAA,YAC1D,IAAI,MAAM,QAAQ,MAAM;AAAA,cAAG,eAAe;AAAA,YAC1C,MAAM;AAAA,YACN,eAAe,CAAC;AAAA;AAAA,UAElB,WAAW,eAAe,cAAc;AAAA,YACtC,KAAK,aAAa;AAAA,cAAQ;AAAA,YAC1B,GAAG,MACD,6EACF,EAAE,IACA,OAAO,IAAI,EAAE,GACb,YAAY,QACZ,YAAY,SAAS,UAAU,UAAU,QAC3C;AAAA,UACF;AAAA,QACF;AAAA;AAAA,KAEH,EAAE;AAAA,YACH;AAAA,IACA,GAAG,KAAK,yBAAyB,sBAAsB,OAAO,OAAO;AAAA;AAEzE,EAAO;AAAA,EACL,2BAA2B,YAAY;AAAA,EACvC,wBAAwB;AAAA;AAK1B,KAAK,aAAa,YAAY,EAAE,IAAI,YAAY,GAAG;AAAA,EACjD,GAAG,KAAK,8EAA8E;AACxF;AACA,KAAK,aAAa,YAAY,EAAE,IAAI,aAAa,GAAG;AAAA,EAClD,GAAG,KAAK,+EAA+E;AACzF;AACA,KAAK,aAAa,YAAY,EAAE,IAAI,iBAAiB,GAAG;AAAA,EACtD,GAAG,KAAK,mFAAmF;AAC7F;AACA,KAAK,aAAa,YAAY,EAAE,IAAI,uBAAuB,GAAG;AAAA,EAC5D,GAAG,KAAK,8DAA8D;AACxE;AACA,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CASP;AA4BD,SAAS,cAAc,CAAC,WAAqD;AAAA,EAC3E,OAAO,YAAY,UAAU,MAAM,GAAG,CAAC,IAAI;AAAA;AAG7C,SAAS,oBAAoB,CAAC,SAAmC;AAAA,EAC/D,OAAO,GACJ,MACC,2EACF,EACC,IAAI,OAAO,EACX,IAAI,CAAC,SAAS,EAAE,QAAQ,IAAI,SAAS,MAAM,IAAI,KAAK,EAAE;AAAA;AAG3D,SAAS,uBAAuB,GAAkC;AAAA,EAChE,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,OAAO,GACV,MACC,kEACF,EACC,IAAI;AAAA,EACP,WAAW,OAAO,MAAM;AAAA,IACtB,MAAM,eAAe,QAAQ,IAAI,IAAI,QAAQ,KAAK,CAAC;AAAA,IACnD,aAAa,KAAK,EAAE,QAAQ,IAAI,SAAS,MAAM,IAAI,KAAK,CAAC;AAAA,IACzD,QAAQ,IAAI,IAAI,UAAU,YAAY;AAAA,EACxC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,QAAQ,CAAC,GAAa,eAAe,qBAAqB,EAAE,EAAE,GAAa;AAAA,EAClF,MAAM,aAAa,oBAAoB;AAAA,IACrC,IAAI,EAAE;AAAA,IACN,MAAM,mBAAmB,EAAE,IAAI;AAAA,IAC/B,OAAQ,EAAE,SAA8B;AAAA,IACxC,QAAQ,gBAAgB,EAAE,eAAe;AAAA,EAC3C,CAAC;AAAA,EACD,OAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,MAAM,WAAW;AAAA,IACjB,aAAa,EAAE,eAAe;AAAA,IAC9B,OAAO,WAAW;AAAA,IAClB,cAAc,EAAE,cAAc;AAAA,IAC9B,eAAgB,EAAE,eAA+B;AAAA,IACjD,QAAQ,WAAW;AAAA,IACnB,WAAW,kBAAkB,WAAW,MAAM;AAAA,IAC9C;AAAA,IACA,WAAW,EAAE;AAAA,IACb,eAAe,EAAE,mBAAmB,IAAI,KAAK,EAAE,YAAY;AAAA,IAC3D,eAAe,EAAE,mBAAmB;AAAA,IACpC,QAAQ,EAAE,YAAY;AAAA,OAClB,EAAE,gBAAgB,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,IAClD,YAAY,yBAAyB,EAAE,UAAU;AAAA,IACjD,YAAY,yBAAyB,EAAE,WAAW;AAAA,EACpD;AAAA;AAGK,SAAS,wBAAwB,CAAC,OAAiC;AAAA,EACxE,OAAO,UAAU,WAAW,WAAW;AAAA;AAIlC,SAAS,aAAa,CAAC,OAA8C;AAAA,EAC1E,OAAO,MAAM,eAAe;AAAA;AAGvB,SAAS,wBAAwB,CAAC,OAAiC;AAAA,EACxE,OAAO,UAAU,WAAW,WAAW;AAAA;AAIlC,SAAS,cAAc,CAAC,OAA8C;AAAA,EAC3E,OAAO,MAAM,eAAe;AAAA;AAGvB,SAAS,kBAAkB,CAAC,OAAkC;AAAA,EACnE,OAAO,UAAU,aAAa,UAAU,WAAW,UAAU,YAAY,QAAQ;AAAA;AAG5E,SAAS,eAAe,CAAC,OAA+B;AAAA,EAC7D,OAAO,UAAU,SAAS,UAAU,aAAa,UAAU,WAAW,QAAQ;AAAA;AAGzE,SAAS,iBAAiB,CAAC,MAAuB;AAAA,EACvD,OAAO,SAAS;AAAA;AAGX,SAAS,cAAc,CAAC,OAGjB;AAAA,EACZ,OAAO,MAAM,SAAS,MAAM,cAAc,OAAO,UAAU;AAAA;AAGtD,SAAS,WAAW,CAAC,OAKjB;AAAA,EACT,IAAI,MAAM,SAAS;AAAA,IAAW,OAAO;AAAA,EACrC,IAAI,MAAM,SAAS;AAAA,IAAS,OAAO;AAAA,EACnC,IAAI,MAAM,SAAS,WAAW;AAAA,IAC5B,KAAK,MAAM;AAAA,MAAO,OAAO;AAAA,IACzB,IAAI,MAAM,WAAW;AAAA,MAAW,OAAO;AAAA,IACvC,IAAI,MAAM,cAAc;AAAA,MAAM,OAAO;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EACA,KAAK,MAAM;AAAA,IAAO,OAAO;AAAA,EACzB,IAAI,MAAM;AAAA,IAAQ,OAAO,MAAM;AAAA,EAC/B,OAAO,MAAM,cAAc,OAAO,YAAY;AAAA;AAGzC,SAAS,mBAAmB,CAAC,OAMuB;AAAA,EACzD,IAAI,MAAM,SAAS,aAAa,MAAM,OAAO,kBAAkB;AAAA,IAC7D,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,MAAM,SAAS;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,MAAM;AAAA,EAC5B,MAAM,OACJ,kBACC,MAAM,WAAW,WACd,UACA,MAAM,WAAW,aAAa,MAAM,WAAW,QAC7C,YACA,MAAM,SAAS,MAAM,cAAc,OACjC,UACA;AAAA,EAEV,IAAI,SAAS,SAAS;AAAA,IACpB,OAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO,MAAM,SAAS;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAM,WAAW,QAAQ,YAAa,MAAM,SAAS;AAAA,EACnE,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,QAAQ,YAAY;AAAA,IAC5B;AAAA,EACF;AAAA;AAGF,SAAS,eAAe,CAAC,OAAuB;AAAA,EAC9C,OAAO,MAAM,KAAK,EAAE,YAAY;AAAA;AAG3B,SAAS,WAAW,CAAC,GAAmB;AAAA,EAC7C,MAAM,aAAa,oBAAoB;AAAA,IACrC,IAAI,EAAE;AAAA,IACN,MAAM,mBAAmB,EAAE,IAAI;AAAA,IAC/B,OAAO,EAAE,SAAS;AAAA,IAClB,QAAQ,gBAAgB,EAAE,MAAM;AAAA,IAChC,WAAW,EAAE;AAAA,EACf,CAAC;AAAA,EACD,GAAG,YAAY,MAAM;AAAA,IACnB,GAAG,MACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0CAmBF,EAAE,IACA,EAAE,IACF,EAAE,OACF,WAAW,MACX,EAAE,eAAe,MACjB,WAAW,SAAS,MACpB,EAAE,gBAAgB,MAClB,EAAE,iBAAiB,MACnB,WAAW,QACX,EAAE,WACF,EAAE,iBAAiB,MACnB,EAAE,iBAAiB,MACnB,EAAE,SAAS,IAAI,GACf,EAAE,aAAa,IAAI,GACnB,yBAAyB,EAAE,UAAU,GACrC,yBAAyB,EAAE,UAAU,CACvC;AAAA,IACA,GAAG,MAAM,8CAA8C,EAAE,IAAI,EAAE,EAAE;AAAA,IACjE,WAAW,eAAe,EAAE,cAAc;AAAA,MACxC,GAAG,MAAM,kEAAkE,EAAE,IAC3E,EAAE,IACF,YAAY,QACZ,YAAY,IACd;AAAA,IACF;AAAA,IACA,MAAM,6BAA6B,EAAE,aAAa,KAChD,CAAC,gBAAgB,YAAY,SAAS,OACxC,GAAG;AAAA,IACH,IAAI,4BAA4B;AAAA,MAC9B,GAAG,MACD;AAAA;AAAA,sBAGF,EAAE,IAAI,4BAA4B,EAAE,EAAE;AAAA,IACxC;AAAA,GACD,EAAE;AAAA;AAGE,SAAS,UAAU,GAAe;AAAA,EACvC,MAAM,OAAO,GACV,MAAM,wDAAwD,EAC9D,IAAI;AAAA,EACP,MAAM,eAAe,wBAAwB;AAAA,EAC7C,OAAO,KAAK,IAAI,CAAC,QAAQ,SAAS,KAAK,aAAa,IAAI,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA;AAGjE,SAAS,QAAQ,CAAC,IAA6B;AAAA,EACpD,MAAM,IAAI,GAAG,MAAM,uCAAuC,EAAE,IAAI,EAAE;AAAA,EAClE,OAAO,IAAI,SAAS,CAAC,IAAI;AAAA;AAIpB,SAAS,sBAAsB,CAAC,QAAiC;AAAA,EACtE,MAAM,MAAM,GACT,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAQF,EACC,IAAI,kBAAkB,MAAM;AAAA,EAC/B,OAAO,MAAM,SAAS,GAAG,IAAI;AAAA;AAUxB,SAAS,oBAAoB,CAAC,IAA6B;AAAA,EAChE,IAAI,UAAU,SAAS,EAAE;AAAA,EACzB,KAAK;AAAA,IAAS,OAAO;AAAA,EAErB,MAAM,OAAO,IAAI,IAAY,CAAC,QAAQ,EAAE,CAAC;AAAA,EACzC,OAAO,QAAQ,kBAAkB,KAAK,IAAI,QAAQ,aAAa,GAAG;AAAA,IAChE,MAAM,SAAS,SAAS,QAAQ,aAAa;AAAA,IAC7C,KAAK;AAAA,MAAQ;AAAA,IACb,UAAU;AAAA,IACV,KAAK,IAAI,QAAQ,EAAE;AAAA,EACrB;AAAA,EAEA,OAAO;AAAA;AAIF,SAAS,cAAc,CAAC,OAAgC;AAAA,EAC7D,MAAM,IAAI,GAAG,MAAM,wDAAwD,EAAE,IAAI,KAAK;AAAA,EAGtF,OAAO,IAAI,SAAS,CAAC,IAAI;AAAA;AAGpB,SAAS,qBAAqB,CAAC,OAAe,MAAkC;AAAA,EACrF,MAAM,IAAI,GACP,MAAM,qEAAqE,EAC3E,IAAI,OAAO,IAAI;AAAA,EAClB,OAAO,IAAI,SAAS,CAAC,IAAI;AAAA;AAGpB,SAAS,sBAAsB,CACpC,OACA,MACA,OAAoC,CAAC,GACpB;AAAA,EACjB,MAAM,SAAS,gBAAgB,KAAK;AAAA,EACpC,MAAM,wBAAwB,WAAW,gBAAgB,gBAAgB;AAAA,EACzE,IAAI,yBAAyB,KAAK,mBAAmB,kBAAkB;AAAA,IACrE,MAAM,UAAU,GAAG,MAAM,uCAAuC,EAAE,IAAI,gBAAgB;AAAA,IAGtF,IAAI;AAAA,MAAS,OAAO,SAAS,OAAO;AAAA,EACtC;AAAA,EAEA,MAAM,SAAmB,CAAC,MAAM;AAAA,EAChC,IAAI,MAAM;AAAA,EACV,IAAI,SAAS,WAAW;AAAA,IACtB,OAAO;AAAA,IACP,OAAO,KAAK,MAAM,gBAAgB;AAAA,EACpC;AAAA,EACA,IAAI,KAAK,gBAAgB;AAAA,IACvB,OAAO;AAAA,IACP,OAAO,KAAK,KAAK,cAAc;AAAA,EACjC;AAAA,EACA,OAAO;AAAA,EACP,MAAM,MAAM,GAAG,MAA0B,GAAG,EAAE,IAAI,GAAG,MAAM;AAAA,EAC3D,OAAO,MAAM,SAAS,GAAG,IAAI;AAAA;AAIxB,SAAS,qBAAqB,CAAC,OAAe,QAAiC;AAAA,EACpF,MAAM,UAAU,MAAM,KAAK;AAAA,EAC3B,MAAM,YAAY,kCAAkC,KAAK,OAAO;AAAA,EAChE,MAAM,gBAAgB,YAAY,mBAAmB,UAAU,IAAI,YAAY,CAAC,IAAI;AAAA,EACpF,MAAM,iBAAiB,YAAY,UAAU,GAAI,KAAK,IAAI;AAAA,EAC1D,MAAM,OAAO,GACV,MACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAOF,EACC,IAAI,gBAAgB,kBAAkB,MAAM;AAAA,EAC/C,MAAM,UAAU,gBAAgB,KAAK,OAAO,CAAC,QAAQ,IAAI,SAAS,aAAa,IAAI;AAAA,EACnF,OAAO,QAAQ,WAAW,IAAI,SAAS,QAAQ,EAAG,IAAI;AAAA;AAIjD,SAAS,iBAAiB,CAC/B,SACA,WACA,UAAkC,CAAC,GAC7B;AAAA,EACN,MAAM,WAAW,kBAAkB,OAAO;AAAA,EAC1C,MAAM,SAAS,GACZ,MAAM,mDAAmD,EACzD,IAAI,WAAW,OAAO;AAAA,EACzB,MAAM,UAAU,OAAO,OAAO,WAAW,CAAC;AAAA,EAC1C,MAAM,aAAa;AAAA,IACjB;AAAA,IACA,mBAAmB,eAAe,QAAQ;AAAA,IAC1C,WAAW,eAAe,SAAS;AAAA,IACnC,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,EACjB;AAAA,EACA,IAAI,YAAY,GAAG;AAAA,IACjB,OAAO,KAAK,YAAY,0CAA0C;AAAA,EACpE,EAAO,SAAI,aAAa,WAAW;AAAA,IACjC,OAAO,MAAM,YAAY,8BAA8B;AAAA,EACzD,EAAO;AAAA,IACL,OAAO,MAAM,YAAY,gCAAgC;AAAA;AAAA;AAKtD,SAAS,mBAAmB,CAAC,SAAiB,SAAS,eAAqB;AAAA,EACjF,MAAM,WAAW,kBAAkB,OAAO;AAAA,EAC1C,MAAM,SAAS,GAAG,MAAM,sDAAsD,EAAE,IAAI,OAAO;AAAA,EAC3F,MAAM,UAAU,OAAO,OAAO,WAAW,CAAC;AAAA,EAC1C,MAAM,aAAa,EAAE,SAAS,mBAAmB,eAAe,QAAQ,GAAG,OAAO;AAAA,EAClF,IAAI,YAAY,GAAG;AAAA,IACjB,OAAO,KAAK,YAAY,yCAAyC;AAAA,EACnE,EAAO,SAAI,UAAU;AAAA,IACnB,OAAO,KAAK,YAAY,8BAA8B;AAAA,EACxD,EAAO;AAAA,IACL,OAAO,MAAM,YAAY,oCAAoC;AAAA;AAAA;AAK1D,SAAS,iBAAiB,CAAC,SAAgC;AAAA,EAChE,MAAM,IAAI,GACP,MAA6C,gDAAgD,EAC7F,IAAI,OAAO;AAAA,EACd,OAAO,GAAG,cAAc;AAAA;AAQnB,SAAS,WAAW,CAAC,IAAY,UAAsC,CAAC,GAAY;AAAA,EACzF,MAAM,IAAI,GACP,MAA4C,8CAA8C,EAC1F,IAAI,EAAE;AAAA,EACT,KAAK;AAAA,IAAG,OAAO;AAAA,EACf,IAAI,OAAO,oBAAqB,EAAE,SAAS,cAAc,QAAQ;AAAA,IAAe,OAAO;AAAA,EACvF,GAAG,MAAM,qCAAqC,EAAE,IAAI,EAAE;AAAA,EACtD,OAAO;AAAA;AAQF,SAAS,qBAAqB,CACnC,gBACA,0BACU;AAAA,EACV,MAAM,OAAO,GACV,MAA8B,qDAAqD,EACnF,IAAI,cAAc;AAAA,EACrB,IAAI,KAAK,WAAW;AAAA,IAAG,OAAO,CAAC;AAAA,EAC/B,GAAG,MAAM,qEAAqE,EAAE,IAC9E,0BACA,cACF;AAAA,EACA,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE;AAAA;AAG1B,SAAS,kBAAkB,CAChC,SACA,QACA,MACS;AAAA,EACT,KAAK,GAAG,MAAM,uCAAuC,EAAE,IAAI,OAAO;AAAA,IAAG,OAAO;AAAA,EAC5E,GAAG,MAAM,4EAA4E,EAAE,IACrF,SACA,QACA,IACF;AAAA,EACA,OAAO;AAAA;AAGF,SAAS,uBAAuB,CAAC,SAAiB,QAAyB;AAAA,EAChF,KAAK,GAAG,MAAM,uCAAuC,EAAE,IAAI,OAAO;AAAA,IAAG,OAAO;AAAA,EAC5E,GAAG,MAAM,8DAA8D,EAAE,IAAI,SAAS,MAAM;AAAA,EAC5F,OAAO;AAAA;",
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "4CD1739060477B3C64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
|
@@ -28,7 +28,7 @@ async function spawnNodeDaemon(port) {
|
|
|
28
28
|
const entry = process.argv[1];
|
|
29
29
|
if (!entry)
|
|
30
30
|
throw new Error("cannot locate the Negotium CLI entrypoint");
|
|
31
|
-
const { LOG_DIR } = await import("./chunk-
|
|
31
|
+
const { LOG_DIR } = await import("./chunk-ka8rv918.js");
|
|
32
32
|
const child = Bun.spawn({
|
|
33
33
|
cmd: [process.execPath, entry, "__node-daemon", `--port=${port}`],
|
|
34
34
|
detached: true,
|
|
@@ -45,11 +45,11 @@ async function spawnNodeDaemon(port) {
|
|
|
45
45
|
async function runDaemonChild(args) {
|
|
46
46
|
const parsed = Number.parseInt(option(args, "port") ?? "0", 10);
|
|
47
47
|
const port = Number.isInteger(parsed) && parsed >= 0 ? parsed : 0;
|
|
48
|
-
const { runNodeDaemon } = await import("./chunk-
|
|
48
|
+
const { runNodeDaemon } = await import("./chunk-q00djwra.js");
|
|
49
49
|
await runNodeDaemon({ port });
|
|
50
50
|
}
|
|
51
51
|
async function ensureLocalNode(port) {
|
|
52
|
-
const { inspectNodeDaemon, waitForNodeDaemon } = await import("./chunk-
|
|
52
|
+
const { inspectNodeDaemon, waitForNodeDaemon } = await import("./chunk-q00djwra.js");
|
|
53
53
|
const deadline = Date.now() + 15000;
|
|
54
54
|
let lastError = "node did not become ready";
|
|
55
55
|
while (Date.now() < deadline) {
|
|
@@ -80,11 +80,11 @@ async function runTerminalCli(args = process.argv.slice(2)) {
|
|
|
80
80
|
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
81
81
|
throw new Error("terminal-adapter requires an interactive TTY");
|
|
82
82
|
}
|
|
83
|
-
const { startTerminalAdapter } = await import("./chunk-
|
|
83
|
+
const { startTerminalAdapter } = await import("./chunk-gsk494xn.js");
|
|
84
84
|
let client;
|
|
85
85
|
if (!options.embedded) {
|
|
86
|
-
const { NODE_CONTROL_TOKEN } = await import("./chunk-
|
|
87
|
-
const { RemoteNegotiumClient } = await import("./chunk-
|
|
86
|
+
const { NODE_CONTROL_TOKEN } = await import("./chunk-ka8rv918.js");
|
|
87
|
+
const { RemoteNegotiumClient } = await import("./chunk-cphmr4g4.js");
|
|
88
88
|
const connection = options.connect ? {
|
|
89
89
|
baseUrl: options.connect,
|
|
90
90
|
token: process.env.NEGOTIUM_CONTROL_TOKEN?.trim() || NODE_CONTROL_TOKEN
|