@wrongstack/core 0.265.1 → 0.268.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/{agent-bridge-DrkBxszZ.d.ts → agent-bridge-UhojbpWx.d.ts} +1 -1
  2. package/dist/{agent-subagent-runner-DM2pP-B6.d.ts → agent-subagent-runner-Bvtf1o9K.d.ts} +25 -7
  3. package/dist/{brain-BXd_61kQ.d.ts → brain-69wzMKp1.d.ts} +73 -1
  4. package/dist/{compactor-B8pOf45Y.d.ts → compactor-CBQAJoDc.d.ts} +19 -1
  5. package/dist/{config-BMCj_XDs.d.ts → config-VKfOZ-6X.d.ts} +122 -3
  6. package/dist/{context-MRk5PhNv.d.ts → context-C0U8B9NF.d.ts} +88 -1
  7. package/dist/coordination/index.d.ts +57 -161
  8. package/dist/coordination/index.js +471 -177
  9. package/dist/coordination/index.js.map +1 -1
  10. package/dist/defaults/index.d.ts +26 -25
  11. package/dist/defaults/index.js +1818 -844
  12. package/dist/defaults/index.js.map +1 -1
  13. package/dist/execution/index.d.ts +72 -16
  14. package/dist/execution/index.js +1270 -265
  15. package/dist/execution/index.js.map +1 -1
  16. package/dist/execution/prompt-enhancer.d.ts +1 -1
  17. package/dist/extension/index.d.ts +7 -6
  18. package/dist/global-mailbox-KByEFFBa.d.ts +663 -0
  19. package/dist/{goal-preamble-DvHDSKSe.d.ts → goal-preamble-CrYjmdw4.d.ts} +28 -11
  20. package/dist/{goal-store-DtLMySNb.d.ts → goal-store-Y_zdLZ3q.d.ts} +1 -1
  21. package/dist/hq/index.d.ts +195 -0
  22. package/dist/hq/index.js +1884 -0
  23. package/dist/hq/index.js.map +1 -0
  24. package/dist/index-BfaS-f_m.d.ts +82 -0
  25. package/dist/{index-B-ch8K9C.d.ts → index-CtQnmkaS.d.ts} +8 -8
  26. package/dist/{index-CEDeNodM.d.ts → index-gCv830d7.d.ts} +5 -5
  27. package/dist/index.d.ts +124 -47
  28. package/dist/index.js +5600 -2662
  29. package/dist/index.js.map +1 -1
  30. package/dist/infrastructure/index.d.ts +6 -6
  31. package/dist/infrastructure/index.js +117 -19
  32. package/dist/infrastructure/index.js.map +1 -1
  33. package/dist/kernel/index.d.ts +10 -9
  34. package/dist/kernel/index.js.map +1 -1
  35. package/dist/{pipeline-DPDxH_7m.d.ts → mailbox-types-Ct2hJq0P.d.ts} +1 -244
  36. package/dist/{mcp-servers-2x4w6Jn9.d.ts → mcp-servers-HT3Fi7Bl.d.ts} +10 -4
  37. package/dist/models/index.d.ts +5 -5
  38. package/dist/models/index.js +33 -3
  39. package/dist/models/index.js.map +1 -1
  40. package/dist/{models-registry-DmJlKuNp.d.ts → models-registry-Bvcl3Vaa.d.ts} +1 -1
  41. package/dist/{multi-agent-coordinator-DyCkCZnU.d.ts → multi-agent-coordinator-BACjsmkC.d.ts} +1 -1
  42. package/dist/{null-fleet-bus-CG9QY2aP.d.ts → null-fleet-bus-DA7fvhUg.d.ts} +14 -9
  43. package/dist/observability/index.d.ts +2 -2
  44. package/dist/{parallel-eternal-engine-Jw9uhEoT.d.ts → parallel-eternal-engine-Ci71gYu_.d.ts} +11 -15
  45. package/dist/{path-resolver-Dy2ej-gE.d.ts → path-resolver-O1IJnmKE.d.ts} +4 -3
  46. package/dist/{permission-B9SB45lp.d.ts → permission-Bd-57Lbl.d.ts} +1 -1
  47. package/dist/{permission-policy-CkjSXabK.d.ts → permission-policy-uNXC6Kge.d.ts} +2 -3
  48. package/dist/pipeline-BDNvENyV.d.ts +245 -0
  49. package/dist/{plan-templates-CzD9GnAU.d.ts → plan-templates-EMsalEtN.d.ts} +5 -5
  50. package/dist/{llm-selector-C0tfTCUe.d.ts → provider-model-resolve-CEb9x886.d.ts} +40 -3
  51. package/dist/{provider-runner-DMa70ODu.d.ts → provider-runner-DWJbpo70.d.ts} +3 -3
  52. package/dist/{retry-policy-CN0khdlj.d.ts → retry-policy-C3s_lvdK.d.ts} +1 -1
  53. package/dist/sdd/index.d.ts +9 -8
  54. package/dist/sdd/index.js +44 -14
  55. package/dist/sdd/index.js.map +1 -1
  56. package/dist/{secret-vault-B2yw84VT.d.ts → secret-vault-Cgduf5xL.d.ts} +2 -2
  57. package/dist/security/index.d.ts +5 -67
  58. package/dist/security/index.js +129 -99
  59. package/dist/security/index.js.map +1 -1
  60. package/dist/{selector-CzHh_igB.d.ts → selector-47LBnBVk.d.ts} +1 -1
  61. package/dist/{session-event-bridge-BUI6Jf-4.d.ts → session-event-bridge-Cw7oqmW2.d.ts} +1 -1
  62. package/dist/{session-reader-CMgdMSRP.d.ts → session-reader-DD4v2Obw.d.ts} +1 -1
  63. package/dist/storage/index.d.ts +14 -12
  64. package/dist/storage/index.js +144 -120
  65. package/dist/storage/index.js.map +1 -1
  66. package/dist/tools/index.d.ts +4 -2
  67. package/dist/tools/index.js +166 -31
  68. package/dist/tools/index.js.map +1 -1
  69. package/dist/types/index.d.ts +20 -19
  70. package/dist/types/index.js +1358 -476
  71. package/dist/types/index.js.map +1 -1
  72. package/dist/utils/index.d.ts +472 -405
  73. package/dist/utils/index.js +2321 -1193
  74. package/dist/utils/index.js.map +1 -1
  75. package/package.json +5 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hq/protocol.ts","../../src/security/secret-scrubber.ts","../../src/hq/redaction.ts","../../src/hq/mailbox-mapper.ts","../../src/hq/publisher.ts","../../src/utils/atomic-write.ts","../../src/utils/wstack-paths.ts","../../src/coordination/mailbox-types.ts","../../src/coordination/global-mailbox.ts","../../src/hq/auth-store.ts","../../src/hq/factory.ts"],"names":["redacted","out","path","fs","stat","resolve","path2","randomUUID","path4","fs2","fs3","createHash","basename"],"mappings":"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","file":"index.js","sourcesContent":["export const HQ_PROTOCOL_VERSION = 1 as const;\n\nexport type HqProtocolVersion = typeof HQ_PROTOCOL_VERSION;\n\nexport type HqClientKind = 'tui' | 'repl' | 'webui' | 'cli' | 'unknown';\n\nexport type HqWorkspaceKind = 'git' | 'directory' | 'unknown';\n\nexport type HqProjectStatus = 'active' | 'idle' | 'stale' | 'error';\n\nexport type HqClientCapability =\n | 'telemetry.publish'\n | 'session.summary'\n | 'fleet.summary'\n | 'mailbox.summary'\n | 'control.receive';\n\nexport type HqToolArgsPolicy = 'none' | 'summary' | 'redacted';\n\nexport type HqPathPolicy = 'none' | 'project-relative' | 'redacted' | 'full';\n\nexport interface HqRedactionPolicy {\n rawContent: boolean;\n toolArgs: HqToolArgsPolicy;\n paths: HqPathPolicy;\n}\n\nexport const DEFAULT_HQ_REDACTION_POLICY: HqRedactionPolicy = {\n rawContent: false,\n toolArgs: 'summary',\n paths: 'project-relative',\n};\n\nexport interface HqClientIdentity {\n clientId: string;\n kind: HqClientKind;\n version?: string;\n machineId: string;\n hostname?: string;\n pid?: number;\n startedAt: string;\n}\n\nexport interface HqProjectIdentity {\n projectId: string;\n projectRoot: string;\n projectName: string;\n gitRemote?: string;\n gitBranch?: string;\n machineId: string;\n workspaceKind: HqWorkspaceKind;\n}\n\nexport interface HqClientHelloPayload {\n protocolVersion: HqProtocolVersion;\n client: HqClientIdentity;\n project: HqProjectIdentity;\n capabilities: readonly HqClientCapability[];\n}\n\nexport interface HqWelcomePayload {\n type: 'hq.welcome';\n protocolVersion: HqProtocolVersion;\n serverTime: string;\n acceptedCapabilities: readonly HqClientCapability[];\n redactionPolicy: HqRedactionPolicy;\n}\n\nexport interface HqEventEnvelope<TPayload = unknown> {\n id: string;\n type: HqEventType | (string & {});\n schemaVersion: HqProtocolVersion;\n timestamp: string;\n clientId: string;\n projectId: string;\n sessionId?: string;\n runId?: string;\n seq: number;\n payload: TPayload;\n}\n\nexport type HqEventType =\n | 'client.hello'\n | 'client.heartbeat'\n | 'session.started'\n | 'session.status'\n | 'session.usage'\n | 'tool.started'\n | 'tool.completed'\n | 'fleet.snapshot'\n | 'fleet.event'\n | 'mailbox.snapshot'\n | 'mailbox.event'\n | 'worklist.snapshot'\n | 'git.snapshot';\n\nexport interface HqClientHeartbeatPayload {\n uptimeMs: number;\n activeSessionId?: string;\n activeRunId?: string;\n status: HqProjectStatus;\n activeSubagents?: number;\n queuedTasks?: number;\n}\n\nexport type HqSessionStatus = 'idle' | 'running' | 'paused' | 'completed' | 'failed';\n\nexport interface HqSessionStartedPayload {\n sessionId: string;\n provider?: string;\n model?: string;\n startedAt: string;\n}\n\nexport interface HqSessionStatusPayload {\n status: HqSessionStatus;\n phase?: string;\n message?: string;\n}\n\nexport interface HqUsagePayload {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n costUsd?: number;\n durationMs?: number;\n}\n\nexport interface HqToolStartedPayload {\n toolName: string;\n capabilities?: readonly string[];\n risk?: string;\n inputSummary?: unknown;\n}\n\nexport interface HqToolCompletedPayload {\n toolName: string;\n status: 'success' | 'error' | 'timeout' | 'cancelled';\n durationMs: number;\n outputSummary?: unknown;\n errorClass?: string;\n}\n\nexport interface HqSubagentSummary {\n subagentId: string;\n role?: string;\n status: 'pending' | 'running' | 'idle' | 'completed' | 'failed' | 'stopped';\n task?: string;\n currentTool?: string;\n runtimeMs?: number;\n costUsd?: number;\n lastActivityAt?: string;\n}\n\nexport interface HqFleetSnapshotPayload {\n runId: string;\n activeSubagents: number;\n queuedTasks: number;\n completedTasks: number;\n failedTasks: number;\n totalCostUsd?: number;\n subagents: readonly HqSubagentSummary[];\n}\n\nexport interface HqFleetEventPayload {\n runId: string;\n subagentId?: string;\n event: string;\n summary?: string;\n data?: unknown;\n}\n\nexport type HqMailboxMessageType =\n | 'note'\n | 'ask'\n | 'assign'\n | 'steer'\n | 'btw'\n | 'broadcast'\n | 'status'\n | 'result'\n | 'control';\n\nexport type HqMailboxPriority = 'low' | 'normal' | 'high';\n\nexport type HqMailboxAgentStatus =\n | 'idle'\n | 'running'\n | 'streaming'\n | 'waiting_user'\n | 'error'\n | 'offline';\n\nexport interface HqMailboxMessageSummary {\n messageId: string;\n from: string;\n to: string;\n type: HqMailboxMessageType;\n subject: string;\n priority: HqMailboxPriority;\n timestamp: string;\n replyTo?: string;\n senderSessionId?: string;\n completed: boolean;\n completedBy?: string;\n completedAt?: string;\n unreadCount?: number;\n readCount?: number;\n hasBody: boolean;\n bodyPreview?: string;\n outcomePreview?: string;\n task?: {\n taskId?: string;\n agentRole?: string;\n agentName?: string;\n status?: 'pending' | 'in_progress' | 'completed' | 'failed';\n };\n}\n\nexport interface HqMailboxAgentSummary {\n agentId: string;\n name: string;\n role?: string;\n sessionId: string;\n status: HqMailboxAgentStatus;\n currentTool?: string;\n currentTask?: string;\n iterations: number;\n toolCalls: number;\n lastActivityAt: string;\n lastSeenAt: string;\n online: boolean;\n source?: 'cli' | 'webui' | 'mcp' | 'acp';\n}\n\nexport interface HqMailboxSnapshotPayload {\n mailboxId: string;\n scope: 'project' | 'global';\n messages: readonly HqMailboxMessageSummary[];\n agents: readonly HqMailboxAgentSummary[];\n totals: {\n messages: number;\n unread: number;\n incomplete: number;\n highPriority: number;\n onlineAgents: number;\n };\n}\n\nexport interface HqMailboxEventPayload {\n mailboxId: string;\n action:\n | 'message.sent'\n | 'message.read'\n | 'message.completed'\n | 'message.updated'\n | 'agent.registered'\n | 'agent.heartbeat'\n | 'agent.offline';\n message?: HqMailboxMessageSummary;\n agent?: HqMailboxAgentSummary;\n summary?: string;\n}\n\nexport interface HqWorklistSnapshotPayload {\n todos?: HqWorklistCounts;\n tasks?: HqWorklistCounts;\n plans?: HqWorklistCounts;\n activeItem?: string;\n}\n\nexport interface HqWorklistCounts {\n total: number;\n pending: number;\n inProgress: number;\n completed: number;\n failed?: number;\n}\n\nexport interface HqGitSnapshotPayload {\n branch?: string;\n dirtyFiles?: number;\n stagedFiles?: number;\n ahead?: number;\n behind?: number;\n}\n\nexport interface HqClientRecord {\n clientId: string;\n kind: HqClientKind;\n machineId: string;\n hostname?: string;\n pid?: number;\n version?: string;\n connected: boolean;\n connectedAt?: string;\n lastSeenAt: string;\n projectId: string;\n sessionId?: string;\n capabilities: readonly HqClientCapability[];\n}\n\nexport interface HqProjectRecord {\n projectId: string;\n projectName: string;\n projectRootDisplay: string;\n machineIds: readonly string[];\n gitBranch?: string;\n activeClients: number;\n activeSessions: number;\n activeSubagents: number;\n totalCostUsd: number;\n lastActivityAt: string;\n status: HqProjectStatus;\n}\n\nexport interface HqSessionSummary {\n sessionId: string;\n projectId: string;\n clientId: string;\n status: HqSessionStatus;\n provider?: string;\n model?: string;\n startedAt?: string;\n lastActivityAt: string;\n costUsd?: number;\n}\n\nexport interface HqFleetSummary {\n runId: string;\n projectId: string;\n clientId: string;\n activeSubagents: number;\n queuedTasks: number;\n completedTasks: number;\n failedTasks: number;\n totalCostUsd?: number;\n lastActivityAt: string;\n}\n\nexport interface HqMailboxSummary {\n mailboxId: string;\n projectId: string;\n scope: 'project' | 'global';\n messageCount: number;\n unreadCount: number;\n incompleteCount: number;\n highPriorityCount: number;\n onlineAgentCount: number;\n lastActivityAt: string;\n}\n\nexport interface HqSnapshot {\n generatedAt: string;\n clients: readonly HqClientRecord[];\n projects: readonly HqProjectRecord[];\n sessions: readonly HqSessionSummary[];\n fleets: readonly HqFleetSummary[];\n mailboxes: readonly HqMailboxSummary[];\n totals: {\n activeProjects: number;\n activeClients: number;\n activeSessions: number;\n activeSubagents: number;\n unreadMailboxMessages: number;\n incompleteMailboxMessages: number;\n totalCostUsd: number;\n };\n}\n\nexport interface HqBrowserSnapshotMessage {\n type: 'hq.snapshot';\n snapshot: HqSnapshot;\n}\n\nexport interface HqBrowserEventMessage<TPayload = unknown> {\n type: 'hq.event';\n event: HqEventEnvelope<TPayload>;\n}\n\nexport interface HqAlertMessage {\n type: 'hq.alert';\n severity: 'info' | 'warn' | 'error';\n message: string;\n timestamp: string;\n}\n\nexport type HqBrowserMessage = HqBrowserSnapshotMessage | HqBrowserEventMessage | HqAlertMessage;\n\nexport interface HqClientHelloMessage {\n type: 'client.hello';\n payload: HqClientHelloPayload;\n}\n\nexport interface HqClientEventMessage<TPayload = unknown> {\n type: 'client.event';\n event: HqEventEnvelope<TPayload>;\n}\n\nexport interface HqClientCommandPollMessage {\n type: 'client.command_poll';\n clientId: string;\n projectId: string;\n afterCommandId?: string;\n limit?: number;\n}\n\nexport interface HqClientCommandAckMessage {\n type: 'client.command_ack';\n clientId: string;\n projectId: string;\n commandId: string;\n status: 'accepted' | 'completed' | 'failed' | 'rejected';\n message?: string;\n}\n\nexport interface HqQueuedCommand {\n commandId: string;\n type: string;\n createdAt: string;\n payload: unknown;\n requiresAck?: boolean;\n}\n\nexport interface HqServerCommandBatchMessage {\n type: 'hq.command_batch';\n commands: readonly HqQueuedCommand[];\n}\n\nexport type HqClientMessage =\n | HqClientHelloMessage\n | HqClientEventMessage\n | HqClientCommandPollMessage\n | HqClientCommandAckMessage;\n\nexport type HqServerMessage = HqServerCommandBatchMessage | HqWelcomePayload;\n\n/**\n * Discriminated parse result for {@link parseHqFrame}. The `reason` field\n * is only present when `ok` is `false`; consumers should narrow on `ok`\n * before accessing `frame` or `reason`.\n */\nexport type HqParseResult =\n | { ok: true; frame: HqClientMessage }\n | { ok: false; reason: 'invalid-json' | 'unknown-type' | 'malformed' };\n\n/** Known client → server frame `type` discriminators. */\nconst KNOWN_HQ_CLIENT_FRAME_TYPES = new Set<HqClientMessage['type']>([\n 'client.hello',\n 'client.event',\n 'client.command_poll',\n 'client.command_ack',\n]);\n\n/** Top-level object + string `type` guard. */\nfunction hasStringType(x: unknown): x is { type: string } {\n return typeof x === 'object' && x !== null && typeof (x as { type?: unknown }).type === 'string';\n}\n\nfunction isHqClientIdentity(x: unknown): x is HqClientIdentity {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n return (\n typeof v.clientId === 'string' &&\n typeof v.kind === 'string' &&\n typeof v.machineId === 'string' &&\n typeof v.startedAt === 'string'\n );\n}\n\nfunction isHqProjectIdentity(x: unknown): x is HqProjectIdentity {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n return (\n typeof v.projectId === 'string' &&\n typeof v.projectRoot === 'string' &&\n typeof v.projectName === 'string' &&\n typeof v.machineId === 'string' &&\n typeof v.workspaceKind === 'string'\n );\n}\n\nfunction isHqClientHelloPayload(x: unknown): x is HqClientHelloPayload {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n return (\n typeof v.protocolVersion === 'number' &&\n isHqClientIdentity(v.client) &&\n isHqProjectIdentity(v.project) &&\n Array.isArray(v.capabilities)\n );\n}\n\nfunction isHqEventEnvelope(x: unknown): x is HqEventEnvelope {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n return (\n typeof v.id === 'string' &&\n typeof v.type === 'string' &&\n typeof v.schemaVersion === 'number' &&\n typeof v.timestamp === 'string' &&\n typeof v.clientId === 'string' &&\n typeof v.projectId === 'string' &&\n typeof v.seq === 'number'\n );\n}\n\nfunction isHqClientCommandPollMessage(x: unknown): x is HqClientCommandPollMessage {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n return typeof v.clientId === 'string' && typeof v.projectId === 'string';\n}\n\nfunction isHqClientCommandAckMessage(x: unknown): x is HqClientCommandAckMessage {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n return (\n typeof v.clientId === 'string' &&\n typeof v.projectId === 'string' &&\n typeof v.commandId === 'string' &&\n typeof v.status === 'string'\n );\n}\n\n/**\n * Strictly parse a raw client → server frame into a {@link HqParseResult}.\n *\n * Validates, in order:\n * 1. JSON syntax (`invalid-json` on failure)\n * 2. Top-level object with string `type` discriminator\n * 3. `type` is one of {@link HqClientMessage} union members (`unknown-type`)\n * 4. Per-type field-shape presence checks (`malformed` on failure)\n *\n * On success, `frame` is narrowed to {@link HqClientMessage} and consumers\n * can switch on `frame.type` for type-safe access to per-union-member\n * fields without `as` casts.\n */\nexport function parseHqFrame(raw: string | Buffer): HqParseResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(typeof raw === 'string' ? raw : raw.toString('utf8'));\n } catch {\n return { ok: false, reason: 'invalid-json' };\n }\n\n if (!hasStringType(parsed)) {\n return { ok: false, reason: 'malformed' };\n }\n const obj = parsed as { type: string } & Record<string, unknown>;\n\n if (!KNOWN_HQ_CLIENT_FRAME_TYPES.has(obj.type as HqClientMessage['type'])) {\n return { ok: false, reason: 'unknown-type' };\n }\n\n switch (obj.type as HqClientMessage['type']) {\n case 'client.hello':\n if (!isHqClientHelloPayload(obj.payload)) {\n return { ok: false, reason: 'malformed' };\n }\n return { ok: true, frame: { type: 'client.hello', payload: obj.payload } };\n case 'client.event':\n if (!isHqEventEnvelope(obj.event)) {\n return { ok: false, reason: 'malformed' };\n }\n return { ok: true, frame: { type: 'client.event', event: obj.event } };\n case 'client.command_poll':\n if (!isHqClientCommandPollMessage(obj)) {\n return { ok: false, reason: 'malformed' };\n }\n return {\n ok: true,\n frame: { type: 'client.command_poll', clientId: obj.clientId, projectId: obj.projectId },\n };\n case 'client.command_ack':\n if (!isHqClientCommandAckMessage(obj)) {\n return { ok: false, reason: 'malformed' };\n }\n return {\n ok: true,\n frame: {\n type: 'client.command_ack',\n clientId: obj.clientId,\n projectId: obj.projectId,\n commandId: obj.commandId,\n status: obj.status as HqClientCommandAckMessage['status'],\n },\n };\n default: {\n // Unreachable: KNOWN_HQ_CLIENT_FRAME_TYPES membership guarantees\n // `obj.type` is one of the cases above. Return `unknown-type` defensively\n // to satisfy the return type if a future HqClientMessage union member\n // is added without updating this switch.\n const _exhaustive: never = obj.type as never;\n return _exhaustive;\n }\n }\n}\n\n/** Known `client.event` envelope event types whose payload shape we validate. */\nconst KNOWN_HQ_EVENT_PAYLOAD_TYPES = new Set<string>(['mailbox.snapshot', 'mailbox.event']);\n\nfunction isHqMailboxMessageSummary(x: unknown): x is HqMailboxMessageSummary {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n return (\n typeof v.messageId === 'string' &&\n typeof v.from === 'string' &&\n typeof v.to === 'string' &&\n typeof v.subject === 'string' &&\n typeof v.priority === 'string' &&\n typeof v.timestamp === 'string' &&\n typeof v.completed === 'boolean' &&\n typeof v.hasBody === 'boolean'\n );\n}\n\nfunction isHqMailboxAgentSummary(x: unknown): x is HqMailboxAgentSummary {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n return (\n typeof v.agentId === 'string' &&\n typeof v.name === 'string' &&\n typeof v.sessionId === 'string' &&\n typeof v.status === 'string' &&\n typeof v.iterations === 'number' &&\n typeof v.toolCalls === 'number' &&\n typeof v.lastActivityAt === 'string' &&\n typeof v.lastSeenAt === 'string' &&\n typeof v.online === 'boolean'\n );\n}\n\nfunction isHqMailboxSnapshotPayload(x: unknown): x is HqMailboxSnapshotPayload {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n if (\n typeof v.mailboxId !== 'string' ||\n (v.scope !== 'project' && v.scope !== 'global') ||\n !Array.isArray(v.messages) ||\n !Array.isArray(v.agents) ||\n typeof v.totals !== 'object' ||\n v.totals === null\n ) {\n return false;\n }\n const totals = v.totals as Record<string, unknown>;\n if (\n typeof totals.messages !== 'number' ||\n typeof totals.unread !== 'number' ||\n typeof totals.incomplete !== 'number' ||\n typeof totals.highPriority !== 'number' ||\n typeof totals.onlineAgents !== 'number'\n ) {\n return false;\n }\n for (const message of v.messages) {\n if (!isHqMailboxMessageSummary(message)) return false;\n }\n for (const agent of v.agents) {\n if (!isHqMailboxAgentSummary(agent)) return false;\n }\n return true;\n}\n\nconst HQ_MAILBOX_EVENT_ACTIONS = new Set<string>([\n 'message.sent',\n 'message.read',\n 'message.completed',\n 'message.updated',\n 'agent.registered',\n 'agent.heartbeat',\n 'agent.offline',\n]);\n\nfunction isHqMailboxEventPayload(x: unknown): x is HqMailboxEventPayload {\n if (typeof x !== 'object' || x === null) return false;\n const v = x as Record<string, unknown>;\n if (typeof v.mailboxId !== 'string') return false;\n if (typeof v.action !== 'string' || !HQ_MAILBOX_EVENT_ACTIONS.has(v.action)) return false;\n // `message` and `agent` are optional but, when present, must satisfy\n // their respective shape guard so a downstream consumer can rely on\n // the typed fields.\n if (v.message !== undefined && !isHqMailboxMessageSummary(v.message)) return false;\n if (v.agent !== undefined && !isHqMailboxAgentSummary(v.agent)) return false;\n return true;\n}\n\n/**\n * Validate the `payload` field of a {@link HqEventEnvelope} for known\n * event types. Returns `{ ok: true, payload }` with a narrowed payload\n * type when the event type has a registered shape guard and the payload\n * matches it; `{ ok: true, payload: unknown }` for event types that the\n * server does not yet validate; or `{ ok: false, reason }` when the\n * payload fails the registered guard.\n *\n * Use this after {@link parseHqFrame} has produced a valid frame, when\n * the frame is `client.event` and the server is about to consume the\n * event payload.\n */\nexport type HqEventPayloadResult<T> =\n | { ok: true; payload: T }\n | { ok: false; reason: 'unknown-event-type' | 'malformed-payload' };\n\nexport function parseHqEventPayload(\n eventType: string,\n payload: unknown,\n): HqEventPayloadResult<unknown> {\n if (!KNOWN_HQ_EVENT_PAYLOAD_TYPES.has(eventType)) {\n // Server does not validate this event type yet — pass it through\n // untyped so the publish pipeline is not blocked. Future events\n // can opt-in by adding their type + guard here.\n return { ok: true, payload };\n }\n switch (eventType) {\n case 'mailbox.snapshot':\n return isHqMailboxSnapshotPayload(payload)\n ? { ok: true, payload }\n : { ok: false, reason: 'malformed-payload' };\n case 'mailbox.event':\n return isHqMailboxEventPayload(payload)\n ? { ok: true, payload }\n : { ok: false, reason: 'malformed-payload' };\n default: {\n const _exhaustive: never = eventType as never;\n return _exhaustive;\n }\n }\n}\n\nexport function createHqEventEnvelope<TPayload>(input: {\n id: string;\n type: HqEventType | (string & {});\n timestamp: string;\n clientId: string;\n projectId: string;\n seq: number;\n payload: TPayload;\n sessionId?: string;\n runId?: string;\n}): HqEventEnvelope<TPayload> {\n return {\n id: input.id,\n type: input.type,\n schemaVersion: HQ_PROTOCOL_VERSION,\n timestamp: input.timestamp,\n clientId: input.clientId,\n projectId: input.projectId,\n seq: input.seq,\n payload: input.payload,\n ...(input.sessionId !== undefined ? { sessionId: input.sessionId } : {}),\n ...(input.runId !== undefined ? { runId: input.runId } : {}),\n };\n}\n","import type { SecretScrubber } from '../types/secret-scrubber.js';\n\ninterface Pattern {\n type: string;\n regex: RegExp;\n}\n\nconst PATTERNS: Pattern[] = [\n // Anchored at the start where possible so partial matches inside larger\n // strings don't trigger false positives.\n {\n type: 'anthropic_key',\n regex: /(?<![A-Za-z0-9])sk-ant-api\\d+-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g,\n },\n { type: 'openai_key', regex: /(?<![A-Za-z0-9])sk-(?:proj-)?[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'github_pat', regex: /(?<![A-Za-z0-9])ghp_[A-Za-z0-9]{36,}(?![A-Za-z0-9])/g },\n { type: 'github_pat_v2', regex: /(?<![A-Za-z0-9])github_pat_[A-Za-z0-9_]{50,}(?![A-Za-z0-9])/g },\n { type: 'aws_access_key', regex: /(?<![A-Za-z0-9])AKIA[0-9A-Z]{16}(?![A-Za-z0-9])/g },\n { type: 'gcp_key', regex: /(?<![A-Za-z0-9])AIza[0-9A-Za-z_-]{35}(?![A-Za-z0-9])/g },\n { type: 'slack_token', regex: /(?<![A-Za-z0-9-])xox[abpos]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])/g },\n {\n type: 'stripe_key',\n regex: /(?<![A-Za-z0-9])sk_(?:live|test)_[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g,\n },\n {\n type: 'telegram_bot_token',\n // Telegram tokens are of the form bot<digits>:<alphanum> in URL paths\n regex: /\\/bot\\d+:[A-Za-z0-9_-]{20,}(?![A-Za-z0-9_-])/g,\n },\n {\n type: 'jwt',\n // Anchored: look for literal \"eyJ\" which is unambiguous for JWT header\n regex:\n /(?<![A-Za-z0-9/+=])eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}(?![A-Za-z0-9/+=])/g,\n },\n {\n type: 'private_key',\n // Anchored: start must be BEGIN, end must be END with no extra dashes after END\n regex:\n /(?:^|\\n)-----BEGIN (?:RSA|EC|OPENSSH|DSA|PGP)? ?PRIVATE KEY-----[\\s\\S]*?-----END[^-]*-----(?:\\n|$)/g,\n },\n { type: 'mongodb_uri', regex: /mongodb(?:\\+srv)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'postgres_uri', regex: /postgres(?:ql)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'mysql_uri', regex: /mysql:\\/\\/[^\\s\"'`]+/g },\n { type: 'redis_uri', regex: /redis:\\/\\/[^\\s\"'`]+/g },\n // AI/ML provider keys — modern LLM services with well-known prefixes\n {\n type: 'huggingface_token',\n // HuggingFace tokens: hf_ followed by 34 alphanumeric chars\n regex: /(?<![A-Za-z0-9])hf_[A-Za-z0-9]{34}(?![A-Za-z0-9])/g,\n },\n {\n type: 'replicate_token',\n // Replicate tokens: r8_ followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])r8_[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'perplexity_key',\n // Perplexity API keys: pplx- followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])pplx-[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'groq_key',\n // Groq API keys: gsk_ followed by 40+ alphanumeric chars\n regex: /(?<![A-Za-z0-9])gsk_[A-Za-z0-9]{40,}(?![A-Za-z0-9])/g,\n },\n {\n type: 'bearer_token',\n // Anchored with alternation instead of negative lookahead — avoids V8\n // backtracking risk on adversarial input. Bounded at 512 chars.\n // Min 12 chars: some OAuth providers issue shorter-lived tokens (< 20\n // chars). A 12-char base64 string has ~71 bits of entropy — above the\n // threshold where random strings are unlikely to produce false matches.\n regex: /(?:^|[^A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{12,512}=*(?:$|[^A-Za-z0-9_.~+/-])/g,\n },\n {\n type: 'high_entropy_env',\n // Anchored with alternation instead of lookbehind to avoid backtracking.\n // Value bounded at 512 chars.\n regex: /(?:^|\\s)([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,512})['\"]?(?:\\s|$)/g,\n },\n];\n\n/**\n * `high_entropy_env` is the one pattern that needs special replacement logic\n * (it preserves the key name), so it runs in its own pass. Every other pattern\n * is folded into a single combined regex. Derive the split by type rather than\n * by hard-coded indices so adding/removing a pattern can't silently drop one.\n */\nconst SIMPLE_PATTERNS = PATTERNS.filter((p) => p.type !== 'high_entropy_env');\n\n/**\n * Combined single-pass regex for all simple patterns. Each alternative is a\n * capturing group so the callback can determine which original pattern fired\n * (only one group is non-undefined at match time). Order matches SIMPLE_PATTERNS\n * (longer/more-specific prefixes first). Relies on each simple pattern source\n * containing no internal capturing groups — only `(?:...)` and lookarounds.\n */\nconst COMBINED_REGEX = new RegExp(SIMPLE_PATTERNS.map((p) => `(${p.regex.source})`).join('|'), 'g');\n\n/** Separate pattern for high_entropy_env (different replacement logic). */\nconst HIGH_ENTROPY_REGEX = PATTERNS.find((p) => p.type === 'high_entropy_env')!.regex;\n\n/**\n * Replacements for the combined patterns, parallel to SIMPLE_PATTERNS. The\n * combined-regex callback indexes into this with the matched group's position.\n */\nconst COMBINED_REPLACEMENTS = SIMPLE_PATTERNS.map((p) => `[REDACTED:${p.type}]`);\n\n/**\n * Per-chunk cap. Splits long inputs into 64 KB chunks to keep scrub() memory\n * bounded. Real scrub() inputs (LLM responses, tool outputs) are typically\n * much smaller; this cap handles edge cases without impacting normal usage.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\n/**\n * Quick pre-scan: check if the text contains any substring that MUST be\n * present for a credential pattern to match. If none are found, the text\n * is guaranteed clean — skip all regex passes (2 total: 16-pattern combined + high_entropy_env).\n *\n * Each anchor is the shortest unique substring from the corresponding pattern.\n * V8's `String.includes()` is hand-tuned C++ — O(n) with near-zero overhead\n * for typical tool-output lengths (100–5000 chars). A single combined regex\n * via `text.search()` is consistently slower for this many alternatives.\n */\nfunction hasCredentialAnchors(text: string): boolean {\n return (\n text.includes('-----BEGIN') || // Private keys (most unique → cheap reject)\n text.includes('sk-') || // Anthropic + OpenAI keys\n text.includes('sk_') || // Stripe live/test keys\n text.includes('ghp_') || // GitHub PAT v1\n text.includes('github_pat_') || // GitHub PAT v2\n text.includes('eyJ') || // JWT\n text.includes('AKIA') || // AWS access key\n text.includes('AIza') || // GCP service key\n text.includes('xox') || // Slack token (xoxa/xoxb/xoxp/xoxo/xoxs)\n text.includes('Bearer ') || // Bearer token (space suffix reduces false positives)\n text.includes('/bot') || // Telegram bot token (URL path pattern)\n text.includes('hf_') || // HuggingFace token\n text.includes('r8_') || // Replicate token\n text.includes('pplx-') || // Perplexity API key\n text.includes('gsk_') || // Groq API key\n text.includes('_KEY=') || // High-entropy env vars: API_KEY=, SECRET_KEY=, ...\n text.includes('_TOKEN=') || // ACCESS_TOKEN=, AUTH_TOKEN=, ...\n text.includes('_SECRET=') || // API_SECRET=, CLIENT_SECRET=, ...\n text.includes('_PASSWORD=') || // DB_PASSWORD=, ROOT_PASSWORD=, ...\n text.includes('mongodb://') ||\n text.includes('mongodb+srv://') ||\n text.includes('postgres://') ||\n text.includes('postgresql://') ||\n text.includes('mysql://') ||\n text.includes('redis://')\n );\n}\n\nexport class DefaultSecretScrubber implements SecretScrubber {\n scrub(text: string): string {\n if (!text) return text;\n\n // Fast path: if no credential anchor substrings exist in the text,\n // none of the 17 regex patterns can match. Skip all regex work.\n // This covers the vast majority of tool outputs (~95% of calls on\n // typical sessions are file paths, status messages, diffs, etc.).\n if (!hasCredentialAnchors(text)) return text;\n\n // For oversize inputs, scrub in fixed chunks. We split on newlines\n // where possible so secrets that span a few hundred bytes still get\n // matched within a single chunk; only inputs above ~64 KB risk a\n // boundary cutting a secret in half, and those are uncommon.\n if (text.length <= SCRUB_CHUNK_BYTES) {\n return this.scrubOne(text);\n }\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n let end = Math.min(i + SCRUB_CHUNK_BYTES, text.length);\n // Try to break on a newline near the boundary so we don't cut secrets.\n if (end < text.length) {\n const nl = text.lastIndexOf('\\n', end);\n if (nl > i + SCRUB_CHUNK_BYTES / 2) end = nl + 1;\n }\n out.push(this.scrubOne(text.slice(i, end)));\n i = end;\n }\n return out.join('');\n }\n\n private scrubOne(text: string): string {\n // Redundant guard: if we reached scrubOne via the chunked path, the\n // chunk may have been small enough to anchor-skip independently.\n if (!hasCredentialAnchors(text)) return text;\n\n // Pass 1: combined single-pass regex for all simple patterns. Each\n // alternative is a capturing group; only the group that matched is\n // non-undefined. The trailing offset/string args replace() appends are\n // always defined, so the matched group (which precedes them) is found first.\n let out = text.replace(\n COMBINED_REGEX,\n (match, ...groups) => {\n // groups[i] corresponds to SIMPLE_PATTERNS[i]; find which one fired.\n const idx = groups.findIndex((g) => g !== undefined);\n if (idx < 0) return match;\n const replacement = COMBINED_REPLACEMENTS[idx];\n return replacement !== undefined ? replacement : match;\n },\n );\n\n // Pass 2: high_entropy_env needs special handling — preserve the key name.\n out = out.replace(HIGH_ENTROPY_REGEX, (_match, group1, _group2) => {\n return `${group1}=[REDACTED:high_entropy_env]`;\n });\n\n return out;\n }\n\n /**\n * Recursively scrub every string value in an object/array graph. Secrets can\n * appear under any key — a URL query param, an `authorization` header, an\n * arbitrarily-named nested field — so we don't gate recursion on key names.\n * The per-string `scrub()` fast-path (anchor pre-scan) keeps this cheap: any\n * value without a credential anchor returns immediately without regex work.\n */\n scrubObject<T>(obj: T): T {\n const seen = new WeakSet();\n const visit = (v: unknown): unknown => {\n if (typeof v === 'string') return this.scrub(v);\n if (v === null || typeof v !== 'object') return v;\n if (seen.has(v as object)) return v;\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(visit);\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) {\n out[k] = visit(val);\n }\n return out;\n };\n return visit(obj) as T;\n }\n}\n","import { DefaultSecretScrubber } from '../security/secret-scrubber.js';\nimport {\n DEFAULT_HQ_REDACTION_POLICY,\n type HqEventEnvelope,\n type HqRedactionPolicy,\n} from './protocol.js';\n\nconst RAW_CONTENT_REPLACEMENT = '[REDACTED:hq_raw_content]';\nconst SENSITIVE_FIELD_REPLACEMENT = '[REDACTED:hq_sensitive_field]';\nconst REDACTED_PATH_REPLACEMENT = '[REDACTED:hq_path]';\n\nconst RAW_CONTENT_KEYS = new Set([\n 'content',\n 'contents',\n 'raw',\n 'rawContent',\n 'body',\n 'message',\n 'messages',\n 'prompt',\n 'prompts',\n 'completion',\n 'response',\n 'assistantMessage',\n 'userMessage',\n 'stdout',\n 'stderr',\n 'output',\n 'toolInput',\n 'toolOutput',\n 'body',\n 'mailboxBody',\n 'messageBody',\n 'outcome',\n 'fileContent',\n 'diff',\n 'patch',\n 'transcript',\n 'logs',\n]);\n\nconst SENSITIVE_KEYS = new Set([\n 'authorization',\n 'cookie',\n 'password',\n 'passwd',\n 'pwd',\n 'secret',\n 'token',\n 'accessToken',\n 'refreshToken',\n 'apiKey',\n 'apikey',\n 'clientSecret',\n 'privateKey',\n]);\n\nconst PATH_KEYS = new Set([\n 'path',\n 'paths',\n 'file',\n 'files',\n 'filepath',\n 'filePath',\n 'filename',\n 'projectRoot',\n 'projectRootDisplay',\n 'cwd',\n 'workingDir',\n 'workingDirectory',\n]);\n\nexport interface HqRedactOptions {\n policy?: Partial<HqRedactionPolicy>;\n projectRoot?: string;\n maxSummaryLength?: number;\n}\n\nexport interface HqRedactionResult<T> {\n value: T;\n redacted: boolean;\n}\n\nconst defaultScrubber = new DefaultSecretScrubber();\n\nfunction resolvePolicy(policy?: Partial<HqRedactionPolicy>): HqRedactionPolicy {\n return {\n ...DEFAULT_HQ_REDACTION_POLICY,\n ...policy,\n };\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction isSensitiveKey(key: string): boolean {\n const lower = key.toLowerCase();\n return (\n SENSITIVE_KEYS.has(key) ||\n lower.includes('authorization') ||\n lower.includes('password') ||\n lower.includes('secret') ||\n lower.endsWith('token') ||\n lower.endsWith('apikey') ||\n lower.endsWith('api_key')\n );\n}\n\nfunction isRawContentKey(key: string): boolean {\n return RAW_CONTENT_KEYS.has(key) || RAW_CONTENT_KEYS.has(key.toLowerCase());\n}\n\nfunction isPathKey(key: string): boolean {\n return PATH_KEYS.has(key) || PATH_KEYS.has(key.toLowerCase());\n}\n\nfunction normalizePathForCompare(value: string): string {\n return value.replace(/\\\\/g, '/').replace(/\\/+$/g, '');\n}\n\nfunction redactPath(\n value: string,\n projectRoot: string | undefined,\n policy: HqRedactionPolicy,\n): string {\n if (policy.paths === 'full') return defaultScrubber.scrub(value);\n if (policy.paths === 'none' || policy.paths === 'redacted') return REDACTED_PATH_REPLACEMENT;\n\n const normalizedValue = normalizePathForCompare(value);\n if (!projectRoot) return normalizedValue.split('/').at(-1) ?? REDACTED_PATH_REPLACEMENT;\n\n const normalizedRoot = normalizePathForCompare(projectRoot);\n if (normalizedValue === normalizedRoot) return '.';\n if (normalizedValue.startsWith(`${normalizedRoot}/`)) {\n return normalizedValue.slice(normalizedRoot.length + 1) || '.';\n }\n return normalizedValue.split('/').at(-1) ?? REDACTED_PATH_REPLACEMENT;\n}\n\nfunction summarizeString(value: string, maxSummaryLength: number): string {\n const scrubbed = defaultScrubber.scrub(value);\n if (scrubbed.length <= maxSummaryLength) return scrubbed;\n return `${scrubbed.slice(0, maxSummaryLength)}…[truncated:${scrubbed.length - maxSummaryLength}]`;\n}\n\n/**\n * Scrub a free-text preview field and truncate it to a maximum length so\n * it is safe to embed in HQ event envelopes and broadcast to browsers\n * without leaking secrets or running away on unbounded input.\n *\n * Returns `undefined` when the input is empty or non-string. Truncation\n * suffix is `\"…[truncated:N]\"` where N is the number of dropped chars.\n */\nexport function scrubAndTruncateHqPreview(\n value: unknown,\n maxLength: number = 280,\n): string | undefined {\n if (typeof value !== 'string' || value.length === 0) return undefined;\n return summarizeString(value, maxLength);\n}\n\nfunction visitValue(\n value: unknown,\n options: {\n policy: HqRedactionPolicy;\n projectRoot?: string;\n maxSummaryLength: number;\n seen: WeakSet<object>;\n },\n key?: string,\n): { value: unknown; redacted: boolean } {\n if (key !== undefined && isSensitiveKey(key)) {\n return { value: SENSITIVE_FIELD_REPLACEMENT, redacted: true };\n }\n\n if (typeof value === 'string') {\n if (key !== undefined && isPathKey(key)) {\n const redactedPath = redactPath(value, options.projectRoot, options.policy);\n return { value: redactedPath, redacted: redactedPath !== value };\n }\n\n if (!options.policy.rawContent && key !== undefined && isRawContentKey(key)) {\n return { value: RAW_CONTENT_REPLACEMENT, redacted: true };\n }\n\n const scrubbed = summarizeString(value, options.maxSummaryLength);\n return { value: scrubbed, redacted: scrubbed !== value };\n }\n\n if (value === null || typeof value !== 'object') return { value, redacted: false };\n\n if (options.seen.has(value)) return { value: '[REDACTED:hq_circular]', redacted: true };\n options.seen.add(value);\n\n if (Array.isArray(value)) {\n let redacted = false;\n const out = value.map((item) => {\n const next = visitValue(item, options, key);\n redacted ||= next.redacted;\n return next.value;\n });\n return { value: out, redacted };\n }\n\n if (!isPlainObject(value)) return { value: String(value), redacted: true };\n\n let redacted = false;\n const out: Record<string, unknown> = {};\n for (const [childKey, childValue] of Object.entries(value)) {\n const next = visitValue(childValue, options, childKey);\n redacted ||= next.redacted;\n out[childKey] = next.value;\n }\n return { value: out, redacted };\n}\n\nexport function redactHqValue<T>(value: T, options: HqRedactOptions = {}): HqRedactionResult<T> {\n const result = visitValue(value, {\n policy: resolvePolicy(options.policy),\n ...(options.projectRoot !== undefined ? { projectRoot: options.projectRoot } : {}),\n maxSummaryLength: options.maxSummaryLength ?? 500,\n seen: new WeakSet<object>(),\n });\n return { value: result.value as T, redacted: result.redacted };\n}\n\nexport function redactHqEvent<TPayload>(\n event: HqEventEnvelope<TPayload>,\n options: HqRedactOptions = {},\n): HqRedactionResult<HqEventEnvelope<TPayload>> {\n const payload = redactHqValue(event.payload, options);\n const nextEvent = {\n ...event,\n payload: payload.value,\n };\n return { value: nextEvent, redacted: payload.redacted };\n}\n\nexport function summarizeHqToolArgs(value: unknown, options: HqRedactOptions = {}): unknown {\n const policy = resolvePolicy(options.policy);\n if (policy.toolArgs === 'none') return '[REDACTED:hq_tool_args]';\n if (policy.toolArgs === 'redacted') return redactHqValue(value, options).value;\n\n if (value === null || typeof value !== 'object') return redactHqValue(value, options).value;\n if (Array.isArray(value)) return `[array:${value.length}]`;\n\n const entries = Object.entries(value as Record<string, unknown>);\n const summary: Record<string, unknown> = {};\n for (const [key, item] of entries.slice(0, 20)) {\n if (isSensitiveKey(key)) {\n summary[key] = SENSITIVE_FIELD_REPLACEMENT;\n } else if (typeof item === 'string') {\n summary[key] = isPathKey(key)\n ? redactPath(item, options.projectRoot, policy)\n : summarizeString(item, 120);\n } else if (Array.isArray(item)) {\n summary[key] = `[array:${item.length}]`;\n } else if (item !== null && typeof item === 'object') {\n summary[key] = '[object]';\n } else {\n summary[key] = item;\n }\n }\n if (entries.length > 20) summary.__truncatedKeys = entries.length - 20;\n return summary;\n}\n","import type { Mailbox, MailboxAgentStatus, MailboxMessage } from '../coordination/mailbox-types.js';\nimport {\n type HqMailboxAgentSummary,\n type HqMailboxEventPayload,\n type HqMailboxMessageSummary,\n type HqMailboxSnapshotPayload,\n type HqRedactionPolicy,\n} from './protocol.js';\nimport { redactHqValue } from './redaction.js';\n\nexport interface HqMailboxMappingOptions {\n mailboxId: string;\n scope?: 'project' | 'global';\n limit?: number;\n previewLength?: number;\n redactionPolicy?: Partial<HqRedactionPolicy>;\n}\n\nexport interface HqMailboxSnapshotOptions extends HqMailboxMappingOptions {\n includeCompleted?: boolean;\n}\n\nexport type HqMailboxEventAction = HqMailboxEventPayload['action'];\n\nfunction previewText(value: string | undefined, maxLength: number, policy?: Partial<HqRedactionPolicy>): string | undefined {\n if (value === undefined || value.length === 0) return undefined;\n const redacted = redactHqValue(value, { maxSummaryLength: maxLength, policy: { rawContent: true, ...policy } }).value;\n if (redacted.length <= maxLength) return redacted;\n return `${redacted.slice(0, maxLength)}…`;\n}\n\nfunction readCount(message: MailboxMessage): number {\n return Object.keys(message.readBy).length;\n}\n\nfunction taskSummary(message: MailboxMessage): HqMailboxMessageSummary['task'] {\n if (message.taskContext === undefined) return undefined;\n const task = {\n ...(message.taskContext.taskId !== undefined ? { taskId: message.taskContext.taskId } : {}),\n ...(message.taskContext.agentRole !== undefined ? { agentRole: message.taskContext.agentRole } : {}),\n ...(message.taskContext.agentName !== undefined ? { agentName: message.taskContext.agentName } : {}),\n ...(message.taskContext.status !== undefined ? { status: message.taskContext.status } : {}),\n } satisfies HqMailboxMessageSummary['task'];\n return Object.keys(task).length > 0 ? task : undefined;\n}\n\nexport function mapMailboxMessageToHqSummary(\n message: MailboxMessage,\n options: Pick<HqMailboxMappingOptions, 'previewLength' | 'redactionPolicy'> = {},\n): HqMailboxMessageSummary {\n const previewLength = options.previewLength ?? 160;\n const bodyPreview = previewText(message.body, previewLength, options.redactionPolicy);\n const outcomePreview = previewText(message.outcome, previewLength, options.redactionPolicy);\n const task = taskSummary(message);\n\n return {\n messageId: message.id,\n from: message.from,\n to: message.to,\n type: message.type,\n subject: previewText(message.subject, previewLength, options.redactionPolicy) ?? '',\n priority: message.priority,\n timestamp: message.timestamp,\n ...(message.replyTo !== undefined ? { replyTo: message.replyTo } : {}),\n ...(message.senderSessionId !== undefined ? { senderSessionId: message.senderSessionId } : {}),\n completed: message.completed,\n ...(message.completedBy !== undefined ? { completedBy: message.completedBy } : {}),\n ...(message.completedAt !== undefined ? { completedAt: message.completedAt } : {}),\n readCount: readCount(message),\n hasBody: message.body.length > 0,\n ...(bodyPreview !== undefined ? { bodyPreview } : {}),\n ...(outcomePreview !== undefined ? { outcomePreview } : {}),\n ...(task !== undefined ? { task } : {}),\n };\n}\n\nexport function mapMailboxAgentToHqSummary(agent: MailboxAgentStatus): HqMailboxAgentSummary {\n return {\n agentId: agent.agentId,\n name: agent.name,\n ...(agent.role !== undefined ? { role: agent.role } : {}),\n sessionId: agent.sessionId,\n status: agent.status,\n ...(agent.currentTool !== undefined ? { currentTool: agent.currentTool } : {}),\n ...(agent.currentTask !== undefined ? { currentTask: agent.currentTask } : {}),\n iterations: agent.iterations,\n toolCalls: agent.toolCalls,\n lastActivityAt: agent.lastActivityAt,\n lastSeenAt: agent.lastSeenAt,\n online: agent.online,\n ...(agent.source !== undefined ? { source: agent.source } : {}),\n };\n}\n\nexport function createMailboxSnapshotPayload(\n messages: readonly MailboxMessage[],\n agents: readonly MailboxAgentStatus[],\n options: HqMailboxSnapshotOptions,\n): HqMailboxSnapshotPayload {\n const includeCompleted = options.includeCompleted ?? true;\n const filteredMessages = includeCompleted ? messages : messages.filter((message) => !message.completed);\n const limit = options.limit ?? 50;\n const sortedMessages = [...filteredMessages].sort((a, b) => b.timestamp.localeCompare(a.timestamp)).slice(0, limit);\n const summaries = sortedMessages.map((message) => mapMailboxMessageToHqSummary(message, options));\n const agentSummaries = agents.map(mapMailboxAgentToHqSummary);\n\n return {\n mailboxId: options.mailboxId,\n scope: options.scope ?? 'project',\n messages: summaries,\n agents: agentSummaries,\n totals: {\n messages: messages.length,\n unread: messages.filter((message) => !message.completed && readCount(message) === 0).length,\n incomplete: messages.filter((message) => !message.completed).length,\n highPriority: messages.filter((message) => message.priority === 'high').length,\n onlineAgents: agents.filter((agent) => agent.online).length,\n },\n };\n}\n\nexport async function createMailboxSnapshotPayloadFromMailbox(\n mailbox: Pick<Mailbox, 'query' | 'getAgentStatuses'>,\n options: HqMailboxSnapshotOptions,\n): Promise<HqMailboxSnapshotPayload> {\n const limit = options.limit ?? 50;\n const [messages, agents] = await Promise.all([\n mailbox.query({ limit }),\n mailbox.getAgentStatuses(),\n ]);\n return createMailboxSnapshotPayload(messages, agents, options);\n}\n\nexport function createMailboxEventPayload(input: {\n mailboxId: string;\n action: HqMailboxEventAction;\n message?: MailboxMessage;\n agent?: MailboxAgentStatus;\n summary?: string;\n previewLength?: number;\n redactionPolicy?: Partial<HqRedactionPolicy>;\n}): HqMailboxEventPayload {\n const summaryOptions: Pick<HqMailboxMappingOptions, 'previewLength' | 'redactionPolicy'> = {\n ...(input.previewLength !== undefined ? { previewLength: input.previewLength } : {}),\n ...(input.redactionPolicy !== undefined ? { redactionPolicy: input.redactionPolicy } : {}),\n };\n\n return {\n mailboxId: input.mailboxId,\n action: input.action,\n ...(input.message !== undefined ? { message: mapMailboxMessageToHqSummary(input.message, summaryOptions) } : {}),\n ...(input.agent !== undefined ? { agent: mapMailboxAgentToHqSummary(input.agent) } : {}),\n ...(input.summary !== undefined\n ? { summary: previewText(input.summary, input.previewLength ?? 160, input.redactionPolicy) ?? '' }\n : {}),\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Mailbox, MailboxAgentStatus, MailboxMessage } from '../coordination/mailbox-types.js';\nimport {\n createMailboxEventPayload,\n createMailboxSnapshotPayloadFromMailbox,\n type HqMailboxEventAction,\n type HqMailboxSnapshotOptions,\n} from './mailbox-mapper.js';\nimport {\n createHqEventEnvelope,\n HQ_PROTOCOL_VERSION,\n type HqClientCapability,\n type HqClientCommandAckMessage,\n type HqClientCommandPollMessage,\n type HqClientEventMessage,\n type HqClientHelloMessage,\n type HqClientIdentity,\n type HqEventEnvelope,\n type HqEventType,\n type HqMailboxEventPayload,\n type HqMailboxSnapshotPayload,\n type HqProjectIdentity,\n type HqQueuedCommand,\n type HqRedactionPolicy,\n type HqServerCommandBatchMessage,\n} from './protocol.js';\n\nexport interface HqSocketLike {\n readyState: number;\n send(data: string): void;\n close(code?: number, reason?: string): void;\n addEventListener?(type: 'open' | 'close' | 'error' | 'message', listener: (event: unknown) => void): void;\n removeEventListener?(type: 'open' | 'close' | 'error' | 'message', listener: (event: unknown) => void): void;\n on?(type: 'open' | 'close' | 'error' | 'message', listener: (event: unknown) => void): void;\n off?(type: 'open' | 'close' | 'error' | 'message', listener: (event: unknown) => void): void;\n}\n\nexport type HqSocketFactory = (url: string, init: { token?: string }) => HqSocketLike;\n\nexport interface HqPublisherCommandResult {\n commandId: string;\n status: 'accepted' | 'completed' | 'failed' | 'rejected';\n message?: string;\n}\n\nexport type HqPublisherCommandHandler = (command: HqQueuedCommand) => void | HqPublisherCommandResult | Promise<void | HqPublisherCommandResult>;\n\nexport interface HqPublisherOptions {\n url: string;\n token?: string;\n client: HqClientIdentity;\n project: HqProjectIdentity;\n capabilities?: readonly HqClientCapability[];\n socketFactory?: HqSocketFactory;\n now?: () => string;\n idFactory?: () => string;\n reconnect?: boolean;\n reconnectBaseMs?: number;\n reconnectMaxMs?: number;\n maxQueuedMessages?: number;\n redactionPolicy?: Partial<HqRedactionPolicy>;\n commandPollIntervalMs?: number;\n commandPollLimit?: number;\n onCommand?: HqPublisherCommandHandler;\n}\n\nexport interface HqPublishEventOptions {\n type: HqEventType | (string & {});\n payload: unknown;\n sessionId?: string;\n runId?: string;\n timestamp?: string;\n}\n\nconst OPEN_STATE = 1;\nconst DEFAULT_RECONNECT_BASE_MS = 1_000;\nconst DEFAULT_RECONNECT_MAX_MS = 30_000;\nconst DEFAULT_MAX_QUEUED_MESSAGES = 250;\nconst DEFAULT_COMMAND_POLL_INTERVAL_MS = 10_000;\nconst DEFAULT_COMMAND_POLL_LIMIT = 25;\n\nfunction defaultSocketFactory(url: string): HqSocketLike {\n const WebSocketCtor = globalThis.WebSocket;\n if (WebSocketCtor === undefined) {\n throw new Error('No global WebSocket implementation is available; provide HqPublisherOptions.socketFactory.');\n }\n return new WebSocketCtor(url) as HqSocketLike;\n}\n\nfunction toClientUrl(baseUrl: string, token: string | undefined): string {\n const url = new URL(baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n if (url.pathname === '/' || url.pathname === '') url.pathname = '/ws/client';\n if (token !== undefined && token.length > 0) url.searchParams.set('token', token);\n return url.toString();\n}\n\nfunction addSocketListener(socket: HqSocketLike, type: 'open' | 'close' | 'error' | 'message', listener: (event: unknown) => void): void {\n if (socket.addEventListener !== undefined) {\n socket.addEventListener(type, listener);\n return;\n }\n socket.on?.(type, listener);\n}\n\nfunction removeSocketListener(socket: HqSocketLike, type: 'open' | 'close' | 'error' | 'message', listener: (event: unknown) => void): void {\n if (socket.removeEventListener !== undefined) {\n socket.removeEventListener(type, listener);\n return;\n }\n socket.off?.(type, listener);\n}\n\nexport class HqPublisher {\n private readonly socketFactory: HqSocketFactory;\n private readonly now: () => string;\n private readonly idFactory: () => string;\n private readonly capabilities: readonly HqClientCapability[];\n private readonly reconnect: boolean;\n private readonly reconnectBaseMs: number;\n private readonly reconnectMaxMs: number;\n private readonly maxQueuedMessages: number;\n private socket: HqSocketLike | null = null;\n private seq = 0;\n private queue: string[] = [];\n private stopped = false;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private commandPollTimer: ReturnType<typeof setInterval> | null = null;\n private lastCommandId: string | undefined;\n\n constructor(private readonly options: HqPublisherOptions) {\n this.socketFactory = options.socketFactory ?? defaultSocketFactory;\n this.now = options.now ?? (() => new Date().toISOString());\n this.idFactory = options.idFactory ?? randomUUID;\n this.capabilities = options.capabilities ?? ['telemetry.publish', 'mailbox.summary'];\n this.reconnect = options.reconnect ?? true;\n this.reconnectBaseMs = options.reconnectBaseMs ?? DEFAULT_RECONNECT_BASE_MS;\n this.reconnectMaxMs = options.reconnectMaxMs ?? DEFAULT_RECONNECT_MAX_MS;\n this.maxQueuedMessages = options.maxQueuedMessages ?? DEFAULT_MAX_QUEUED_MESSAGES;\n }\n\n connect(): void {\n if (this.socket !== null || this.stopped) return;\n const socket = this.socketFactory(toClientUrl(this.options.url, this.options.token), {\n ...(this.options.token !== undefined ? { token: this.options.token } : {}),\n });\n this.socket = socket;\n\n const onOpen = () => {\n this.reconnectAttempt = 0;\n this.sendHello();\n this.flushQueue();\n if (this.options.onCommand !== undefined) {\n this.startCommandPolling();\n this.pollCommands();\n }\n };\n const onMessage = (event: unknown) => {\n void this.handleServerMessage(event);\n };\n const onCloseOrError = () => {\n removeSocketListener(socket, 'open', onOpen);\n removeSocketListener(socket, 'message', onMessage);\n removeSocketListener(socket, 'close', onCloseOrError);\n removeSocketListener(socket, 'error', onCloseOrError);\n this.stopCommandPolling();\n if (this.socket === socket) this.socket = null;\n this.scheduleReconnect();\n };\n\n addSocketListener(socket, 'open', onOpen);\n addSocketListener(socket, 'message', onMessage);\n addSocketListener(socket, 'close', onCloseOrError);\n addSocketListener(socket, 'error', onCloseOrError);\n\n if (socket.readyState === OPEN_STATE) onOpen();\n }\n\n close(): void {\n this.stopped = true;\n if (this.reconnectTimer !== null) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.stopCommandPolling();\n this.queue = [];\n const socket = this.socket;\n this.socket = null;\n socket?.close(1000, 'hq publisher closed');\n }\n\n publishEvent<TPayload>(options: HqPublishEventOptions & { payload: TPayload }): HqEventEnvelope<TPayload> {\n const event = createHqEventEnvelope({\n id: this.idFactory(),\n type: options.type,\n timestamp: options.timestamp ?? this.now(),\n clientId: this.options.client.clientId,\n projectId: this.options.project.projectId,\n seq: ++this.seq,\n payload: options.payload,\n ...(options.sessionId !== undefined ? { sessionId: options.sessionId } : {}),\n ...(options.runId !== undefined ? { runId: options.runId } : {}),\n });\n this.sendFrame({ type: 'client.event', event });\n return event;\n }\n\n async publishMailboxSnapshot(\n mailbox: Pick<Mailbox, 'query' | 'getAgentStatuses'>,\n options: Omit<HqMailboxSnapshotOptions, 'redactionPolicy'> & { sessionId?: string; timestamp?: string },\n ): Promise<HqEventEnvelope<HqMailboxSnapshotPayload>> {\n const payload = await createMailboxSnapshotPayloadFromMailbox(mailbox, {\n ...options,\n ...(this.options.redactionPolicy !== undefined ? { redactionPolicy: this.options.redactionPolicy } : {}),\n });\n return this.publishEvent({\n type: 'mailbox.snapshot',\n payload,\n ...(options.sessionId !== undefined ? { sessionId: options.sessionId } : {}),\n ...(options.timestamp !== undefined ? { timestamp: options.timestamp } : {}),\n });\n }\n\n publishMailboxEvent(input: {\n mailboxId: string;\n action: HqMailboxEventAction;\n message?: MailboxMessage;\n agent?: MailboxAgentStatus;\n summary?: string;\n previewLength?: number;\n sessionId?: string;\n timestamp?: string;\n }): HqEventEnvelope<HqMailboxEventPayload> {\n const payload = createMailboxEventPayload({\n mailboxId: input.mailboxId,\n action: input.action,\n ...(input.message !== undefined ? { message: input.message } : {}),\n ...(input.agent !== undefined ? { agent: input.agent } : {}),\n ...(input.summary !== undefined ? { summary: input.summary } : {}),\n ...(input.previewLength !== undefined ? { previewLength: input.previewLength } : {}),\n ...(this.options.redactionPolicy !== undefined ? { redactionPolicy: this.options.redactionPolicy } : {}),\n });\n return this.publishEvent({\n type: 'mailbox.event',\n payload,\n ...(input.sessionId !== undefined ? { sessionId: input.sessionId } : {}),\n ...(input.timestamp !== undefined ? { timestamp: input.timestamp } : {}),\n });\n }\n\n pollCommands(): void {\n this.sendFrame({\n type: 'client.command_poll',\n clientId: this.options.client.clientId,\n projectId: this.options.project.projectId,\n ...(this.lastCommandId !== undefined ? { afterCommandId: this.lastCommandId } : {}),\n limit: this.options.commandPollLimit ?? DEFAULT_COMMAND_POLL_LIMIT,\n });\n }\n\n ackCommand(result: HqPublisherCommandResult): void {\n this.sendFrame({\n type: 'client.command_ack',\n clientId: this.options.client.clientId,\n projectId: this.options.project.projectId,\n commandId: result.commandId,\n status: result.status,\n ...(result.message !== undefined ? { message: result.message } : {}),\n });\n }\n\n private sendHello(): void {\n this.sendFrame({\n type: 'client.hello',\n payload: {\n protocolVersion: HQ_PROTOCOL_VERSION,\n client: this.options.client,\n project: this.options.project,\n capabilities: this.capabilities,\n },\n });\n }\n\n private sendFrame(frame: HqClientHelloMessage | HqClientEventMessage | HqClientCommandPollMessage | HqClientCommandAckMessage): void {\n const serialized = JSON.stringify(frame);\n const socket = this.socket;\n if (socket?.readyState === OPEN_STATE) {\n socket.send(serialized);\n return;\n }\n this.enqueue(serialized);\n this.connect();\n }\n\n private enqueue(serialized: string): void {\n if (this.queue.length >= this.maxQueuedMessages) this.queue.shift();\n this.queue.push(serialized);\n }\n\n private flushQueue(): void {\n const socket = this.socket;\n if (socket?.readyState !== OPEN_STATE) return;\n const pending = this.queue;\n this.queue = [];\n for (const frame of pending) socket.send(frame);\n }\n\n private startCommandPolling(): void {\n if (this.options.onCommand === undefined || this.commandPollTimer !== null) return;\n this.commandPollTimer = setInterval(() => this.pollCommands(), this.options.commandPollIntervalMs ?? DEFAULT_COMMAND_POLL_INTERVAL_MS);\n }\n\n private stopCommandPolling(): void {\n if (this.commandPollTimer === null) return;\n clearInterval(this.commandPollTimer);\n this.commandPollTimer = null;\n }\n\n private async handleServerMessage(event: unknown): Promise<void> {\n const message = this.parseServerMessage(event);\n if (message?.type !== 'hq.command_batch') return;\n await this.handleCommandBatch(message);\n }\n\n private parseServerMessage(event: unknown): HqServerCommandBatchMessage | null {\n const data = this.extractMessageData(event);\n if (data === null) return null;\n try {\n const parsed = JSON.parse(data) as Partial<HqServerCommandBatchMessage>;\n if (parsed.type !== 'hq.command_batch' || !Array.isArray(parsed.commands)) return null;\n return parsed as HqServerCommandBatchMessage;\n } catch {\n return null;\n }\n }\n\n private extractMessageData(event: unknown): string | null {\n const value = typeof event === 'object' && event !== null && 'data' in event ? (event as { data?: unknown }).data : event;\n if (typeof value === 'string') return value;\n if (value instanceof ArrayBuffer) return new TextDecoder().decode(value);\n if (ArrayBuffer.isView(value)) {\n const bytes = new Uint8Array(value.buffer, value.byteOffset, value.byteLength);\n return new TextDecoder().decode(bytes);\n }\n return null;\n }\n\n private async handleCommandBatch(message: HqServerCommandBatchMessage): Promise<void> {\n const handler = this.options.onCommand;\n if (handler === undefined) return;\n\n for (const command of message.commands) {\n this.lastCommandId = command.commandId;\n try {\n const result = await handler(command);\n if (result !== undefined) this.ackCommand(result);\n else if (command.requiresAck) this.ackCommand({ commandId: command.commandId, status: 'accepted' });\n } catch (err) {\n this.ackCommand({\n commandId: command.commandId,\n status: 'failed',\n message: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n private scheduleReconnect(): void {\n if (this.stopped || !this.reconnect || this.reconnectTimer !== null) return;\n const delay = Math.min(this.reconnectMaxMs, this.reconnectBaseMs * 2 ** this.reconnectAttempt);\n this.reconnectAttempt += 1;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect();\n }, delay);\n }\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport interface FileLockOptions {\n timeoutMs?: number | undefined;\n staleMs?: number | undefined;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function withFileLock<T>(\n targetPath: string,\n fn: () => Promise<T>,\n opts: FileLockOptions = {},\n): Promise<T> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);\n const timeoutMs = opts.timeoutMs ?? 5_000;\n const staleMs = opts.staleMs ?? 30_000;\n const started = Date.now();\n let handle: fs.FileHandle | undefined;\n\n for (;;) {\n try {\n handle = await fs.open(lockPath, 'wx');\n await handle.writeFile(`${process.pid}:${Date.now()}`);\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ENOENT means the directory was deleted (e.g. by concurrent cleanup).\n // Recreate it and retry acquiring the lock.\n if (code === 'ENOENT') {\n await fs.mkdir(dir, { recursive: true });\n continue;\n }\n if (code !== 'EEXIST') throw err;\n try {\n const stat = await fs.stat(lockPath);\n if (Date.now() - stat.mtimeMs > staleMs) {\n await fs.unlink(lockPath);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - started >= timeoutMs) {\n throw new Error(`Timed out waiting for file lock: ${targetPath}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n\n try {\n return await fn();\n } finally {\n try {\n await handle?.close();\n } catch {\n // ignore\n }\n try {\n await fs.unlink(lockPath);\n } catch {\n // ignore\n }\n }\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import { createHash } from 'node:crypto';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Path layout. All developer-level state lives in ~/.wrongstack/.\n * Per-project state is keyed by sha256(absoluteProjectRoot).slice(0,12)\n * under ~/.wrongstack/projects/<hash>/.\n *\n * The ONLY thing inside the project tree is the optional\n * .wrongstack/AGENTS.md (committed) and .wrongstack/skills/ (committed).\n */\n\nexport interface WstackPaths {\n /** ~/.wrongstack — global root. */\n globalRoot: string;\n /**\n * ~/.wrongstack — directory for user-global stateful config files\n * (mode.json, theme.json, …). Currently an alias for `globalRoot`;\n * separate name lets us split out per-OS XDG_CONFIG_HOME later\n * without rewriting callers.\n */\n configDir: string;\n /** ~/.wrongstack/config.json */\n globalConfig: string;\n /** ~/.wrongstack/.key — 32 random bytes, mode 0600, AES-GCM key for the secret vault. */\n secretsKey: string;\n /** ~/.wrongstack/memory.md — user-global memory. */\n globalMemory: string;\n /** ~/.wrongstack/skills — user-global skills. */\n globalSkills: string;\n /** ~/.wrongstack/prompts — user-global prompt library. */\n globalPrompts: string;\n /** ~/.wrongstack/cache — fetched data (models.dev, etc.). */\n cacheDir: string;\n /** ~/.wrongstack/cache/models.dev.json */\n modelsCache: string;\n /** ~/.wrongstack/cache/models-overlay.json — cached curated overlay. */\n modelsOverlayCache: string;\n /**\n * Per-project codebase symbol index (SQLite). Lives under the global project\n * dir — NOT inside the repo — so it never clutters the working tree or needs\n * gitignoring. `~/.wrongstack/projects/<hash>/codebase-index`.\n */\n projectCodebaseIndex: string;\n /** ~/.wrongstack/history — REPL line history. */\n historyFile: string;\n /** ~/.wrongstack/logs/wrongstack.log */\n logFile: string;\n /** ~/.wrongstack/projects/<hash> */\n projectDir: string;\n /** ~/.wrongstack/projects/<hash>/memory.md */\n projectMemory: string;\n /** ~/.wrongstack/projects/<hash>/sessions */\n projectSessions: string;\n /** ~/.wrongstack/projects/<hash>/trust.json */\n projectTrust: string;\n /** ~/.wrongstack/projects/<hash>/meta.json */\n projectMeta: string;\n /** ~/.wrongstack/projects/<hash>/config.local.json — optional override */\n projectLocalConfig: string;\n /** <project>/.wrongstack/config.json — per-project settings (safe fields only).\n * This lives inside the project root so it can be gitignored or shared. */\n inProjectConfig: string;\n /** <project>/.wrongstack/AGENTS.md — committed project memory. */\n inProjectAgentsFile: string;\n /** <project>/.wrongstack/skills — committed project skills. */\n inProjectSkills: string;\n /** <project>/.wrongstack/worktrees — git worktrees for per-phase isolation (gitignored). */\n inProjectWorktrees: string;\n /** Stable hash for the project root. */\n projectHash: string;\n /** Human-readable project slug: `wrongstack-a1b2c3` instead of `3024e5e6fa58`. */\n projectSlug: string;\n /** ~/.wrongstack/projects/<hash>/goal.json — goal persistence */\n projectGoal: string;\n /** ~/.wrongstack/projects/<hash>/specs — SDD spec files */\n projectSpecs: string;\n /** ~/.wrongstack/projects/<hash>/task-graphs — SDD task graphs */\n projectTaskGraphs: string;\n /** ~/.wrongstack/projects/<hash>/sdd-session.json — SDD session state */\n projectSddSession: string;\n /** ~/.wrongstack/projects/<hash>/plan.json — plan persistence */\n projectPlan: string;\n /** ~/.wrongstack/projects/<hash>/autophase — AutoPhase phase-graph JSON files */\n projectAutophase: string;\n /** ~/.wrongstack/sync.json — CloudSync configuration */\n syncConfig: string;\n /** Function to get the status.json path for a project given its hash. */\n projectStatus: (projectHash: string) => string;\n}\n\nexport function projectHash(absRoot: string): string {\n return createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 12);\n}\n\n/**\n * Human-readable project directory name: slugified folder name + short hash\n * suffix for uniqueness. e.g. `wrongstack-a1b2c3` instead of `3024e5e6fa58`.\n */\nexport function projectSlug(absRoot: string): string {\n const base = slugify(path.basename(absRoot));\n const hash = createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\n/** Turn a folder name into a filesystem-safe lowercase slug. */\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n // Collapse any run of non-alphanumeric chars into a single hyphen.\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40) || 'project'\n );\n}\n\nexport interface WstackPathOptions {\n userHome?: string | undefined;\n projectRoot: string;\n /** Override the global root (e.g. for tests). Default: `${userHome}/.wrongstack`. */\n globalRoot?: string | undefined;\n}\n\n/**\n * The global `~/.wrongstack` root, honoring the `WRONGSTACK_HOME` env\n * override. The override exists so tests (and sandboxed runs) can redirect\n * ALL global state — config, secrets, logs, projects/, mailboxes — away from\n * the real user home. Before it existed, `pnpm test` booted runtimes against\n * the real `~/.wrongstack`: it read the user's real config.json (starting a\n * second live Telegram poller), appended to the real wrongstack.log, and left\n * ~20k orphaned fixture dirs under projects/.\n *\n * Every code path that wants the global dir must come through here (or\n * through `resolveWstackPaths`) instead of `path.join(os.homedir(), '.wrongstack')`.\n */\nexport function wstackGlobalRoot(): string {\n const fromEnv = process.env['WRONGSTACK_HOME'];\n if (fromEnv && fromEnv.trim().length > 0) return path.resolve(fromEnv);\n return path.join(os.homedir(), '.wrongstack');\n}\n\nexport function resolveWstackPaths(opts: WstackPathOptions): WstackPaths {\n // Precedence: explicit globalRoot > explicit userHome (callers/tests that\n // pass one expect paths under it) > WRONGSTACK_HOME env > real home dir.\n const globalRoot =\n opts.globalRoot ?? (opts.userHome ? path.join(opts.userHome, '.wrongstack') : wstackGlobalRoot());\n const hash = projectHash(opts.projectRoot);\n const slug = projectSlug(opts.projectRoot);\n const projectDir = path.join(globalRoot, 'projects', slug);\n return {\n globalRoot,\n configDir: globalRoot,\n globalConfig: path.join(globalRoot, 'config.json'),\n secretsKey: path.join(globalRoot, '.key'),\n globalMemory: path.join(globalRoot, 'memory.md'),\n globalSkills: path.join(globalRoot, 'skills'),\n globalPrompts: path.join(globalRoot, 'prompts'),\n cacheDir: path.join(globalRoot, 'cache'),\n modelsCache: path.join(globalRoot, 'cache', 'models.dev.json'),\n modelsOverlayCache: path.join(globalRoot, 'cache', 'models-overlay.json'),\n historyFile: path.join(globalRoot, 'history'),\n logFile: path.join(globalRoot, 'logs', 'wrongstack.log'),\n projectDir,\n projectCodebaseIndex: path.join(projectDir, 'codebase-index'),\n projectMemory: path.join(projectDir, 'memory.md'),\n projectSessions: path.join(projectDir, 'sessions'),\n projectTrust: path.join(projectDir, 'trust.json'),\n projectMeta: path.join(projectDir, 'meta.json'),\n projectLocalConfig: path.join(projectDir, 'config.local.json'),\n inProjectConfig: path.join(opts.projectRoot, '.wrongstack', 'config.json'),\n inProjectAgentsFile: path.join(opts.projectRoot, '.wrongstack', 'AGENTS.md'),\n inProjectSkills: path.join(opts.projectRoot, '.wrongstack', 'skills'),\n inProjectWorktrees: path.join(opts.projectRoot, '.wrongstack', 'worktrees'),\n projectHash: hash,\n projectSlug: slug,\n projectGoal: path.join(projectDir, 'goal.json'),\n projectSpecs: path.join(projectDir, 'specs'),\n projectTaskGraphs: path.join(projectDir, 'task-graphs'),\n projectSddSession: path.join(projectDir, 'sdd-session.json'),\n projectPlan: path.join(projectDir, 'plan.json'),\n projectAutophase: path.join(projectDir, 'autophase'),\n syncConfig: path.join(globalRoot, 'sync.json'),\n projectStatus: (projectHash: string) => path.join(globalRoot, 'projects', projectHash, 'status.json'),\n };\n}\n","/**\n * Mailbox — persistent inter-agent messaging system with cross-session support.\n *\n * Agents can leave notes for specific agents or broadcast to all. Each agent\n * periodically checks the mailbox or retrieves messages via tool calls.\n *\n * ## Cross-session communication\n *\n * The mailbox is stored at **project level** (`~/.wrongstack/projects/<slug>/_mailbox.jsonl`),\n * so agents in different terminal sessions / WebUI tabs working on the same\n * project can communicate live.\n *\n * ## Agent registration\n *\n * Every agent that uses the mailbox registers itself with a heartbeat.\n * Other agents can discover online agents via `getOnlineAgents()`.\n * Stale agents (no heartbeat > 60s) are pruned automatically.\n *\n * ## Read receipts\n *\n * Each message tracks per-recipient read status via a `readBy` map:\n * `{ \"agentId\": \"ISO8601\" }`. When agent X reads a message, its entry\n * is added. The WebUI shows who read what and when.\n *\n * @module mailbox-types\n */\n\n// ── Message type discriminator ───────────────────────────────────────────\n\nexport type MailboxMessageType =\n | 'note' // informational message\n | 'ask' // question / request for advice\n | 'assign' // task assignment\n | 'steer' // steering instruction (change behavior mid-task)\n | 'btw' // \"by the way\" — non-urgent info\n | 'broadcast' // sent to all agents\n | 'status' // agent status update\n | 'result' // task result / completion notice\n | 'control'; // out-of-band control signal (e.g. interrupt) — handled by\n // the agent loop, NOT folded into the conversation as content\n\n// ── Read receipt ─────────────────────────────────────────────────────────\n\n/**\n * Per-recipient read status. `readBy` maps agentId → ISO8601 timestamp of\n * when that agent first read the message. An empty map means unread by all.\n */\nexport interface ReadReceipts {\n [agentId: string]: string; // ISO8601 timestamp\n}\n\n// ── Core message ─────────────────────────────────────────────────────────\n\nexport interface MailboxMessage {\n /** Unique message id (UUID). */\n id: string;\n /** Sender agent id. */\n from: string;\n /** Recipient agent id, or '*' for broadcast. */\n to: string;\n /** Message category. */\n type: MailboxMessageType;\n /** Short subject line — one sentence. */\n subject: string;\n /** Full message content. */\n body: string;\n /** Priority — high priority messages surface first. */\n priority: 'low' | 'normal' | 'high';\n /**\n * Per-recipient read receipts. agentId → ISO8601 when they first read it.\n * Replaces the old single `read: boolean` + `readAt` fields.\n */\n readBy: ReadReceipts;\n /** Has any recipient acted on / completed this? */\n completed: boolean;\n /** Who completed it (agentId). */\n completedBy?: string | undefined;\n /** Optional summary of what happened after handling. */\n outcome?: string | undefined;\n /** ISO8601 — when the message was sent. */\n timestamp: string;\n /** ISO8601 — when the message was marked complete. */\n completedAt?: string | undefined;\n /** If this is a reply, the id of the parent message. */\n replyTo?: string | undefined;\n /** For assign-type messages — task context for agent discovery. */\n taskContext?: MailboxTaskContext | undefined;\n /** Session id of the sender. Enables cross-session communication. */\n senderSessionId?: string | undefined;\n}\n\n// ── Task context for agent discovery ─────────────────────────────────────\n\nexport interface MailboxTaskContext {\n /** The role that should handle this task (e.g. \"tech-stack\", \"audit-log\"). */\n agentRole?: string | undefined;\n /** Human-readable agent name (e.g. \"Tesla (Executor)\"). */\n agentName?: string | undefined;\n /** Task id if already assigned via coordinator. */\n taskId?: string | undefined;\n /** Current task status. */\n status?: 'pending' | 'in_progress' | 'completed' | 'failed' | undefined;\n}\n\n// ── Agent registration ──────────────────────────────────────────────────\n\nexport interface RegisteredAgent {\n /** Unique agent id. */\n agentId: string;\n /** Session id this agent belongs to. */\n sessionId: string;\n /** Human-readable name. */\n name: string;\n /** Role (e.g. \"leader\", \"tech-stack\", \"bug-hunter\"). */\n role?: string | undefined;\n /** Current status. */\n status: 'idle' | 'running' | 'streaming' | 'waiting_user' | 'error';\n /** Current tool being executed, if any. */\n currentTool?: string | undefined;\n /** Current task description. */\n currentTask?: string | undefined;\n /** Iteration count so far. */\n iterations: number;\n /** Tool calls so far. */\n toolCalls: number;\n /** ISO8601 — registered at. */\n registeredAt: string;\n /** ISO8601 — last heartbeat (updated on every mailbox op). */\n lastSeenAt: string;\n /** Which process registered this agent (PID). */\n pid: number;\n /** Where the agent is running (e.g. \"cli\", \"webui\"). */\n source?: 'cli' | 'webui' | 'mcp' | 'acp' | undefined;\n}\n\n// ── Agent status entry (for discovery) ───────────────────────────────────\n\nexport interface MailboxAgentStatus {\n /** Agent id. */\n agentId: string;\n /** Human-readable name. */\n name: string;\n /** Role. */\n role?: string | undefined;\n /** Session id. */\n sessionId: string;\n /** Current status. */\n status: 'idle' | 'running' | 'streaming' | 'waiting_user' | 'error' | 'offline';\n /** Current tool being executed, if any. */\n currentTool?: string | undefined;\n /** Current task description. */\n currentTask?: string | undefined;\n /** Iteration count so far. */\n iterations: number;\n /** Tool calls so far. */\n toolCalls: number;\n /** ISO8601 — last activity timestamp. */\n lastActivityAt: string;\n /** ISO8601 — last heartbeat. */\n lastSeenAt: string;\n /** Whether this agent is currently online (heartbeat within threshold). */\n online: boolean;\n /** Which process. */\n pid: number;\n /** Source. */\n source?: 'cli' | 'webui' | 'mcp' | 'acp' | undefined;\n}\n\n// ── Mailbox query ────────────────────────────────────────────────────────\n\nexport interface MailboxQuery {\n /** Filter by recipient agent id. */\n to?: string | undefined;\n /** Filter by sender agent id. */\n from?: string | undefined;\n /** Only messages unread by this agent. */\n unreadBy?: string | undefined;\n /** Only incomplete messages. */\n incompleteOnly?: boolean | undefined;\n /** Filter by message type. */\n type?: MailboxMessageType | undefined;\n /** Filter by priority (>= this level). */\n minPriority?: 'low' | 'normal' | 'high' | undefined;\n /** Maximum number of messages to return. */\n limit?: number | undefined;\n /** ISO8601 — only messages after this timestamp. */\n since?: string | undefined;\n}\n\n// ── Mailbox operations ───────────────────────────────────────────────────\n\n/**\n * Normalize a recipient address. `\"all\"` (any casing) is an accepted\n * spelling of the broadcast address and is canonicalized to `'*'` at send\n * time — both agents and humans reach for \"all\" naturally, and a literal\n * \"all\" recipient would otherwise be deliverable to nobody. The word is\n * therefore RESERVED: no agent may register under the base id \"all\".\n */\nexport function normalizeRecipient(to: string): string {\n return to.trim().toLowerCase() === 'all' ? '*' : to.trim();\n}\n\nexport interface MailboxSendInput {\n /** Sender agent id. */\n from: string;\n /** Recipient agent id, '*' for broadcast (alias: \"all\"). */\n to: string;\n /** Message category. */\n type: MailboxMessageType;\n /** Short subject line. */\n subject: string;\n /** Full message content. */\n body: string;\n /** Priority. Default: 'normal'. */\n priority?: 'low' | 'normal' | 'high' | undefined;\n /** If replying, the id of the parent message. */\n replyTo?: string | undefined;\n /** Task context for assign-type messages. */\n taskContext?: MailboxTaskContext | undefined;\n}\n\nexport interface MailboxAckInput {\n /** Message id to acknowledge. */\n messageId: string;\n /** Agent id of who is reading/acking. */\n readerId: string;\n /** Mark as read by this agent? Defaults to true if not specified. */\n read?: boolean | undefined;\n /** Mark as completed? */\n completed?: boolean | undefined;\n /** Optional outcome summary. */\n outcome?: string | undefined;\n}\n\n/**\n * Batch acknowledgment input — applies a batch of acks under a single file\n * lock + single file rewrite. Each entry has the same shape as\n * {@link MailboxAckInput} minus the per-batch defaults documented on\n * `ackMany`. Use this when an agent is acking several fresh messages at\n * once (the common case in the mailbox loop) — it collapses N full-file\n * rewrites into one.\n */\nexport interface MailboxAckBatchInput {\n /** Ack entries to apply. */\n acks: MailboxAckInput[];\n}\n\n// ── Agent registration input ────────────────────────────────────────────\n\nexport interface AgentRegistrationInput {\n agentId: string;\n sessionId: string;\n name: string;\n role?: string | undefined;\n pid: number;\n source?: 'cli' | 'webui' | 'mcp' | 'acp' | undefined;\n}\n\n// ── Client (REPL/TUI/WebUI) registration ─────────────────────────────────\n\nexport type ClientSource = 'repl' | 'tui' | 'webui';\n\nexport interface RegisteredClient {\n /** Unique client id. */\n clientId: string;\n /** Session/project context id. */\n sessionId: string;\n /** Human-readable name (e.g. \"TUI [main]\", \"WebUI [chrome]\"). */\n name: string;\n /** Client type. */\n source: ClientSource;\n /** ISO8601 — registered at. */\n registeredAt: string;\n /** ISO8601 — last heartbeat. */\n lastSeenAt: string;\n /** Which process. */\n pid: number;\n}\n\nexport interface ClientStatus {\n /** Client id. */\n clientId: string;\n /** Human-readable name. */\n name: string;\n /** Client type. */\n source: ClientSource;\n /** Session id. */\n sessionId: string;\n /** ISO8601 — last activity timestamp. */\n lastSeenAt: string;\n /** Whether this client is currently online (heartbeat within threshold). */\n online: boolean;\n /** Which process. */\n pid: number;\n}\n\nexport interface ClientRegistrationInput {\n clientId: string;\n sessionId: string;\n name: string;\n source: ClientSource;\n pid: number;\n}\n\nexport interface ClientHeartbeatInput {\n clientId: string;\n}\n\n// ── Agent heartbeat input ────────────────────────────────────────────────\n\nexport interface AgentHeartbeatInput {\n agentId: string;\n status?: RegisteredAgent['status'] | undefined;\n currentTool?: string | undefined;\n currentTask?: string | undefined;\n iterations?: number | undefined;\n toolCalls?: number | undefined;\n}\n\n// ── Purge options & result ───────────────────────────────────────────────\n\nexport interface PurgeOptions {\n /**\n * Purge completed messages older than this many milliseconds.\n * Default: 1 day (86_400_000 ms)\n */\n completedMaxAgeMs?: number | undefined;\n /**\n * Purge incomplete messages older than this many milliseconds.\n * Default: 7 days (604_800_000 ms)\n */\n incompleteMaxAgeMs?: number | undefined;\n}\n\nexport interface PurgeResult {\n /** Messages removed because they were completed and too old. */\n completedPurged: number;\n /** Messages removed because they were incomplete and too old. */\n incompletePurged: number;\n /** Total messages removed. */\n totalPurged: number;\n /** Messages remaining in the mailbox after purge. */\n remaining: number;\n}\n\n// ── Mailbox interface ────────────────────────────────────────────────────\n\nexport interface Mailbox {\n /** Send a message. Returns the created message. */\n send(input: MailboxSendInput): Promise<MailboxMessage>;\n\n /** Query messages matching criteria. */\n query(query: MailboxQuery): Promise<MailboxMessage[]>;\n\n /** Acknowledge a message (read/complete). Returns updated message. */\n ack(input: MailboxAckInput): Promise<MailboxMessage | null>;\n\n /**\n * Acknowledge many messages in one shot. Acquires the file lock once and\n * rewrites the message file once, regardless of how many acks are in the\n * batch. Returns the messages that were actually updated (messages whose\n * ids are not in the file are skipped silently).\n *\n * This is the preferred path when an agent has multiple fresh messages\n * to receipt at once — the per-message {@link ack} path does a full\n * read-modify-rewrite of the mailbox file for every call.\n */\n ackMany(input: MailboxAckBatchInput): Promise<MailboxMessage[]>;\n\n /** Get a snapshot of online/offline agents and their current tasks. */\n getAgentStatuses(): Promise<MailboxAgentStatus[]>;\n\n /**\n * Get only online agents (heartbeat within 60s).\n * Useful for \"who can I talk to right now?\" queries.\n */\n getOnlineAgents(): Promise<MailboxAgentStatus[]>;\n\n /**\n * Register an agent. Called once per agent on first mailbox use.\n * Subsequent calls are idempotent — they update lastSeenAt.\n */\n registerAgent(input: AgentRegistrationInput): Promise<void>;\n\n /**\n * Update agent heartbeat and optional status fields.\n * Called periodically (every tool call / iteration).\n */\n heartbeat(input: AgentHeartbeatInput): Promise<void>;\n\n /**\n * Count unread messages for a specific agent.\n * Used for \"new mail\" notifications without pulling full message bodies.\n */\n unreadCount(forAgentId: string): Promise<number>;\n\n /** Close and flush any pending writes. */\n close(): Promise<void>;\n\n /**\n * Delete all messages from the mailbox file.\n * Agents and read receipts are preserved; only messages are cleared.\n */\n clearAll(): Promise<void>;\n\n /**\n * Purge orphaned and stale messages from the mailbox.\n *\n * Stale messages are:\n * - Completed messages older than `completedMaxAgeMs` (default: 1 day)\n * - Incomplete messages older than `incompleteMaxAgeMs` (default: 7 days)\n *\n * This does NOT touch agent registrations or client registry.\n */\n purgeStale(opts?: PurgeOptions): Promise<PurgeResult>;\n\n // ── Client (REPL/TUI/WebUI) registry ──────────────────────────────────\n\n /**\n * Register a client (REPL/TUI/WebUI). Called once per client on startup.\n * Subsequent calls are idempotent — they update lastSeenAt.\n */\n registerClient(input: ClientRegistrationInput): Promise<void>;\n\n /**\n * Update client heartbeat. Called periodically (every 15s for clients).\n */\n clientHeartbeat(input: ClientHeartbeatInput): Promise<void>;\n\n /**\n * Get snapshot of online/offline clients and their last activity.\n */\n getClientStatuses(): Promise<ClientStatus[]>;\n}\n","/**\n * GlobalMailbox — project-level inter-agent mailbox with cross-session support.\n *\n * Stores messages at `~/.wrongstack/projects/<slug>/_mailbox.jsonl` so all\n * sessions (terminals, WebUIs) working on the same project share one inbox.\n *\n * Features:\n * - Agent registration + heartbeat (agents go stale after 60s without heartbeat)\n * - Per-recipient read receipts (readBy[agentId] = ISO8601)\n * - Atomic file-locking for concurrent multi-process writes\n * - Unread count for new-mail notifications\n * - Online agent list\n *\n * @module GlobalMailbox\n */\n\nimport { randomUUID } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\n\nimport * as path from 'node:path';\nimport { withFileLock } from '../utils/atomic-write.js';\nimport { projectSlug } from '../utils/wstack-paths.js';\nimport { normalizeRecipient } from './mailbox-types.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { HqPublisher } from '../hq/publisher.js';\nimport type {\n AgentHeartbeatInput,\n AgentRegistrationInput,\n ClientHeartbeatInput,\n ClientRegistrationInput,\n ClientStatus,\n Mailbox,\n MailboxAckBatchInput,\n MailboxAckInput,\n MailboxAgentStatus,\n MailboxMessage,\n MailboxQuery,\n MailboxSendInput,\n PurgeOptions,\n PurgeResult,\n RegisteredAgent,\n RegisteredClient,\n} from './mailbox-types.js';\n\n// ── Constants ────────────────────────────────────────────────────────────\n\nconst MAILBOX_FILE = '_mailbox.jsonl';\nconst CLIENT_REGISTRY_FILE = '_mailbox.clients.json';\n/** Agents without a heartbeat for this long are considered offline. */\nconst AGENT_STALE_MS = 60_000;\n/** Clients without a heartbeat for this long are considered offline. */\nconst CLIENT_STALE_MS = 60_000;\n/** Heartbeat updates are throttled to at most this interval. */\nconst HEARTBEAT_THROTTLE_MS = 5_000;\n/**\n * How long a read may be served from the in-process registry cache before\n * re-reading the shared file. Kept well below HEARTBEAT_THROTTLE_MS so\n * cross-process registrations become visible promptly.\n */\nconst REGISTRY_CACHE_TTL_MS = 2_000;\nconst LINE_SEPARATOR = '\\n';\n/**\n * Soft cap on the in-memory message cache. The cache mirrors the JSONL\n * message file; under normal load it stays well under this. If a pathological\n * mailbox exceeds the cap we fall back to reading from disk rather than\n * holding an unbounded buffer in memory.\n */\nconst MESSAGE_CACHE_MAX_ENTRIES = 10_000;\n\n/**\n * Derive the project-level mailbox directory path.\n *\n * Delegates to the CANONICAL `projectSlug()` from wstack-paths so every\n * surface (CLI, TUI, WebUI, mailbox tool, loop checker) lands in the exact\n * same `~/.wrongstack/projects/<slug>/` directory. A previous inline copy\n * skipped the leading/trailing-hyphen strip, which silently split agents\n * working on projects with non-alphanumeric name edges into TWO mailboxes.\n *\n * @param projectRoot — absolute path to the project root\n * @param globalRoot — `~/.wrongstack` (or custom global root)\n */\nexport function resolveProjectDir(projectRoot: string, globalRoot: string): string {\n return path.join(globalRoot, 'projects', projectSlug(projectRoot));\n}\n\n// ── GlobalMailbox ────────────────────────────────────────────────────────\n\nexport class GlobalMailbox implements Mailbox {\n /** Path to the JSONL message file. */\n readonly messagePath: string;\n /** Path to the JSON agent registry file. */\n readonly registryPath: string;\n /** Path to the JSON client registry file. */\n readonly clientRegistryPath: string;\n /** Optional event bus for emitting agent registration/heartbeat events. */\n private readonly _events?: EventBus | undefined;\n /** Optional HQ publisher for cross-project command-center telemetry. */\n private readonly _hqPublisher?: HqPublisher | undefined;\n /**\n * Local cache of the agent registry to avoid re-reading on every call.\n * Time-bounded: the registry file is shared ACROSS PROCESSES (that's the\n * whole point of GlobalMailbox), so a cache served forever would never see\n * agents registered by other sessions. Writers always bypass it.\n */\n private _registryCache: Map<string, RegisteredAgent> | null = null;\n /** When the registry cache was last refreshed from disk (epoch ms). */\n private _registryCacheAt = 0;\n /**\n * Local cache of the client registry to avoid re-reading on every call.\n * Same reasoning as agent registry cache.\n */\n private _clientRegistryCache: Map<string, RegisteredClient> | null = null;\n /** When the client registry cache was last refreshed from disk (epoch ms). */\n private _clientRegistryCacheAt = 0;\n /** Last time each local agent sent a heartbeat (throttle). */\n private _lastHeartbeat = new Map<string, number>();\n /** Last time each local client sent a heartbeat (throttle). */\n private _lastClientHeartbeat = new Map<string, number>();\n /**\n * In-memory mirror of the JSONL message file. The mailbox is shared\n * ACROSS PROCESSES, so reads cannot trust the cache blindly — we pair it\n * with an mtime check. The file lock serializes every write, so a\n * changed mtimeMs is a definitive signal that another process (or this\n * one) wrote; an unchanged mtimeMs guarantees no write happened and the\n * cache is current. This collapses the per-iteration `query()` cost from\n * O(file_size) disk + parse to O(messages) in memory.\n */\n private _messageCache: MailboxMessage[] | null = null;\n /** mtimeMs of the file when `_messageCache` was populated. */\n private _messageCacheMtime = -1;\n /** Size of the file when `_messageCache` was populated (extra guard). */\n private _messageCacheSize = -1;\n\n /**\n * @param projectDir — `~/.wrongstack/projects/<slug>/`\n * @param events — optional EventBus for real-time TUI/WebUI notifications\n * @param hqPublisher — optional HQ publisher for cross-project telemetry\n */\n constructor(projectDir: string, events?: EventBus, hqPublisher?: HqPublisher) {\n this.messagePath = path.join(projectDir, MAILBOX_FILE);\n this.registryPath = path.join(projectDir, '_mailbox.registry.json');\n this.clientRegistryPath = path.join(projectDir, CLIENT_REGISTRY_FILE);\n this._events = events;\n this._hqPublisher = hqPublisher;\n }\n\n private get hqMailboxId(): string {\n return `${path.basename(path.dirname(this.messagePath))}:mailbox`;\n }\n\n private publishHqMailboxEvent(input: Parameters<HqPublisher['publishMailboxEvent']>[0]): void {\n try {\n this._hqPublisher?.publishMailboxEvent(input);\n } catch {\n // HQ telemetry is best-effort and must never affect mailbox behavior.\n }\n }\n\n private publishHqMailboxSnapshot(): void {\n if (this._hqPublisher === undefined) return;\n void this._hqPublisher.publishMailboxSnapshot(this, { mailboxId: this.hqMailboxId }).catch(() => {\n // HQ telemetry is best-effort and must never affect mailbox behavior.\n });\n }\n\n // ── Messages ────────────────────────────────────────────────────────────\n\n async send(input: MailboxSendInput): Promise<MailboxMessage> {\n const now = new Date().toISOString();\n const msg: MailboxMessage = {\n id: randomUUID(),\n from: input.from,\n // \"all\" is an accepted spelling of the broadcast address — canonical\n // form on disk is '*' so every query/checker matches it.\n to: normalizeRecipient(input.to),\n type: input.type,\n subject: input.subject,\n body: input.body,\n priority: input.priority ?? 'normal',\n readBy: {},\n completed: false,\n timestamp: now,\n replyTo: input.replyTo,\n taskContext: input.taskContext,\n };\n\n const line = JSON.stringify(msg) + LINE_SEPARATOR;\n await fsp.mkdir(path.dirname(this.messagePath), { recursive: true });\n // The append must hold the same lock ack() rewrites under: an unlocked\n // append racing ack's read→rewrite gets silently erased when the rewrite\n // lands. This file is shared ACROSS PROCESSES, so the window is real.\n await withFileLock(this.messagePath, async () => {\n await fsp.appendFile(this.messagePath, line, 'utf8');\n // Refresh the in-memory cache from the message we just appended —\n // cheaper than re-reading the whole file, and correct because we\n // held the lock so nothing else changed underneath us.\n this._pushToCache(msg);\n });\n\n this.publishHqMailboxEvent({ mailboxId: this.hqMailboxId, action: 'message.sent', message: msg });\n this.publishHqMailboxSnapshot();\n return msg;\n }\n\n async query(q: MailboxQuery): Promise<MailboxMessage[]> {\n const all = await this._readMessagesCached();\n const limit = q.limit ?? 50;\n\n // Single-pass filter — previously 7 chained .filter() allocations each\n // producing a fresh array. Predicates are independent, so we can AND\n // them in one walk and short-circuit per element.\n const order = q.minPriority !== undefined\n ? { low: 0, normal: 1, high: 2 } as const\n : null;\n const minPriorityRank = order && q.minPriority !== undefined ? order[q.minPriority] : 0;\n const out: MailboxMessage[] = [];\n for (let i = 0; i < all.length; i++) {\n const m = all[i]!;\n if (q.to !== undefined && m.to !== q.to && m.to !== '*') continue;\n if (q.from !== undefined && m.from !== q.from) continue;\n if (q.unreadBy !== undefined && q.unreadBy in m.readBy) continue;\n if (q.incompleteOnly && m.completed) continue;\n if (q.type !== undefined && m.type !== q.type) continue;\n if (\n order !== null &&\n (order[m.priority as keyof typeof order] ?? 1) < minPriorityRank!\n ) {\n continue;\n }\n if (q.since !== undefined && m.timestamp <= q.since) continue;\n out.push(m);\n }\n\n out.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n // Return defensive shallow copies so callers cannot mutate the shared\n // cache entries. Only the returned slice is copied — O(limit), not O(N).\n return out.slice(0, limit).map((m) => ({ ...m, readBy: { ...m.readBy } }));\n }\n\n async ack(input: MailboxAckInput): Promise<MailboxMessage | null> {\n const updated = await this.ackMany({ acks: [input] });\n return updated.length > 0 ? updated[0]! : null;\n }\n\n async ackMany(input: MailboxAckBatchInput): Promise<MailboxMessage[]> {\n // One lock acquisition + one file rewrite for the whole batch. The\n // previous per-message ack() did a full read-modify-rewrite for every\n // single ack — N fresh messages meant N full-file rewrites in a row.\n if (input.acks.length === 0) return [];\n\n const updated: MailboxMessage[] = [];\n const byId = new Map<string, MailboxAckInput>();\n for (const a of input.acks) {\n // Last-write-wins within the batch for the same messageId — matches\n // the prior sequential semantics where later acks overrode earlier.\n byId.set(a.messageId, a);\n }\n\n let cacheSnapshot: MailboxMessage[] | null = null;\n await withFileLock(this.messagePath, async () => {\n // Read fresh under the lock — the cache may be stale relative to\n // other processes that wrote since our last read.\n const all = await this._readMessagesFresh();\n const now = new Date().toISOString();\n let changed = false;\n\n for (const msg of all) {\n const a = byId.get(msg.id);\n if (!a) continue;\n // Preserve prior semantics: return the message as long as it was\n // found, even if the ack was a no-op (e.g. already read).\n updated.push(msg);\n if (a.read !== false && !(a.readerId in msg.readBy)) {\n msg.readBy[a.readerId] = now;\n changed = true;\n }\n if (a.completed && !msg.completed) {\n msg.completed = true;\n msg.completedBy = a.readerId;\n msg.completedAt = now;\n changed = true;\n }\n if (a.outcome !== undefined && msg.outcome !== a.outcome) {\n msg.outcome = a.outcome;\n changed = true;\n }\n }\n\n // Only rewrite the file if at least one ack actually mutated state —\n // a re-ack of an already-read message is now a no-op on disk, where\n // previously it was a full rewrite.\n if (changed) {\n const serialized =\n all.map((m) => JSON.stringify(m)).join(LINE_SEPARATOR) + LINE_SEPARATOR;\n await fsp.writeFile(this.messagePath, serialized, 'utf8');\n }\n // We always hold the authoritative post-read snapshot (we read fresh\n // under the lock), so adopt it as the cache regardless of whether we\n // wrote — future queries skip both the stat and the parse.\n cacheSnapshot = all;\n });\n\n // Promote the freshly-read array to the cache without re-reading.\n if (cacheSnapshot) this._setMessageCache(cacheSnapshot);\n for (const message of updated) {\n this.publishHqMailboxEvent({\n mailboxId: this.hqMailboxId,\n action: message.completed ? 'message.completed' : 'message.read',\n message,\n });\n }\n if (updated.length > 0) this.publishHqMailboxSnapshot();\n return updated;\n }\n\n async unreadCount(forAgentId: string): Promise<number> {\n const all = await this._readMessagesCached();\n let count = 0;\n for (let i = 0; i < all.length; i++) {\n const m = all[i]!;\n if ((m.to === forAgentId || m.to === '*') && !(forAgentId in m.readBy) && !m.completed) {\n count++;\n }\n }\n return count;\n }\n\n // ── Agent registry ──────────────────────────────────────────────────────\n\n async registerAgent(input: AgentRegistrationInput): Promise<void> {\n await this._ensureRegistry();\n const now = new Date().toISOString();\n const agent: RegisteredAgent = {\n agentId: input.agentId,\n sessionId: input.sessionId,\n name: input.name,\n role: input.role,\n status: 'idle',\n currentTool: undefined,\n currentTask: undefined,\n iterations: 0,\n toolCalls: 0,\n registeredAt: now,\n lastSeenAt: now,\n pid: input.pid,\n source: input.source,\n };\n\n await withFileLock(this.registryPath, async () => {\n // fresh: read-modify-write must start from the on-disk state, not the\n // cache — other processes may have registered agents since.\n const registry = await this._readRegistry({ fresh: true });\n // Prune stale agents\n this._pruneStaleInPlace(registry);\n // Upsert\n registry.set(input.agentId, agent);\n // Update cache\n this._registryCache = registry;\n this._registryCacheAt = Date.now();\n await this._writeRegistry(registry);\n });\n\n // Emit event for TUI/WebUI to update online agent count\n this._events?.emitCustom('mailbox.agent_registered', {\n agentId: input.agentId, sessionId: input.sessionId,\n name: input.name, role: input.role, source: input.source,\n });\n this.publishHqMailboxEvent({\n mailboxId: this.hqMailboxId,\n action: 'agent.registered',\n agent: {\n agentId: input.agentId,\n name: input.name,\n ...(input.role !== undefined ? { role: input.role } : {}),\n sessionId: input.sessionId,\n status: 'idle',\n iterations: 0,\n toolCalls: 0,\n lastActivityAt: now,\n lastSeenAt: now,\n online: true,\n pid: input.pid,\n ...(input.source !== undefined ? { source: input.source } : {}),\n },\n });\n this.publishHqMailboxSnapshot();\n }\n\n async heartbeat(input: AgentHeartbeatInput): Promise<void> {\n // Throttle: at most one heartbeat per agent per HEARTBEAT_THROTTLE_MS\n const last = this._lastHeartbeat.get(input.agentId) ?? 0;\n const now = Date.now();\n if (now - last < HEARTBEAT_THROTTLE_MS) return;\n\n this._lastHeartbeat.set(input.agentId, now);\n\n await this._ensureRegistry();\n\n await withFileLock(this.registryPath, async () => {\n // fresh: see registerAgent — never read-modify-write from the cache.\n const registry = await this._readRegistry({ fresh: true });\n this._pruneStaleInPlace(registry);\n\n const agent = registry.get(input.agentId);\n if (agent) {\n const iso = new Date().toISOString();\n agent.lastSeenAt = iso;\n if (input.status !== undefined) agent.status = input.status;\n if (input.currentTool !== undefined) agent.currentTool = input.currentTool;\n if (input.currentTask !== undefined) agent.currentTask = input.currentTask;\n if (input.iterations !== undefined) agent.iterations = input.iterations;\n if (input.toolCalls !== undefined) agent.toolCalls = input.toolCalls;\n }\n // If agent not registered yet, silently skip — registerAgent first\n\n this._registryCache = registry;\n this._registryCacheAt = Date.now();\n await this._writeRegistry(registry);\n });\n\n // Emit event so TUI/WebUI can track online agents in real time\n this._events?.emitCustom('mailbox.agent_heartbeat', {\n agentId: input.agentId,\n status: input.status,\n currentTool: input.currentTool,\n currentTask: input.currentTask,\n });\n this.publishHqMailboxEvent({\n mailboxId: this.hqMailboxId,\n action: 'agent.heartbeat',\n summary: input.agentId,\n });\n this.publishHqMailboxSnapshot();\n }\n\n async getAgentStatuses(): Promise<MailboxAgentStatus[]> {\n await this._ensureRegistry();\n const registry = await this._readRegistry();\n this._pruneStaleInPlace(registry);\n\n const now = Date.now();\n return Array.from(registry.values())\n .map((a) => ({\n agentId: a.agentId,\n name: a.name,\n role: a.role,\n sessionId: a.sessionId,\n status: a.status,\n currentTool: a.currentTool,\n currentTask: a.currentTask,\n iterations: a.iterations,\n toolCalls: a.toolCalls,\n lastActivityAt: a.lastSeenAt,\n lastSeenAt: a.lastSeenAt,\n online: now - new Date(a.lastSeenAt).getTime() < AGENT_STALE_MS,\n pid: a.pid,\n source: a.source,\n }))\n .sort((a, b) => b.lastSeenAt.localeCompare(a.lastSeenAt));\n }\n\n async getOnlineAgents(): Promise<MailboxAgentStatus[]> {\n const all = await this.getAgentStatuses();\n return all.filter((a) => a.online);\n }\n\n // ── Client registry ─────────────────────────────────────────────────────\n\n async registerClient(input: ClientRegistrationInput): Promise<void> {\n await this._ensureClientRegistry();\n const now = new Date().toISOString();\n const client: RegisteredClient = {\n clientId: input.clientId,\n sessionId: input.sessionId,\n name: input.name,\n source: input.source,\n registeredAt: now,\n lastSeenAt: now,\n pid: input.pid,\n };\n\n await withFileLock(this.clientRegistryPath, async () => {\n const registry = await this._readClientRegistry({ fresh: true });\n this._pruneStaleClientsInPlace(registry);\n registry.set(input.clientId, client);\n this._clientRegistryCache = registry;\n this._clientRegistryCacheAt = Date.now();\n await this._writeClientRegistry(registry);\n });\n\n // Emit event for TUI/WebUI to update online client count\n this._events?.emitCustom('mailbox.client_registered', {\n clientId: input.clientId,\n sessionId: input.sessionId,\n name: input.name,\n source: input.source,\n });\n }\n\n async clientHeartbeat(input: ClientHeartbeatInput): Promise<void> {\n // Throttle: at most one heartbeat per client per HEARTBEAT_THROTTLE_MS\n const last = this._lastClientHeartbeat.get(input.clientId) ?? 0;\n const now = Date.now();\n if (now - last < HEARTBEAT_THROTTLE_MS) return;\n\n this._lastClientHeartbeat.set(input.clientId, now);\n\n await this._ensureClientRegistry();\n\n await withFileLock(this.clientRegistryPath, async () => {\n const registry = await this._readClientRegistry({ fresh: true });\n this._pruneStaleClientsInPlace(registry);\n\n const client = registry.get(input.clientId);\n if (client) {\n client.lastSeenAt = new Date().toISOString();\n }\n\n this._clientRegistryCache = registry;\n this._clientRegistryCacheAt = Date.now();\n await this._writeClientRegistry(registry);\n });\n\n // Emit event so TUI/WebUI can track online clients in real time\n this._events?.emitCustom('mailbox.client_heartbeat', {\n clientId: input.clientId,\n });\n }\n\n async getClientStatuses(): Promise<ClientStatus[]> {\n await this._ensureClientRegistry();\n const registry = await this._readClientRegistry();\n this._pruneStaleClientsInPlace(registry);\n\n const now = Date.now();\n return Array.from(registry.values())\n .map((c) => ({\n clientId: c.clientId,\n name: c.name,\n source: c.source,\n sessionId: c.sessionId,\n lastSeenAt: c.lastSeenAt,\n online: now - new Date(c.lastSeenAt).getTime() < CLIENT_STALE_MS,\n pid: c.pid,\n }))\n .sort((a, b) => b.lastSeenAt.localeCompare(a.lastSeenAt));\n }\n\n // ── Lifecycle ───────────────────────────────────────────────────────────\n\n async close(): Promise<void> {\n // JSONL append-only — no flush needed\n this._registryCache = null;\n this._clientRegistryCache = null;\n this._messageCache = null;\n this._messageCacheMtime = -1;\n this._messageCacheSize = -1;\n }\n\n async clearAll(): Promise<void> {\n // Truncate the mailbox file under the same lock that protects append/ack.\n await withFileLock(this.messagePath, async () => {\n await fsp.writeFile(this.messagePath, '', 'utf8');\n });\n // Reflect the empty mailbox in the cache without a re-read.\n this._setMessageCache([]);\n }\n\n async purgeStale(opts?: PurgeOptions): Promise<PurgeResult> {\n const COMPLETED_MAX_AGE_MS = opts?.completedMaxAgeMs ?? 86_400_000; // 1 day\n const INCOMPLETE_MAX_AGE_MS = opts?.incompleteMaxAgeMs ?? 604_800_000; // 7 days\n\n let completedPurged = 0;\n let incompletePurged = 0;\n let remaining = 0;\n\n // Read-modify-write under the lock — same pattern as ack().\n await withFileLock(this.messagePath, async () => {\n const all = await this._readMessagesFresh();\n const now = Date.now();\n const cutoffCompleted = now - COMPLETED_MAX_AGE_MS;\n const cutoffIncomplete = now - INCOMPLETE_MAX_AGE_MS;\n\n const kept: MailboxMessage[] = [];\n\n for (const msg of all) {\n const msgTime = new Date(msg.timestamp).getTime();\n const completedTime = msg.completedAt ? new Date(msg.completedAt).getTime() : 0;\n\n if (msg.completed && completedTime < cutoffCompleted) {\n completedPurged++;\n continue; // drop\n }\n if (!msg.completed && msgTime < cutoffIncomplete) {\n incompletePurged++;\n continue; // drop\n }\n\n kept.push(msg);\n }\n remaining = kept.length;\n\n // Rewrite only if something changed\n if (kept.length < all.length) {\n const content = kept.map((m) => JSON.stringify(m)).join(LINE_SEPARATOR) + LINE_SEPARATOR;\n await fsp.writeFile(this.messagePath, content, 'utf8');\n }\n // Either way we just read fresh under the lock, so adopt the kept\n // snapshot (== all when nothing was purged) as the cache.\n this._setMessageCache(kept);\n });\n\n return {\n completedPurged,\n incompletePurged,\n totalPurged: completedPurged + incompletePurged,\n remaining,\n };\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n /**\n * Read all messages from the JSONL file. Always reads + parses the file.\n * Callers that can tolerate a stale-by-mtime view should use\n * {@link _readMessagesCached}; writers that need the post-lock truth\n * should call this directly (it's what {@link _readMessagesFresh} aliases).\n */\n private async _readMessages(): Promise<MailboxMessage[]> {\n try {\n const raw = await fsp.readFile(this.messagePath, 'utf8');\n const lines = raw.split(LINE_SEPARATOR).filter((l) => l.trim().length > 0);\n const messages: MailboxMessage[] = [];\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n // Migrate old `read: boolean` + `readAt` to new `readBy`\n if (!parsed['readBy']) {\n const readBy: Record<string, unknown> = {};\n if (parsed['read'] && parsed['readAt']) {\n readBy[parsed['to'] as string] = parsed['readAt'];\n }\n parsed['readBy'] = readBy;\n delete parsed['read'];\n delete parsed['readAt'];\n }\n messages.push(parsed as unknown as MailboxMessage);\n } catch {\n // Skip malformed lines\n }\n }\n return messages;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n }\n\n /**\n * Read messages, then adopt the result as the in-memory cache. Use this\n * from writers that just took the file lock — the read reflects the\n * authoritative post-lock state and should be served to subsequent\n * queries without re-reading.\n */\n private async _readMessagesFresh(): Promise<MailboxMessage[]> {\n const all = await this._readMessages();\n this._setMessageCache(all);\n return all;\n }\n\n /**\n * Read messages, consulting the mtime-bounded in-memory cache first.\n * The mailbox file is shared across processes; every `send`/`ack`/\n * `clearAll`/`purgeStale` takes the file lock, so writes are serialized\n * and a changed mtimeMs is a definitive freshness signal. When the\n * stat matches the cached mtime+size we return the cached array — no\n * file read and no JSON.parse — collapsing the per-iteration query\n * cost on the mailbox-loop hot path.\n */\n private async _readMessagesCached(): Promise<MailboxMessage[]> {\n // Hot path: cache populated and the file hasn't changed since we\n // populated it. `stat` is a single inode lookup; everything after the\n // early return is pure memory.\n try {\n const st = await fsp.stat(this.messagePath);\n if (\n this._messageCache !== null &&\n this._messageCacheMtime === st.mtimeMs &&\n this._messageCacheSize === st.size\n ) {\n return this._messageCache;\n }\n const all = await this._readMessages();\n this._setMessageCache(all, st.mtimeMs, st.size);\n return all;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n this._setMessageCache([], -1, -1);\n return [];\n }\n throw err;\n }\n }\n\n /**\n * Replace the in-memory cache. Caller is responsible for guaranteeing\n * that `messages` reflects the current on-disk state (e.g. they just\n * read or wrote it under the file lock).\n */\n private _setMessageCache(\n messages: MailboxMessage[],\n mtime?: number,\n size?: number,\n ): void {\n // Bound the cache so a runaway mailbox can't balloon memory. The cap\n // is high enough that any realistic project mailbox fits; if it ever\n // exceeds the cap we just refuse to cache and the next read goes to\n // disk (the unoptimized but correct behavior).\n if (messages.length > MESSAGE_CACHE_MAX_ENTRIES) {\n this._messageCache = null;\n this._messageCacheMtime = -1;\n this._messageCacheSize = -1;\n return;\n }\n this._messageCache = messages;\n // When the caller didn't supply an mtime (e.g. in-memory promotion\n // after a write we already did), we re-stat to capture the post-write\n // mtimeMs lazily so the next cached read validates against reality.\n if (mtime !== undefined && size !== undefined) {\n this._messageCacheMtime = mtime;\n this._messageCacheSize = size;\n } else {\n // Fire-and-forget stat to refresh the mtime tracker. Failures just\n // leave the previous values; the worst case is an extra cache miss.\n void fsp\n .stat(this.messagePath)\n .then((st) => {\n this._messageCacheMtime = st.mtimeMs;\n this._messageCacheSize = st.size;\n })\n .catch(() => {\n /* leave cache in place; next read will re-stat */\n });\n }\n }\n\n /**\n * Append a single just-sent message to the in-memory cache without\n * re-reading the file. The caller must hold the file lock (or have\n * just released it after a successful append) so the cache stays\n * consistent with on-disk state.\n */\n private _pushToCache(msg: MailboxMessage): void {\n if (this._messageCache === null) return;\n if (this._messageCache.length >= MESSAGE_CACHE_MAX_ENTRIES) {\n this._messageCache = null;\n this._messageCacheMtime = -1;\n this._messageCacheSize = -1;\n return;\n }\n // The cache holds shared message objects; we mirror the on-disk line\n // by storing the same reference. Callers of `query()` get defensive\n // copies, so this shared reference is safe.\n this._messageCache.push(msg);\n // Defer the mtime refresh — the just-released lock will have advanced\n // mtime, but we'll re-stat lazily on the next cache validation.\n }\n\n private async _ensureRegistry(): Promise<void> {\n await fsp.mkdir(path.dirname(this.registryPath), { recursive: true });\n }\n\n private async _readRegistry(opts?: { fresh?: boolean }): Promise<Map<string, RegisteredAgent>> {\n // The registry file is shared across processes. Reads may use a short\n // TTL cache; writers (under the file lock) MUST pass { fresh: true } —\n // a read-modify-write from a stale cache would silently erase agents\n // registered by other sessions.\n if (\n !opts?.fresh &&\n this._registryCache &&\n Date.now() - this._registryCacheAt < REGISTRY_CACHE_TTL_MS\n ) {\n return new Map(this._registryCache);\n }\n\n try {\n const raw = await fsp.readFile(this.registryPath, 'utf8');\n const data = JSON.parse(raw) as Record<string, RegisteredAgent>;\n // Parse lastSeenAt strings back into objects\n const map = new Map<string, RegisteredAgent>();\n for (const [id, agent] of Object.entries(data)) {\n map.set(id, agent as RegisteredAgent);\n }\n this._registryCache = map;\n this._registryCacheAt = Date.now();\n return new Map(map);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n const empty = new Map<string, RegisteredAgent>();\n this._registryCache = empty;\n this._registryCacheAt = Date.now();\n return empty;\n }\n throw err;\n }\n }\n\n private _pruneStaleInPlace(registry: Map<string, RegisteredAgent>): void {\n const cutoff = Date.now() - AGENT_STALE_MS;\n for (const agent of registry.values()) {\n if (new Date(agent.lastSeenAt).getTime() < cutoff) {\n agent.status = 'idle'; // preserve entry but mark as offline\n // Note: we don't delete — the WebUI wants to show recently-offline agents\n }\n }\n }\n\n private async _writeRegistry(registry: Map<string, RegisteredAgent>): Promise<void> {\n const obj: Record<string, RegisteredAgent> = {};\n for (const [id, agent] of registry) {\n obj[id] = agent;\n }\n const tmp = `${this.registryPath}.${randomUUID().slice(0, 8)}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(obj, null, 2), 'utf8');\n await fsp.rename(tmp, this.registryPath);\n }\n\n // ── Client registry internals ───────────────────────────────────────────\n\n private async _ensureClientRegistry(): Promise<void> {\n await fsp.mkdir(path.dirname(this.clientRegistryPath), { recursive: true });\n }\n\n private async _readClientRegistry(\n opts?: { fresh?: boolean },\n ): Promise<Map<string, RegisteredClient>> {\n if (\n !opts?.fresh &&\n this._clientRegistryCache &&\n Date.now() - this._clientRegistryCacheAt < REGISTRY_CACHE_TTL_MS\n ) {\n return new Map(this._clientRegistryCache);\n }\n\n try {\n const raw = await fsp.readFile(this.clientRegistryPath, 'utf8');\n const data = JSON.parse(raw) as Record<string, RegisteredClient>;\n const map = new Map<string, RegisteredClient>();\n for (const [id, client] of Object.entries(data)) {\n map.set(id, client as RegisteredClient);\n }\n this._clientRegistryCache = map;\n this._clientRegistryCacheAt = Date.now();\n return new Map(map);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n const empty = new Map<string, RegisteredClient>();\n this._clientRegistryCache = empty;\n this._clientRegistryCacheAt = Date.now();\n return empty;\n }\n throw err;\n }\n }\n\n private _pruneStaleClientsInPlace(registry: Map<string, RegisteredClient>): void {\n const cutoff = Date.now() - CLIENT_STALE_MS;\n for (const client of registry.values()) {\n if (new Date(client.lastSeenAt).getTime() < cutoff) {\n // Mark as offline but preserve entry\n client.lastSeenAt = new Date(cutoff).toISOString();\n }\n }\n }\n\n private async _writeClientRegistry(registry: Map<string, RegisteredClient>): Promise<void> {\n const obj: Record<string, RegisteredClient> = {};\n for (const [id, client] of registry) {\n obj[id] = client;\n }\n const tmp = `${this.clientRegistryPath}.${randomUUID().slice(0, 8)}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(obj, null, 2), 'utf8');\n await fsp.rename(tmp, this.clientRegistryPath);\n }\n}\n","/**\n * HQ auth-store — persistent `auth.json` for the HQ command center.\n *\n * Phase 4 scope:\n * - Operator-configured redaction policy override (applied server-side\n * even when a publisher claims rawContent:true).\n * - Browser tokens (Phase 3) + client tokens (Phase 4). Separate lists so\n * a browser-only token cannot be replayed on /ws/client and vice versa.\n * - Live reload hook: callers can `watchHqAuthFile()` to re-read on change.\n *\n * Storage layout (under the HQ data directory, default `~/.wrongstack/hq/`):\n * <dataDir>/auth.json — this file (atomic write, mode 0o600)\n * <dataDir>/events.jsonl — reserved for future persistent event log\n * <dataDir>/snapshot.json — reserved for future persisted snapshot\n *\n * The file is written atomically (tmp + rename) with mode 0o600 so a\n * shared host cannot read issued tokens or the redaction policy. Reads\n * are lenient: a missing file yields an empty document; a corrupt file\n * yields an empty document plus a warning so the operator can recover.\n *\n * @module hq/auth-store\n */\nimport { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as syncFs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { wstackGlobalRoot } from '../utils/wstack-paths.js';\nimport type { HqRedactionPolicy } from './protocol.js';\n\n/** Current auth-file schema version. Bump on breaking shape changes. */\nexport const HQ_AUTH_FILE_VERSION = 1 as const;\n\n/** Default HQ data directory: `~/.wrongstack/hq` (honors WRONGSTACK_HOME). */\nexport function defaultHqDataDir(): string {\n return path.join(wstackGlobalRoot(), 'hq');\n}\n\n/**\n * Resolve an HQ data directory from an optional override.\n *\n * Resolution order:\n * 1. Explicit `override` (from `--data-dir`) — resolved against\n * `process.cwd()` if relative.\n * 2. `WRONGSTACK_HQ_DATA_DIR` env var (same resolution rules).\n * 3. `defaultHqDataDir()` — `~/.wrongstack/hq`.\n *\n * The env var exists so tests (and sandboxed runs) can redirect HQ state\n * away from the real user home without threading a CLI flag everywhere.\n */\nexport function resolveHqDataDir(override?: string, env: NodeJS.ProcessEnv = process.env): string {\n const raw = override ?? env['WRONGSTACK_HQ_DATA_DIR']?.trim();\n if (!raw) return defaultHqDataDir();\n return path.isAbsolute(raw) ? path.resolve(raw) : path.resolve(process.cwd(), raw);\n}\n\n/**\n * A generic HQ-issued token. Used for both browser tokens (validated on\n * `/ws/browser`) and client tokens (validated on `/ws/client`). The two\n * are stored in separate lists so a browser-only token cannot be replayed\n * against the client channel and vice versa.\n */\nexport interface HqToken {\n id: string;\n token: string;\n label?: string;\n createdAt: string;\n lastUsedAt?: string;\n}\n\n/**\n * Alias kept for backward-compat with Phase 3 callers/tests. New code\n * should prefer `HqToken`.\n */\nexport type HqBrowserToken = HqToken;\n\n/** On-disk shape of `<dataDir>/auth.json`. */\nexport interface HqAuthFile {\n version: typeof HQ_AUTH_FILE_VERSION;\n updatedAt: string;\n /**\n * Operator-configured redaction policy override. When present, the HQ\n * server applies these settings AFTER any publisher-declared policy —\n * i.e. the operator can always tighten, never loosen.\n */\n redactionPolicy?: Partial<HqRedactionPolicy>;\n /** Browser tokens — validated on `/ws/browser` upgrades (Phase 3). */\n browserTokens?: HqToken[];\n /** Client tokens — validated on `/ws/client` upgrades (Phase 4). */\n clientTokens?: HqToken[];\n}\n\n/** An empty auth file — what a brand-new HQ install starts with. */\nexport function emptyHqAuthFile(): HqAuthFile {\n return {\n version: HQ_AUTH_FILE_VERSION,\n updatedAt: new Date().toISOString(),\n };\n}\n\n/** Path to `auth.json` under the given data directory. */\nexport function hqAuthFilePath(dataDir: string): string {\n return path.join(dataDir, 'auth.json');\n}\n\n/**\n * Read `auth.json` from disk. Returns `emptyHqAuthFile()` when:\n * - the file does not exist (ENOENT), or\n * - the file cannot be parsed (the `warn` callback surfaces the error).\n *\n * Never throws for routine I/O — a missing or corrupt auth file should not\n * prevent the HQ server from starting. The operator can recover by editing\n * or deleting the file.\n */\nexport async function readHqAuthFile(\n dataDir: string,\n opts: { warn?: (msg: string) => void } = {},\n): Promise<HqAuthFile> {\n const file = hqAuthFilePath(dataDir);\n let raw: string;\n try {\n raw = await fs.readFile(file, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return emptyHqAuthFile();\n // Non-ENOENT (EACCES, EIO, …) — surface but don't crash startup.\n opts.warn?.(`HQ auth file read failed at ${file}: ${(err as Error).message}`);\n return emptyHqAuthFile();\n }\n try {\n const parsed = JSON.parse(raw) as HqAuthFile;\n if (parsed.version !== HQ_AUTH_FILE_VERSION) {\n opts.warn?.(\n `HQ auth file at ${file} has unsupported version ${String(parsed.version)} (expected ${String(HQ_AUTH_FILE_VERSION)}); ignoring stored policy/tokens.`,\n );\n return emptyHqAuthFile();\n }\n return parsed;\n } catch (err) {\n opts.warn?.(`HQ auth file at ${file} is not valid JSON; ignoring stored policy/tokens: ${(err as Error).message}`);\n return emptyHqAuthFile();\n }\n}\n\n/**\n * Write `auth.json` atomically with mode 0o600. Creates the data directory\n * if needed. Throws on I/O failure — callers (CLI commands) should surface\n * the error to the operator.\n */\nexport async function writeHqAuthFile(dataDir: string, file: HqAuthFile): Promise<void> {\n const target = hqAuthFilePath(dataDir);\n const payload: HqAuthFile = {\n ...file,\n version: HQ_AUTH_FILE_VERSION,\n updatedAt: new Date().toISOString(),\n };\n await atomicWrite(target, `${JSON.stringify(payload, null, 2)}\\n`, { mode: 0o600 });\n}\n\nexport interface EnsureHqFirstRunAuthResult {\n authFile: HqAuthFile;\n created: boolean;\n browserToken?: HqToken;\n clientToken?: HqToken;\n}\n\n/**\n * Ensure a brand-new HQ data directory has the auth required for safe\n * first-run operation. Only a missing auth.json is bootstrapped; an existing\n * file, including one with empty token arrays, is treated as operator intent.\n */\nexport async function ensureHqFirstRunAuthFile(\n dataDir: string,\n opts: { warn?: (msg: string) => void } = {},\n): Promise<EnsureHqFirstRunAuthResult> {\n const file = hqAuthFilePath(dataDir);\n try {\n await fs.access(file);\n return { authFile: await readHqAuthFile(dataDir, opts), created: false };\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n opts.warn?.(`HQ auth file access failed at ${file}: ${(err as Error).message}`);\n return { authFile: await readHqAuthFile(dataDir, opts), created: false };\n }\n }\n\n const browserToken = mintHqToken('first-run browser');\n const clientToken = mintHqToken('first-run client');\n const authFile: HqAuthFile = {\n version: HQ_AUTH_FILE_VERSION,\n updatedAt: new Date().toISOString(),\n browserTokens: [browserToken],\n clientTokens: [clientToken],\n };\n await writeHqAuthFile(dataDir, authFile);\n return { authFile: await readHqAuthFile(dataDir, opts), created: true, browserToken, clientToken };\n}\n\n/**\n * Load → mutate → write. The mutator receives the current file (or an empty\n * one) and returns the next file. Use this for any read-modify-write cycle\n * to avoid clobbering concurrent edits from another CLI invocation.\n *\n * Note: this does NOT take a file lock. HQ auth edits are rare (operator\n * running `wstack --hq-token add` etc.) and the atomic rename protects\n * against torn writes; a race between two concurrent edits would be\n * last-write-wins, which is acceptable for this low-frequency file.\n */\nexport async function mutateHqAuthFile(\n dataDir: string,\n mutator: (current: HqAuthFile) => HqAuthFile | Promise<HqAuthFile>,\n opts: { warn?: (msg: string) => void } = {},\n): Promise<HqAuthFile> {\n const current = await readHqAuthFile(dataDir, opts);\n const next = await mutator(current);\n await writeHqAuthFile(dataDir, next);\n return next;\n}\n\n/**\n * Mint a fresh token. Used for both browser and client tokens; the caller\n * decides which list to append to.\n */\nexport function mintHqToken(label?: string): HqToken {\n const now = new Date().toISOString();\n return {\n id: randomUUID(),\n token: randomUUID().replace(/-/g, '') + randomUUID().replace(/-/g, ''),\n ...(label ? { label } : {}),\n createdAt: now,\n };\n}\n\n/**\n * Backward-compat alias for `mintHqToken`. Phase 3 callers/tests use this.\n */\nexport const mintHqBrowserToken = mintHqToken;\n\n/**\n * Watch `auth.json` for changes and invoke `onChange` with the freshly-read\n * file. Returns a `close()` function that stops watching.\n *\n * The watcher debounces events (default 200ms) because most editors do a\n * tmp+rename dance that emits multiple events. On any read failure (file\n * deleted, corrupt, etc.) the `warn` callback is invoked with the same\n * semantics as `readHqAuthFile`; the watcher stays active so a future\n * valid write re-triggers the callback.\n *\n * Notes:\n * - `fs.watch` is best-effort across platforms. On some network\n * filesystems events may not fire; the operator must restart the server\n * to pick up changes in that case.\n * - The watcher polls the parent directory (not the file itself) so that\n * atomic rename events surface reliably.\n */\nexport function watchHqAuthFile(\n dataDir: string,\n onChange: (file: HqAuthFile) => void,\n opts: { warn?: (msg: string) => void; debounceMs?: number } = {},\n): { close: () => void } {\n const file = hqAuthFilePath(dataDir);\n const debounceMs = opts.debounceMs ?? 200;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let closed = false;\n\n let watcher: syncFs.FSWatcher;\n try {\n // Watch the directory (not the file) so atomic-rename events surface\n // reliably. `fs.watch` is best-effort across platforms — on some\n // network filesystems events may not fire; the operator must restart\n // the server in that case.\n watcher = syncFs.watch(path.dirname(file), { recursive: false });\n } catch (err) {\n opts.warn?.(`HQ auth watcher could not start: ${(err as Error).message}`);\n return { close: () => {} };\n }\n\n const trigger = (): void => {\n if (closed) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = undefined;\n const readOpts = opts.warn ? { warn: opts.warn } : {};\n void readHqAuthFile(dataDir, readOpts).then(\n (next) => {\n if (!closed) onChange(next);\n },\n () => {\n // readHqAuthFile never throws for routine I/O — this is a\n // belt-and-braces guard.\n },\n );\n }, debounceMs);\n };\n\n watcher.on('change', (eventType: string, filename: string | Buffer | null) => {\n const name = typeof filename === 'string' ? filename : '';\n // Only react to events that touch auth.json (rename, change).\n if (eventType === 'rename' || eventType === 'change') {\n if (!name || name === 'auth.json' || name === path.basename(file)) {\n trigger();\n }\n }\n });\n\n watcher.on('error', (err: Error) => {\n opts.warn?.(`HQ auth watcher error: ${err.message}`);\n });\n\n return {\n close: () => {\n closed = true;\n if (timer) clearTimeout(timer);\n watcher.close();\n },\n };\n}\n","import { createHash } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport { hostname } from 'node:os';\nimport { basename } from 'node:path';\nimport { GlobalMailbox } from '../coordination/global-mailbox.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { HqClientConfig } from '../types/config.js';\nimport { hqAuthFilePath, resolveHqDataDir, type HqAuthFile } from './auth-store.js';\nimport type { HqClientIdentity, HqProjectIdentity, HqRedactionPolicy } from './protocol.js';\nimport { HqPublisher, type HqSocketFactory } from './publisher.js';\n\nexport interface HqPublisherEnvConfig {\n url: string;\n token?: string;\n enabled?: boolean;\n rawContent?: boolean;\n projectAlias?: string;\n}\n\nfunction readFirstClientTokenFromAuthFile(dataDir: string): string | undefined {\n try {\n const raw = fs.readFileSync(hqAuthFilePath(dataDir), 'utf8');\n const parsed = JSON.parse(raw) as HqAuthFile;\n return parsed.clientTokens?.find((t) => t.token.trim().length > 0)?.token;\n } catch {\n return undefined;\n }\n}\n\nexport function resolveHqConfigFromEnv(env: NodeJS.ProcessEnv = process.env): HqPublisherEnvConfig | undefined {\n return resolveHqConfig({ env });\n}\n\nexport function resolveHqConfig(options: {\n env?: NodeJS.ProcessEnv | undefined;\n config?: HqClientConfig | undefined;\n} = {}): HqPublisherEnvConfig | undefined {\n const env = options.env ?? process.env;\n const fileConfig = options.config;\n const envUrl = env['WRONGSTACK_HQ_URL']?.trim();\n const envToken = env['WRONGSTACK_HQ_TOKEN']?.trim();\n const configUrl = fileConfig?.url?.trim();\n const configToken = fileConfig?.token?.trim();\n const envEnabledRaw = env['WRONGSTACK_HQ_ENABLED']?.trim();\n const enabled = envEnabledRaw !== undefined && envEnabledRaw.length > 0\n ? envEnabledRaw !== '0'\n : fileConfig?.enabled;\n const dataDir = resolveHqDataDir(fileConfig?.dataDir, env);\n const token = envToken || configToken || readFirstClientTokenFromAuthFile(dataDir);\n const url = envUrl || configUrl;\n\n if (!url) {\n if (enabled === false) return undefined;\n if (enabled === true || token) {\n return {\n url: 'http://localhost:3499',\n enabled: true,\n ...(token ? { token } : {}),\n };\n }\n return undefined;\n }\n\n const rawContentEnv = env['WRONGSTACK_HQ_RAW_CONTENT']?.trim();\n const projectAliasEnv = env['WRONGSTACK_HQ_PROJECT_ALIAS']?.trim();\n return {\n url,\n ...(token ? { token } : {}),\n ...(enabled !== undefined ? { enabled } : {}),\n ...(rawContentEnv ? { rawContent: rawContentEnv === '1' } : fileConfig?.rawContent !== undefined ? { rawContent: fileConfig.rawContent } : {}),\n ...(projectAliasEnv ? { projectAlias: projectAliasEnv } : fileConfig?.projectAlias ? { projectAlias: fileConfig.projectAlias } : {}),\n };\n}\n\nfunction stableMachineId(): string {\n return createHash('sha256').update(`${hostname()}:${process.pid}`).digest('hex').slice(0, 12);\n}\n\nfunction deriveProjectId(projectRoot: string): string {\n return createHash('sha256').update(projectRoot).digest('hex').slice(0, 12);\n}\n\nexport interface CreateHqPublisherOptions {\n clientKind: HqClientIdentity['kind'];\n projectRoot: string;\n projectName?: string;\n machineId?: string;\n hostnameOverride?: string;\n socketFactory?: HqSocketFactory;\n config?: HqPublisherEnvConfig;\n appConfig?: { hq?: HqClientConfig | undefined } | undefined;\n redactionPolicy?: Partial<HqRedactionPolicy>;\n}\n\nexport function createHqPublisherFromEnv(options: CreateHqPublisherOptions): HqPublisher | undefined {\n const config = options.config ?? resolveHqConfig({ config: options.appConfig?.hq });\n if (!config || config.enabled === false) return undefined;\n\n const machineId = options.machineId ?? stableMachineId();\n const host = options.hostnameOverride ?? hostname();\n const projectName = options.projectName ?? config.projectAlias ?? (basename(options.projectRoot) || 'unknown');\n\n const client: HqClientIdentity = {\n clientId: `${machineId}:${options.clientKind}:${process.pid}`,\n kind: options.clientKind,\n machineId,\n ...(host ? { hostname: host } : {}),\n pid: process.pid,\n startedAt: new Date().toISOString(),\n };\n\n const project: HqProjectIdentity = {\n projectId: deriveProjectId(options.projectRoot),\n projectRoot: options.projectRoot,\n projectName,\n machineId,\n workspaceKind: 'git',\n };\n\n const redactionPolicy: Partial<HqRedactionPolicy> | undefined =\n options.redactionPolicy || config.rawContent !== undefined\n ? {\n ...(config.rawContent !== undefined ? { rawContent: config.rawContent } : {}),\n ...(options.redactionPolicy ?? {}),\n }\n : undefined;\n\n return new HqPublisher({\n url: config.url,\n ...(config.token ? { token: config.token } : {}),\n client,\n project,\n ...(options.socketFactory ? { socketFactory: options.socketFactory } : {}),\n ...(redactionPolicy !== undefined ? { redactionPolicy } : {}),\n });\n}\n\nexport interface CreateGlobalMailboxOptions {\n projectDir: string;\n events?: EventBus;\n hqPublisher?: HqPublisher;\n}\n\nexport function createGlobalMailbox(options: CreateGlobalMailboxOptions): GlobalMailbox {\n return new GlobalMailbox(options.projectDir, options.events, options.hqPublisher);\n}\n"]}
@@ -0,0 +1,82 @@
1
+ import './secret-vault-Cgduf5xL.js';
2
+ import './permission-policy-uNXC6Kge.js';
3
+
4
+ /**
5
+ * Well-known tool capabilities used for authorization decisions.
6
+ *
7
+ * These are the preferred values for `Tool.capabilities`.
8
+ * New capabilities should be added here with clear documentation.
9
+ *
10
+ * Philosophy (2026-06+):
11
+ * - Prefer capabilities over exact tool name matching.
12
+ * - Subagent guards and future policies should primarily key off capabilities.
13
+ * - Name-based denylists are legacy and will be phased down.
14
+ */
15
+ declare const ToolCapabilities: {
16
+ /** Can execute arbitrary commands in the user's shell (the `bash` tool). */
17
+ readonly SHELL_ARBITRARY: "shell.arbitrary";
18
+ /** Can execute a restricted set of commands (the `exec` tool). */
19
+ readonly SHELL_RESTRICTED: "shell.restricted";
20
+ /** Can read files inside the project (and possibly outside via symlinks if not guarded). */
21
+ readonly FS_READ: "fs.read";
22
+ /** Can write / modify / delete files inside the project. */
23
+ readonly FS_WRITE: "fs.write";
24
+ /** Can write files outside the current project root (very high risk). */
25
+ readonly FS_WRITE_OUTSIDE_PROJECT: "fs.write.outside-project";
26
+ /** Can perform outbound network requests. */
27
+ readonly NET_OUTBOUND: "net.outbound";
28
+ /** Proxies tools from external MCP servers (unknown capability). */
29
+ readonly MCP_PROXY: "mcp.proxy";
30
+ /** Can spawn or manage subagents / multi-agent tasks. */
31
+ readonly SUBAGENT_SPAWN: "subagent.spawn";
32
+ /** Can mutate global or session configuration / trust state. */
33
+ readonly CONFIG_MUTATE: "config.mutate";
34
+ /** Can install packages or run package managers with side effects. */
35
+ readonly PACKAGE_INSTALL: "package.install";
36
+ };
37
+ type ToolCapability = (typeof ToolCapabilities)[keyof typeof ToolCapabilities];
38
+ /**
39
+ * Set of capabilities that are considered dangerous for subagents by default.
40
+ * Subagents should not receive these capabilities unless the leader explicitly
41
+ * allows the specific tool at spawn time.
42
+ */
43
+ declare const DANGEROUS_FOR_SUBAGENTS: readonly ToolCapability[];
44
+ /**
45
+ * Wide capability allowlist for subagents that the user has authorized to act
46
+ * with full developer power (the CLI fleet host applies this to any subagent
47
+ * that isn't given an explicit, narrower grant). It covers everything needed to
48
+ * do real work end-to-end — read, write/edit inside the project, outbound
49
+ * network, and shell/build/install — so a delegated coding or build agent runs
50
+ * the same toolchain the leader would, without per-tool confirmation it cannot
51
+ * answer.
52
+ *
53
+ * Deliberately EXCLUDED (require an explicit per-spawn `allowedCapabilities`
54
+ * grant, because they escape the task's blast radius rather than perform it):
55
+ * - `fs.write.outside-project` — writing outside the repo (e.g. ~/.ssh).
56
+ * - `mcp.proxy` — third-party MCP tools (also hard-blocked by name).
57
+ * - `subagent.spawn` — recursive delegation (the baseline prompt forbids it).
58
+ * - `config.mutate` — rewriting trust/config is privilege escalation, not work.
59
+ */
60
+ declare const WIDE_SUBAGENT_CAPABILITIES: readonly ToolCapability[];
61
+ /**
62
+ * Check if a tool (or its capabilities array) includes any dangerous capability
63
+ * for subagent execution.
64
+ */
65
+ declare function hasDangerousCapabilityForSubagents(toolOrCaps: {
66
+ capabilities?: readonly string[] | undefined;
67
+ } | readonly string[] | undefined): boolean;
68
+ /**
69
+ * Check if a tool declares a specific capability (or any of the provided ones).
70
+ */
71
+ declare function hasCapability(toolOrCaps: {
72
+ capabilities?: readonly string[] | undefined;
73
+ } | readonly string[] | undefined, capability: ToolCapability | ToolCapability[]): boolean;
74
+ /**
75
+ * Returns the intersection of a tool's capabilities with the dangerous set.
76
+ * Useful for logging and audit trails.
77
+ */
78
+ declare function getDangerousCapabilities(toolOrCaps: {
79
+ capabilities?: readonly string[] | undefined;
80
+ } | readonly string[] | undefined): ToolCapability[];
81
+
82
+ export { DANGEROUS_FOR_SUBAGENTS as D, ToolCapabilities as T, WIDE_SUBAGENT_CAPABILITIES as W, type ToolCapability as a, hasDangerousCapabilityForSubagents as b, getDangerousCapabilities as g, hasCapability as h };