@caupulican/pi-adaptative 0.85.8 → 0.86.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/dist/core/agent-paths.d.ts +6 -3
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js +10 -3
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session.d.ts +5 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +7 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
- package/dist/core/autonomy/bounded-completion.js +19 -8
- package/dist/core/autonomy/bounded-completion.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts +11 -5
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js +34 -8
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/autonomy/subagent-prompt.d.ts +3 -3
- package/dist/core/autonomy/subagent-prompt.js +9 -9
- package/dist/core/autonomy/subagent-prompt.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts +10 -8
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +23 -13
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/bash-execution-controller.d.ts +4 -0
- package/dist/core/bash-execution-controller.d.ts.map +1 -1
- package/dist/core/bash-execution-controller.js +11 -4
- package/dist/core/bash-execution-controller.js.map +1 -1
- package/dist/core/bash-executor.d.ts +2 -0
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +2 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/capability-contract.d.ts +1 -1
- package/dist/core/capability-contract.d.ts.map +1 -1
- package/dist/core/capability-contract.js +0 -1
- package/dist/core/capability-contract.js.map +1 -1
- package/dist/core/default-tool-surface.d.ts +1 -0
- package/dist/core/default-tool-surface.d.ts.map +1 -1
- package/dist/core/default-tool-surface.js +3 -2
- package/dist/core/default-tool-surface.js.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +27 -8
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +191 -33
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts +45 -6
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js +110 -13
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js +177 -158
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-authority-resolver.d.ts +23 -0
- package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -0
- package/dist/core/delegation/worker-authority-resolver.js +128 -0
- package/dist/core/delegation/worker-authority-resolver.js.map +1 -0
- package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
- package/dist/core/delegation/worker-conversation-store.js +1 -1
- package/dist/core/delegation/worker-conversation-store.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts +7 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +260 -87
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-request.d.ts +25 -4
- package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-request.js +90 -1
- package/dist/core/delegation/worker-delegation-request.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts +2 -0
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js +22 -12
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- package/dist/core/delegation/worker-lifecycle.d.ts +1 -0
- package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
- package/dist/core/delegation/worker-lifecycle.js +4 -2
- package/dist/core/delegation/worker-lifecycle.js.map +1 -1
- package/dist/core/delegation/worker-profile-resolver.d.ts +0 -2
- package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -1
- package/dist/core/delegation/worker-profile-resolver.js +8 -35
- package/dist/core/delegation/worker-profile-resolver.js.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.js +1 -0
- package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-runner.d.ts +6 -1
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +20 -6
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts +47 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.d.ts.map +1 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.js +210 -0
- package/dist/core/delegation/worker-tree-budget-coordinator.js.map +1 -0
- package/dist/core/memory/providers/file-store.d.ts +2 -0
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +22 -20
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/models/runtime-process.d.ts.map +1 -1
- package/dist/core/models/runtime-process.js +5 -18
- package/dist/core/models/runtime-process.js.map +1 -1
- package/dist/core/orchestration/bounded-string-array.d.ts +11 -0
- package/dist/core/orchestration/bounded-string-array.d.ts.map +1 -0
- package/dist/core/orchestration/bounded-string-array.js +17 -0
- package/dist/core/orchestration/bounded-string-array.js.map +1 -0
- package/dist/core/orchestration/capability-gateway.d.ts +16 -0
- package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
- package/dist/core/orchestration/capability-gateway.js +38 -0
- package/dist/core/orchestration/capability-gateway.js.map +1 -1
- package/dist/core/orchestration/contracts.d.ts +11 -3
- package/dist/core/orchestration/contracts.d.ts.map +1 -1
- package/dist/core/orchestration/contracts.js +0 -1
- package/dist/core/orchestration/contracts.js.map +1 -1
- package/dist/core/orchestration/delegation-ledger.d.ts +1 -0
- package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
- package/dist/core/orchestration/delegation-ledger.js +3 -0
- package/dist/core/orchestration/delegation-ledger.js.map +1 -1
- package/dist/core/orchestration/event-store.d.ts +12 -10
- package/dist/core/orchestration/event-store.d.ts.map +1 -1
- package/dist/core/orchestration/event-store.js +94 -104
- package/dist/core/orchestration/event-store.js.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
- package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.js +4 -1
- package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
- package/dist/core/orchestration/policy-compiler.d.ts.map +1 -1
- package/dist/core/orchestration/policy-compiler.js +8 -9
- package/dist/core/orchestration/policy-compiler.js.map +1 -1
- package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
- package/dist/core/orchestration/profile-registry.js +4 -10
- package/dist/core/orchestration/profile-registry.js.map +1 -1
- package/dist/core/orchestration/task-runtime.d.ts +1 -0
- package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
- package/dist/core/orchestration/task-runtime.js +58 -3
- package/dist/core/orchestration/task-runtime.js.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.js +10 -17
- package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
- package/dist/core/risk-classifier.js +3 -3
- package/dist/core/risk-classifier.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +4 -1
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +34 -15
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/secrets/bitwarden-credential-storage.d.ts +51 -0
- package/dist/core/secrets/bitwarden-credential-storage.d.ts.map +1 -0
- package/dist/core/secrets/bitwarden-credential-storage.js +345 -0
- package/dist/core/secrets/bitwarden-credential-storage.js.map +1 -0
- package/dist/core/secrets/credential-exposure-guard.d.ts +8 -4
- package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.js +30 -31
- package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
- package/dist/core/secrets/credential-manager.d.ts +109 -0
- package/dist/core/secrets/credential-manager.d.ts.map +1 -0
- package/dist/core/secrets/credential-manager.js +384 -0
- package/dist/core/secrets/credential-manager.js.map +1 -0
- package/dist/core/secrets/credential-project.d.ts +4 -0
- package/dist/core/secrets/credential-project.d.ts.map +1 -0
- package/dist/core/secrets/credential-project.js +145 -0
- package/dist/core/secrets/credential-project.js.map +1 -0
- package/dist/core/secrets/secret-dotenv.d.ts +1 -1
- package/dist/core/secrets/secret-dotenv.js +1 -1
- package/dist/core/secrets/secret-dotenv.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -2
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +9 -5
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tool-capability-policy.js +2 -2
- package/dist/core/tool-capability-policy.js.map +1 -1
- package/dist/core/tools/delegate.d.ts +29 -1
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +179 -28
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/git-filter.d.ts +1 -0
- package/dist/core/tools/git-filter.d.ts.map +1 -1
- package/dist/core/tools/git-filter.js +1 -1
- package/dist/core/tools/git-filter.js.map +1 -1
- package/dist/core/tools/profile-writer.js +3 -3
- package/dist/core/tools/profile-writer.js.map +1 -1
- package/dist/core/tools/python.d.ts +2 -0
- package/dist/core/tools/python.d.ts.map +1 -1
- package/dist/core/tools/python.js +17 -12
- package/dist/core/tools/python.js.map +1 -1
- package/dist/core/tools/run-process.d.ts +2 -0
- package/dist/core/tools/run-process.d.ts.map +1 -1
- package/dist/core/tools/run-process.js +7 -3
- package/dist/core/tools/run-process.js.map +1 -1
- package/dist/core/tools/secret-store.d.ts +8 -18
- package/dist/core/tools/secret-store.d.ts.map +1 -1
- package/dist/core/tools/secret-store.js +83 -348
- package/dist/core/tools/secret-store.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +38 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +35 -14
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +26 -3
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/secret-menu-controller.d.ts +21 -0
- package/dist/modes/interactive/secret-menu-controller.d.ts.map +1 -0
- package/dist/modes/interactive/secret-menu-controller.js +276 -0
- package/dist/modes/interactive/secret-menu-controller.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +2 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +43 -48
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/zip-extractor.d.ts +8 -0
- package/dist/utils/zip-extractor.d.ts.map +1 -0
- package/dist/utils/zip-extractor.js +275 -0
- package/dist/utils/zip-extractor.js.map +1 -0
- package/docs/harness-architecture.md +34 -22
- package/docs/index.md +1 -1
- package/docs/resources.md +1 -1
- package/docs/settings.md +39 -103
- package/docs/usage.md +7 -5
- package/docs/worker-profiles.md +9 -7
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +12 -12
- package/package.json +4 -4
- package/dist/core/secrets/secret-vault-format.d.ts +0 -112
- package/dist/core/secrets/secret-vault-format.d.ts.map +0 -1
- package/dist/core/secrets/secret-vault-format.js +0 -396
- package/dist/core/secrets/secret-vault-format.js.map +0 -1
- package/dist/core/secrets/secret-vault.d.ts +0 -72
- package/dist/core/secrets/secret-vault.d.ts.map +0 -1
- package/dist/core/secrets/secret-vault.js +0 -663
- package/dist/core/secrets/secret-vault.js.map +0 -1
|
@@ -8,6 +8,8 @@ const MAX_MAILBOX_MESSAGE_CHARS = 4_096;
|
|
|
8
8
|
const MAX_MAILBOX_BYTES = 128 * 1024;
|
|
9
9
|
const MAX_MAILBOX_MESSAGE_ID_CHARS = 512;
|
|
10
10
|
const MAX_MAILBOX_TIMESTAMP_CHARS = 128;
|
|
11
|
+
const MAX_MAILBOX_IDENTITY_CHARS = 512;
|
|
12
|
+
const MAX_MAILBOX_RETAINED_MESSAGES = MAX_MAILBOX_MESSAGES * 2;
|
|
11
13
|
function mailboxDigest(parentSessionId, agentId) {
|
|
12
14
|
return createHash("sha256")
|
|
13
15
|
.update("pi-worker-agent-mailbox-v1")
|
|
@@ -54,13 +56,30 @@ function parseState(raw, parentSessionId, agentId) {
|
|
|
54
56
|
typeof message.content !== "string" ||
|
|
55
57
|
message.content.length === 0 ||
|
|
56
58
|
message.content.length > MAX_MAILBOX_MESSAGE_CHARS ||
|
|
59
|
+
(message.senderAgentId !== undefined &&
|
|
60
|
+
(typeof message.senderAgentId !== "string" ||
|
|
61
|
+
message.senderAgentId.length === 0 ||
|
|
62
|
+
message.senderAgentId.length > MAX_MAILBOX_IDENTITY_CHARS)) ||
|
|
63
|
+
(message.threadId !== undefined &&
|
|
64
|
+
(typeof message.threadId !== "string" ||
|
|
65
|
+
message.threadId.length === 0 ||
|
|
66
|
+
message.threadId.length > MAX_MAILBOX_IDENTITY_CHARS)) ||
|
|
67
|
+
(message.replyToMessageId !== undefined &&
|
|
68
|
+
(typeof message.replyToMessageId !== "string" ||
|
|
69
|
+
message.replyToMessageId.length === 0 ||
|
|
70
|
+
message.replyToMessageId.length > MAX_MAILBOX_MESSAGE_ID_CHARS)) ||
|
|
71
|
+
(message.expectReply !== undefined && typeof message.expectReply !== "boolean") ||
|
|
57
72
|
typeof message.createdAt !== "string" ||
|
|
58
73
|
message.createdAt.length === 0 ||
|
|
59
74
|
message.createdAt.length > MAX_MAILBOX_TIMESTAMP_CHARS ||
|
|
60
75
|
(message.deliveredAt !== undefined &&
|
|
61
76
|
(typeof message.deliveredAt !== "string" ||
|
|
62
77
|
message.deliveredAt.length === 0 ||
|
|
63
|
-
message.deliveredAt.length > MAX_MAILBOX_TIMESTAMP_CHARS))
|
|
78
|
+
message.deliveredAt.length > MAX_MAILBOX_TIMESTAMP_CHARS)) ||
|
|
79
|
+
(message.repliedAt !== undefined &&
|
|
80
|
+
(typeof message.repliedAt !== "string" ||
|
|
81
|
+
message.repliedAt.length === 0 ||
|
|
82
|
+
message.repliedAt.length > MAX_MAILBOX_TIMESTAMP_CHARS))) {
|
|
64
83
|
throw new Error("Worker agent mailbox contains an invalid message.");
|
|
65
84
|
}
|
|
66
85
|
return { ...message };
|
|
@@ -68,7 +87,27 @@ function parseState(raw, parentSessionId, agentId) {
|
|
|
68
87
|
const pendingMessages = messages.filter((message) => message.deliveredAt === undefined);
|
|
69
88
|
if (pendingMessages.length > MAX_MAILBOX_MESSAGES)
|
|
70
89
|
throw new Error("Worker agent mailbox exceeds its pending-message bound.");
|
|
71
|
-
|
|
90
|
+
if (messages.length > MAX_MAILBOX_RETAINED_MESSAGES)
|
|
91
|
+
throw new Error("Worker agent mailbox exceeds its retained-message bound.");
|
|
92
|
+
return { version: 1, parentSessionId, agentId, messages };
|
|
93
|
+
}
|
|
94
|
+
function normalizeOptionalIdentity(value, label) {
|
|
95
|
+
if (value === undefined)
|
|
96
|
+
return undefined;
|
|
97
|
+
const normalized = value.trim();
|
|
98
|
+
if (!normalized || normalized.length > MAX_MAILBOX_IDENTITY_CHARS) {
|
|
99
|
+
throw new TypeError(`Worker control ${label} is invalid.`);
|
|
100
|
+
}
|
|
101
|
+
return normalized;
|
|
102
|
+
}
|
|
103
|
+
function pruneDeliveredHistory(messages) {
|
|
104
|
+
const pending = messages.filter((message) => message.deliveredAt === undefined);
|
|
105
|
+
const awaitingReply = messages.filter((message) => message.deliveredAt !== undefined && message.expectReply === true && message.repliedAt === undefined);
|
|
106
|
+
const retainedIds = new Set([...pending, ...awaitingReply].map((message) => message.messageId));
|
|
107
|
+
const remainingSlots = Math.max(0, MAX_MAILBOX_RETAINED_MESSAGES - retainedIds.size);
|
|
108
|
+
const deliveredCandidates = messages.filter((message) => message.deliveredAt !== undefined && !retainedIds.has(message.messageId));
|
|
109
|
+
const recentDelivered = remainingSlots > 0 ? deliveredCandidates.slice(-remainingSlots) : [];
|
|
110
|
+
return [...pending, ...awaitingReply, ...recentDelivered].sort((left, right) => left.createdAt.localeCompare(right.createdAt));
|
|
72
111
|
}
|
|
73
112
|
function encodedStateBytes(state) {
|
|
74
113
|
return Buffer.byteLength(JSON.stringify(state), "utf-8");
|
|
@@ -94,20 +133,58 @@ export class WorkerAgentMailbox {
|
|
|
94
133
|
if (content.length > MAX_MAILBOX_MESSAGE_CHARS) {
|
|
95
134
|
throw new TypeError(`Worker control messages may not exceed ${MAX_MAILBOX_MESSAGE_CHARS.toLocaleString("en-US")} characters.`);
|
|
96
135
|
}
|
|
136
|
+
const senderAgentId = normalizeOptionalIdentity(input.senderAgentId, "sender agent id");
|
|
137
|
+
const threadId = normalizeOptionalIdentity(input.threadId, "thread id");
|
|
138
|
+
const replyToMessageId = normalizeOptionalIdentity(input.replyToMessageId, "reply message id");
|
|
139
|
+
const idempotencyKey = input.idempotencyKey?.trim();
|
|
140
|
+
if (input.idempotencyKey !== undefined && (!idempotencyKey || idempotencyKey.length > 2_048)) {
|
|
141
|
+
throw new TypeError("Worker control idempotency key is invalid.");
|
|
142
|
+
}
|
|
97
143
|
const message = {
|
|
98
|
-
messageId:
|
|
144
|
+
messageId: idempotencyKey
|
|
145
|
+
? `worker-message-${createHash("sha256")
|
|
146
|
+
.update("pi-worker-agent-message-v1")
|
|
147
|
+
.update("\0")
|
|
148
|
+
.update(this.parentSessionId)
|
|
149
|
+
.update("\0")
|
|
150
|
+
.update(this.agentId)
|
|
151
|
+
.update("\0")
|
|
152
|
+
.update(idempotencyKey)
|
|
153
|
+
.digest("hex")}`
|
|
154
|
+
: `worker-message-${randomUUID()}`,
|
|
99
155
|
kind: input.kind,
|
|
100
156
|
content,
|
|
157
|
+
...(senderAgentId ? { senderAgentId } : {}),
|
|
158
|
+
...(threadId ? { threadId } : {}),
|
|
159
|
+
...(replyToMessageId ? { replyToMessageId } : {}),
|
|
160
|
+
...(input.expectReply === true ? { expectReply: true } : {}),
|
|
101
161
|
createdAt: new Date().toISOString(),
|
|
102
162
|
};
|
|
163
|
+
let queued = message;
|
|
164
|
+
let created = false;
|
|
103
165
|
this.update((state) => {
|
|
104
|
-
|
|
166
|
+
const existing = state.messages.find((candidate) => candidate.messageId === message.messageId);
|
|
167
|
+
if (existing) {
|
|
168
|
+
const sameIntent = existing.kind === message.kind &&
|
|
169
|
+
existing.content === message.content &&
|
|
170
|
+
existing.senderAgentId === message.senderAgentId &&
|
|
171
|
+
existing.threadId === message.threadId &&
|
|
172
|
+
existing.replyToMessageId === message.replyToMessageId &&
|
|
173
|
+
existing.expectReply === message.expectReply;
|
|
174
|
+
if (!sameIntent)
|
|
175
|
+
throw new Error("Worker control idempotency identity conflicts with an existing message.");
|
|
176
|
+
queued = existing;
|
|
177
|
+
return state;
|
|
178
|
+
}
|
|
179
|
+
if (state.messages.filter((candidate) => candidate.deliveredAt === undefined).length >= MAX_MAILBOX_MESSAGES) {
|
|
105
180
|
throw new Error(`Worker agent mailbox reached its ${MAX_MAILBOX_MESSAGES} message limit.`);
|
|
106
181
|
}
|
|
182
|
+
created = true;
|
|
107
183
|
return { ...state, messages: [...state.messages, message] };
|
|
108
184
|
});
|
|
109
|
-
|
|
110
|
-
|
|
185
|
+
if (created)
|
|
186
|
+
this.notify();
|
|
187
|
+
return structuredClone(queued);
|
|
111
188
|
}
|
|
112
189
|
pending(kind) {
|
|
113
190
|
return this.read()
|
|
@@ -115,21 +192,40 @@ export class WorkerAgentMailbox {
|
|
|
115
192
|
.map((message) => structuredClone(message));
|
|
116
193
|
}
|
|
117
194
|
acknowledgeDelivered(messageId) {
|
|
195
|
+
this.markTimestamp(messageId, "deliveredAt");
|
|
196
|
+
}
|
|
197
|
+
awaitingReplies() {
|
|
198
|
+
return this.read()
|
|
199
|
+
.messages.filter((message) => message.deliveredAt !== undefined && message.expectReply === true && message.repliedAt === undefined)
|
|
200
|
+
.map((message) => structuredClone(message));
|
|
201
|
+
}
|
|
202
|
+
getMessage(messageId) {
|
|
203
|
+
const normalized = messageId.trim();
|
|
204
|
+
if (!normalized)
|
|
205
|
+
throw new TypeError("A worker control message id is required.");
|
|
206
|
+
const message = this.read().messages.find((candidate) => candidate.messageId === normalized);
|
|
207
|
+
return message ? structuredClone(message) : undefined;
|
|
208
|
+
}
|
|
209
|
+
markReplied(messageId) {
|
|
210
|
+
return this.markTimestamp(messageId, "repliedAt");
|
|
211
|
+
}
|
|
212
|
+
markTimestamp(messageId, field) {
|
|
118
213
|
const normalized = messageId.trim();
|
|
119
214
|
if (!normalized)
|
|
120
215
|
throw new TypeError("A worker control message id is required.");
|
|
121
216
|
let changed = false;
|
|
122
217
|
this.update((state) => {
|
|
123
|
-
const messages = state.messages.
|
|
124
|
-
if (message.messageId !== normalized)
|
|
125
|
-
return
|
|
218
|
+
const messages = state.messages.map((message) => {
|
|
219
|
+
if (message.messageId !== normalized || message[field] !== undefined)
|
|
220
|
+
return message;
|
|
126
221
|
changed = true;
|
|
127
|
-
return
|
|
222
|
+
return { ...message, [field]: new Date().toISOString() };
|
|
128
223
|
});
|
|
129
|
-
return changed ? { ...state, messages } : state;
|
|
224
|
+
return changed ? { ...state, messages: pruneDeliveredHistory(messages) } : state;
|
|
130
225
|
});
|
|
131
226
|
if (changed)
|
|
132
227
|
this.notify();
|
|
228
|
+
return changed;
|
|
133
229
|
}
|
|
134
230
|
subscribe(listener) {
|
|
135
231
|
this.listeners.add(listener);
|
|
@@ -148,8 +244,9 @@ export class WorkerAgentMailbox {
|
|
|
148
244
|
update(mutator) {
|
|
149
245
|
withFileLockSync(this.file, () => {
|
|
150
246
|
const state = this.read();
|
|
151
|
-
const
|
|
152
|
-
|
|
247
|
+
const mutated = mutator(state);
|
|
248
|
+
const next = { ...mutated, messages: pruneDeliveredHistory(mutated.messages) };
|
|
249
|
+
if (next.messages.length > MAX_MAILBOX_RETAINED_MESSAGES || encodedStateBytes(next) > MAX_MAILBOX_BYTES) {
|
|
153
250
|
throw new Error("Worker agent mailbox exceeds its durable size bound.");
|
|
154
251
|
}
|
|
155
252
|
if (JSON.stringify(next) !== JSON.stringify(state))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-agent-control.js","sourceRoot":"","sources":["../../../src/core/delegation/worker-agent-control.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { workerAgentMailboxFile } from \"../agent-paths.ts\";\nimport type { LaneRecord } from \"../autonomy/lane-tracker.ts\";\nimport { withFileLockSync, writeFileAtomicSync } from \"../util/atomic-file.ts\";\nimport { readBoundedTextFileSync } from \"../util/bounded-file.ts\";\n\nconst MAX_MAILBOX_MESSAGES = 64;\nconst MAX_MAILBOX_MESSAGE_CHARS = 4_096;\nconst MAX_MAILBOX_BYTES = 128 * 1024;\nconst MAX_MAILBOX_MESSAGE_ID_CHARS = 512;\nconst MAX_MAILBOX_TIMESTAMP_CHARS = 128;\n\nexport type WorkerAgentMessageKind = \"steer\" | \"follow_up\";\n\nexport interface WorkerAgentMessage {\n\tmessageId: string;\n\tkind: WorkerAgentMessageKind;\n\tcontent: string;\n\tcreatedAt: string;\n\tdeliveredAt?: string;\n}\n\ninterface WorkerAgentMailboxState {\n\tversion: 1;\n\tparentSessionId: string;\n\tagentId: string;\n\tmessages: WorkerAgentMessage[];\n}\n\nexport interface WorkerAgentMailboxOptions {\n\tagentDir: string;\n\tparentSessionId: string;\n\tagentId: string;\n}\n\n/** One canonical host port for model-facing logical-agent controls. */\nexport interface WorkerAgentControlPort {\n\tsendWorkerAgentMessage(agentId: string, message: string): { messageId: string; queued: true };\n\tfollowUpWorkerAgent(\n\t\tagentId: string,\n\t\tmessage: string,\n\t): { started: boolean; steering: boolean; messageId: string; record?: LaneRecord; skipReason?: string };\n\tinterruptWorkerAgent(agentId: string): { interrupted: boolean; reason?: string };\n\tresumeWorkerAgent(agentId: string): { started: boolean; record?: LaneRecord; skipReason?: string };\n\tcancelWorkerAgent(agentId: string, reasonCode?: string): LaneRecord | undefined;\n\twaitForWorkerAgent(\n\t\tagentId: string,\n\t\ttimeoutMs?: number,\n\t): Promise<{ status: \"active\" | \"suspended\" | \"idle\" | \"unknown\" }>;\n}\n\nfunction mailboxDigest(parentSessionId: string, agentId: string): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\"pi-worker-agent-mailbox-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(parentSessionId)\n\t\t.update(\"\\0\")\n\t\t.update(agentId)\n\t\t.digest(\"hex\");\n}\n\nfunction assertIdentity(value: string, label: string): string {\n\tconst normalized = value.trim();\n\tif (!normalized) throw new TypeError(`A worker ${label} is required.`);\n\tif (normalized.length > 512) throw new TypeError(`Worker ${label} exceeds 512 characters.`);\n\treturn normalized;\n}\n\nfunction parseState(raw: string, parentSessionId: string, agentId: string): WorkerAgentMailboxState {\n\tlet candidate: unknown;\n\ttry {\n\t\tcandidate = JSON.parse(raw);\n\t} catch {\n\t\tthrow new Error(\"Worker agent mailbox is invalid JSON.\");\n\t}\n\tif (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) {\n\t\tthrow new Error(\"Worker agent mailbox is invalid.\");\n\t}\n\tconst state = candidate as Partial<WorkerAgentMailboxState>;\n\tif (\n\t\tstate.version !== 1 ||\n\t\tstate.parentSessionId !== parentSessionId ||\n\t\tstate.agentId !== agentId ||\n\t\t!Array.isArray(state.messages)\n\t) {\n\t\tthrow new Error(\"Worker agent mailbox identity conflicts with the requested logical worker.\");\n\t}\n\tconst messages = state.messages.map((message): WorkerAgentMessage => {\n\t\tif (\n\t\t\t!message ||\n\t\t\ttypeof message !== \"object\" ||\n\t\t\tArray.isArray(message) ||\n\t\t\ttypeof message.messageId !== \"string\" ||\n\t\t\tmessage.messageId.length === 0 ||\n\t\t\tmessage.messageId.length > MAX_MAILBOX_MESSAGE_ID_CHARS ||\n\t\t\t(message.kind !== \"steer\" && message.kind !== \"follow_up\") ||\n\t\t\ttypeof message.content !== \"string\" ||\n\t\t\tmessage.content.length === 0 ||\n\t\t\tmessage.content.length > MAX_MAILBOX_MESSAGE_CHARS ||\n\t\t\ttypeof message.createdAt !== \"string\" ||\n\t\t\tmessage.createdAt.length === 0 ||\n\t\t\tmessage.createdAt.length > MAX_MAILBOX_TIMESTAMP_CHARS ||\n\t\t\t(message.deliveredAt !== undefined &&\n\t\t\t\t(typeof message.deliveredAt !== \"string\" ||\n\t\t\t\t\tmessage.deliveredAt.length === 0 ||\n\t\t\t\t\tmessage.deliveredAt.length > MAX_MAILBOX_TIMESTAMP_CHARS))\n\t\t) {\n\t\t\tthrow new Error(\"Worker agent mailbox contains an invalid message.\");\n\t\t}\n\t\treturn { ...message };\n\t});\n\tconst pendingMessages = messages.filter((message) => message.deliveredAt === undefined);\n\tif (pendingMessages.length > MAX_MAILBOX_MESSAGES)\n\t\tthrow new Error(\"Worker agent mailbox exceeds its pending-message bound.\");\n\treturn { version: 1, parentSessionId, agentId, messages: pendingMessages };\n}\n\nfunction encodedStateBytes(state: WorkerAgentMailboxState): number {\n\treturn Buffer.byteLength(JSON.stringify(state), \"utf-8\");\n}\n\n/**\n * Bounded durable inbox for a single logical worker agent.\n *\n * A message is never considered delivered merely because a controller read it. Its caller must\n * acknowledge it only after the exact corresponding user message has been appended to the child\n * WorkerConversation. The in-process subscription is a notification edge, not a polling loop.\n */\nexport class WorkerAgentMailbox {\n\tprivate readonly parentSessionId: string;\n\tprivate readonly agentId: string;\n\tprivate readonly file: string;\n\tprivate readonly listeners = new Set<() => void>();\n\n\tconstructor(options: WorkerAgentMailboxOptions) {\n\t\tthis.parentSessionId = assertIdentity(options.parentSessionId, \"parent session id\");\n\t\tthis.agentId = assertIdentity(options.agentId, \"agent id\");\n\t\tthis.file = workerAgentMailboxFile(\n\t\t\toptions.agentDir,\n\t\t\tthis.parentSessionId,\n\t\t\tmailboxDigest(this.parentSessionId, this.agentId),\n\t\t);\n\t}\n\n\tenqueue(input: { kind: WorkerAgentMessageKind; content: string }): WorkerAgentMessage {\n\t\tconst content = input.content.trim();\n\t\tif (!content) throw new TypeError(\"A worker control message is required.\");\n\t\tif (content.length > MAX_MAILBOX_MESSAGE_CHARS) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Worker control messages may not exceed ${MAX_MAILBOX_MESSAGE_CHARS.toLocaleString(\"en-US\")} characters.`,\n\t\t\t);\n\t\t}\n\t\tconst message: WorkerAgentMessage = {\n\t\t\tmessageId: `worker-message-${randomUUID()}`,\n\t\t\tkind: input.kind,\n\t\t\tcontent,\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t};\n\t\tthis.update((state) => {\n\t\t\tif (state.messages.length >= MAX_MAILBOX_MESSAGES) {\n\t\t\t\tthrow new Error(`Worker agent mailbox reached its ${MAX_MAILBOX_MESSAGES} message limit.`);\n\t\t\t}\n\t\t\treturn { ...state, messages: [...state.messages, message] };\n\t\t});\n\t\tthis.notify();\n\t\treturn structuredClone(message);\n\t}\n\n\tpending(kind?: WorkerAgentMessageKind): WorkerAgentMessage[] {\n\t\treturn this.read()\n\t\t\t.messages.filter(\n\t\t\t\t(message) => message.deliveredAt === undefined && (kind === undefined || message.kind === kind),\n\t\t\t)\n\t\t\t.map((message) => structuredClone(message));\n\t}\n\n\tacknowledgeDelivered(messageId: string): void {\n\t\tconst normalized = messageId.trim();\n\t\tif (!normalized) throw new TypeError(\"A worker control message id is required.\");\n\t\tlet changed = false;\n\t\tthis.update((state) => {\n\t\t\tconst messages = state.messages.filter((message) => {\n\t\t\t\tif (message.messageId !== normalized) return true;\n\t\t\t\tchanged = true;\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\treturn changed ? { ...state, messages } : state;\n\t\t});\n\t\tif (changed) this.notify();\n\t}\n\n\tsubscribe(listener: () => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\tprivate notify(): void {\n\t\tfor (const listener of this.listeners) listener();\n\t}\n\n\tprivate read(): WorkerAgentMailboxState {\n\t\tif (!existsSync(this.file)) {\n\t\t\treturn { version: 1, parentSessionId: this.parentSessionId, agentId: this.agentId, messages: [] };\n\t\t}\n\t\treturn parseState(\n\t\t\treadBoundedTextFileSync(this.file, MAX_MAILBOX_BYTES, \"Worker agent mailbox durable size bound\"),\n\t\t\tthis.parentSessionId,\n\t\t\tthis.agentId,\n\t\t);\n\t}\n\n\tprivate update(mutator: (state: WorkerAgentMailboxState) => WorkerAgentMailboxState): void {\n\t\twithFileLockSync(this.file, () => {\n\t\t\tconst state = this.read();\n\t\t\tconst next = mutator(state);\n\t\t\tif (next.messages.length > MAX_MAILBOX_MESSAGES || encodedStateBytes(next) > MAX_MAILBOX_BYTES) {\n\t\t\t\tthrow new Error(\"Worker agent mailbox exceeds its durable size bound.\");\n\t\t\t}\n\t\t\tif (JSON.stringify(next) !== JSON.stringify(state))\n\t\t\t\twriteFileAtomicSync(this.file, `${JSON.stringify(next)}\\n`, { mode: 0o600 });\n\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"worker-agent-control.js","sourceRoot":"","sources":["../../../src/core/delegation/worker-agent-control.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport type { Message } from \"@caupulican/pi-ai\";\nimport { workerAgentMailboxFile } from \"../agent-paths.ts\";\nimport type { LaneRecord } from \"../autonomy/lane-tracker.ts\";\nimport type { AgentBindingContract } from \"../orchestration/contracts.ts\";\nimport { withFileLockSync, writeFileAtomicSync } from \"../util/atomic-file.ts\";\nimport { readBoundedTextFileSync } from \"../util/bounded-file.ts\";\n\nconst MAX_MAILBOX_MESSAGES = 64;\nconst MAX_MAILBOX_MESSAGE_CHARS = 4_096;\nconst MAX_MAILBOX_BYTES = 128 * 1024;\nconst MAX_MAILBOX_MESSAGE_ID_CHARS = 512;\nconst MAX_MAILBOX_TIMESTAMP_CHARS = 128;\nconst MAX_MAILBOX_IDENTITY_CHARS = 512;\nconst MAX_MAILBOX_RETAINED_MESSAGES = MAX_MAILBOX_MESSAGES * 2;\n\nexport type WorkerAgentMessageKind = \"steer\" | \"follow_up\";\n\nexport interface WorkerAgentMessage {\n\tmessageId: string;\n\tkind: WorkerAgentMessageKind;\n\tcontent: string;\n\tsenderAgentId?: string;\n\tthreadId?: string;\n\treplyToMessageId?: string;\n\texpectReply?: boolean;\n\tcreatedAt: string;\n\tdeliveredAt?: string;\n\trepliedAt?: string;\n}\n\ninterface WorkerAgentMailboxState {\n\tversion: 1;\n\tparentSessionId: string;\n\tagentId: string;\n\tmessages: WorkerAgentMessage[];\n}\n\nexport interface WorkerAgentMailboxOptions {\n\tagentDir: string;\n\tparentSessionId: string;\n\tagentId: string;\n}\n\nexport interface WorkerAgentTranscriptPage {\n\tagentId: string;\n\tcursor: number;\n\ttotalMessages: number;\n\tmessages: Message[];\n\tnextCursor?: number;\n}\n\nexport interface WorkerAgentMessageOptions {\n\tsenderAgentId?: string;\n\tthreadId?: string;\n\treplyToMessageId?: string;\n\texpectReply?: boolean;\n}\n\nexport interface WorkerAgentControlScope {\n\tcallerAgentId?: string;\n}\n\nexport interface WorkerAgentTranscriptOptions extends WorkerAgentControlScope {\n\tcursor?: number;\n\tmaxMessages?: number;\n}\n\n/** One canonical host port for model-facing logical-agent controls. */\nexport interface WorkerAgentControlPort {\n\tlistWorkerAgents(scope?: WorkerAgentControlScope): AgentBindingContract[];\n\treadWorkerAgentTranscript(agentId: string, options?: WorkerAgentTranscriptOptions): WorkerAgentTranscriptPage;\n\tsendWorkerAgentMessage(\n\t\tagentId: string,\n\t\tmessage: string,\n\t\toptions?: WorkerAgentMessageOptions,\n\t): { messageId: string; queued: true };\n\tfollowUpWorkerAgent(\n\t\tagentId: string,\n\t\tmessage: string,\n\t\toptions?: WorkerAgentMessageOptions,\n\t): { started: boolean; steering: boolean; messageId: string; record?: LaneRecord; skipReason?: string };\n\tinterruptWorkerAgent(agentId: string, scope?: WorkerAgentControlScope): { interrupted: boolean; reason?: string };\n\tresumeWorkerAgent(\n\t\tagentId: string,\n\t\tscope?: WorkerAgentControlScope,\n\t): { started: boolean; record?: LaneRecord; skipReason?: string };\n\tcancelWorkerAgent(agentId: string, reasonCode?: string, scope?: WorkerAgentControlScope): LaneRecord | undefined;\n\twaitForWorkerAgent(\n\t\tagentId: string,\n\t\ttimeoutMs?: number,\n\t\tscope?: WorkerAgentControlScope,\n\t): Promise<{ status: \"active\" | \"suspended\" | \"idle\" | \"unknown\" }>;\n}\n\nfunction mailboxDigest(parentSessionId: string, agentId: string): string {\n\treturn createHash(\"sha256\")\n\t\t.update(\"pi-worker-agent-mailbox-v1\")\n\t\t.update(\"\\0\")\n\t\t.update(parentSessionId)\n\t\t.update(\"\\0\")\n\t\t.update(agentId)\n\t\t.digest(\"hex\");\n}\n\nfunction assertIdentity(value: string, label: string): string {\n\tconst normalized = value.trim();\n\tif (!normalized) throw new TypeError(`A worker ${label} is required.`);\n\tif (normalized.length > 512) throw new TypeError(`Worker ${label} exceeds 512 characters.`);\n\treturn normalized;\n}\n\nfunction parseState(raw: string, parentSessionId: string, agentId: string): WorkerAgentMailboxState {\n\tlet candidate: unknown;\n\ttry {\n\t\tcandidate = JSON.parse(raw);\n\t} catch {\n\t\tthrow new Error(\"Worker agent mailbox is invalid JSON.\");\n\t}\n\tif (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) {\n\t\tthrow new Error(\"Worker agent mailbox is invalid.\");\n\t}\n\tconst state = candidate as Partial<WorkerAgentMailboxState>;\n\tif (\n\t\tstate.version !== 1 ||\n\t\tstate.parentSessionId !== parentSessionId ||\n\t\tstate.agentId !== agentId ||\n\t\t!Array.isArray(state.messages)\n\t) {\n\t\tthrow new Error(\"Worker agent mailbox identity conflicts with the requested logical worker.\");\n\t}\n\tconst messages = state.messages.map((message): WorkerAgentMessage => {\n\t\tif (\n\t\t\t!message ||\n\t\t\ttypeof message !== \"object\" ||\n\t\t\tArray.isArray(message) ||\n\t\t\ttypeof message.messageId !== \"string\" ||\n\t\t\tmessage.messageId.length === 0 ||\n\t\t\tmessage.messageId.length > MAX_MAILBOX_MESSAGE_ID_CHARS ||\n\t\t\t(message.kind !== \"steer\" && message.kind !== \"follow_up\") ||\n\t\t\ttypeof message.content !== \"string\" ||\n\t\t\tmessage.content.length === 0 ||\n\t\t\tmessage.content.length > MAX_MAILBOX_MESSAGE_CHARS ||\n\t\t\t(message.senderAgentId !== undefined &&\n\t\t\t\t(typeof message.senderAgentId !== \"string\" ||\n\t\t\t\t\tmessage.senderAgentId.length === 0 ||\n\t\t\t\t\tmessage.senderAgentId.length > MAX_MAILBOX_IDENTITY_CHARS)) ||\n\t\t\t(message.threadId !== undefined &&\n\t\t\t\t(typeof message.threadId !== \"string\" ||\n\t\t\t\t\tmessage.threadId.length === 0 ||\n\t\t\t\t\tmessage.threadId.length > MAX_MAILBOX_IDENTITY_CHARS)) ||\n\t\t\t(message.replyToMessageId !== undefined &&\n\t\t\t\t(typeof message.replyToMessageId !== \"string\" ||\n\t\t\t\t\tmessage.replyToMessageId.length === 0 ||\n\t\t\t\t\tmessage.replyToMessageId.length > MAX_MAILBOX_MESSAGE_ID_CHARS)) ||\n\t\t\t(message.expectReply !== undefined && typeof message.expectReply !== \"boolean\") ||\n\t\t\ttypeof message.createdAt !== \"string\" ||\n\t\t\tmessage.createdAt.length === 0 ||\n\t\t\tmessage.createdAt.length > MAX_MAILBOX_TIMESTAMP_CHARS ||\n\t\t\t(message.deliveredAt !== undefined &&\n\t\t\t\t(typeof message.deliveredAt !== \"string\" ||\n\t\t\t\t\tmessage.deliveredAt.length === 0 ||\n\t\t\t\t\tmessage.deliveredAt.length > MAX_MAILBOX_TIMESTAMP_CHARS)) ||\n\t\t\t(message.repliedAt !== undefined &&\n\t\t\t\t(typeof message.repliedAt !== \"string\" ||\n\t\t\t\t\tmessage.repliedAt.length === 0 ||\n\t\t\t\t\tmessage.repliedAt.length > MAX_MAILBOX_TIMESTAMP_CHARS))\n\t\t) {\n\t\t\tthrow new Error(\"Worker agent mailbox contains an invalid message.\");\n\t\t}\n\t\treturn { ...message };\n\t});\n\tconst pendingMessages = messages.filter((message) => message.deliveredAt === undefined);\n\tif (pendingMessages.length > MAX_MAILBOX_MESSAGES)\n\t\tthrow new Error(\"Worker agent mailbox exceeds its pending-message bound.\");\n\tif (messages.length > MAX_MAILBOX_RETAINED_MESSAGES)\n\t\tthrow new Error(\"Worker agent mailbox exceeds its retained-message bound.\");\n\treturn { version: 1, parentSessionId, agentId, messages };\n}\n\nfunction normalizeOptionalIdentity(value: string | undefined, label: string): string | undefined {\n\tif (value === undefined) return undefined;\n\tconst normalized = value.trim();\n\tif (!normalized || normalized.length > MAX_MAILBOX_IDENTITY_CHARS) {\n\t\tthrow new TypeError(`Worker control ${label} is invalid.`);\n\t}\n\treturn normalized;\n}\n\nfunction pruneDeliveredHistory(messages: readonly WorkerAgentMessage[]): WorkerAgentMessage[] {\n\tconst pending = messages.filter((message) => message.deliveredAt === undefined);\n\tconst awaitingReply = messages.filter(\n\t\t(message) => message.deliveredAt !== undefined && message.expectReply === true && message.repliedAt === undefined,\n\t);\n\tconst retainedIds = new Set([...pending, ...awaitingReply].map((message) => message.messageId));\n\tconst remainingSlots = Math.max(0, MAX_MAILBOX_RETAINED_MESSAGES - retainedIds.size);\n\tconst deliveredCandidates = messages.filter(\n\t\t(message) => message.deliveredAt !== undefined && !retainedIds.has(message.messageId),\n\t);\n\tconst recentDelivered = remainingSlots > 0 ? deliveredCandidates.slice(-remainingSlots) : [];\n\treturn [...pending, ...awaitingReply, ...recentDelivered].sort((left, right) =>\n\t\tleft.createdAt.localeCompare(right.createdAt),\n\t);\n}\n\nfunction encodedStateBytes(state: WorkerAgentMailboxState): number {\n\treturn Buffer.byteLength(JSON.stringify(state), \"utf-8\");\n}\n\n/**\n * Bounded durable inbox for a single logical worker agent.\n *\n * A message is never considered delivered merely because a controller read it. Its caller must\n * acknowledge it only after the exact corresponding user message has been appended to the child\n * WorkerConversation. The in-process subscription is a notification edge, not a polling loop.\n */\nexport class WorkerAgentMailbox {\n\tprivate readonly parentSessionId: string;\n\tprivate readonly agentId: string;\n\tprivate readonly file: string;\n\tprivate readonly listeners = new Set<() => void>();\n\n\tconstructor(options: WorkerAgentMailboxOptions) {\n\t\tthis.parentSessionId = assertIdentity(options.parentSessionId, \"parent session id\");\n\t\tthis.agentId = assertIdentity(options.agentId, \"agent id\");\n\t\tthis.file = workerAgentMailboxFile(\n\t\t\toptions.agentDir,\n\t\t\tthis.parentSessionId,\n\t\t\tmailboxDigest(this.parentSessionId, this.agentId),\n\t\t);\n\t}\n\n\tenqueue(input: {\n\t\tkind: WorkerAgentMessageKind;\n\t\tcontent: string;\n\t\tsenderAgentId?: string;\n\t\tthreadId?: string;\n\t\treplyToMessageId?: string;\n\t\texpectReply?: boolean;\n\t\t/** Host-owned retry identity; callers cannot choose durable message ids directly. */\n\t\tidempotencyKey?: string;\n\t}): WorkerAgentMessage {\n\t\tconst content = input.content.trim();\n\t\tif (!content) throw new TypeError(\"A worker control message is required.\");\n\t\tif (content.length > MAX_MAILBOX_MESSAGE_CHARS) {\n\t\t\tthrow new TypeError(\n\t\t\t\t`Worker control messages may not exceed ${MAX_MAILBOX_MESSAGE_CHARS.toLocaleString(\"en-US\")} characters.`,\n\t\t\t);\n\t\t}\n\t\tconst senderAgentId = normalizeOptionalIdentity(input.senderAgentId, \"sender agent id\");\n\t\tconst threadId = normalizeOptionalIdentity(input.threadId, \"thread id\");\n\t\tconst replyToMessageId = normalizeOptionalIdentity(input.replyToMessageId, \"reply message id\");\n\t\tconst idempotencyKey = input.idempotencyKey?.trim();\n\t\tif (input.idempotencyKey !== undefined && (!idempotencyKey || idempotencyKey.length > 2_048)) {\n\t\t\tthrow new TypeError(\"Worker control idempotency key is invalid.\");\n\t\t}\n\t\tconst message: WorkerAgentMessage = {\n\t\t\tmessageId: idempotencyKey\n\t\t\t\t? `worker-message-${createHash(\"sha256\")\n\t\t\t\t\t\t.update(\"pi-worker-agent-message-v1\")\n\t\t\t\t\t\t.update(\"\\0\")\n\t\t\t\t\t\t.update(this.parentSessionId)\n\t\t\t\t\t\t.update(\"\\0\")\n\t\t\t\t\t\t.update(this.agentId)\n\t\t\t\t\t\t.update(\"\\0\")\n\t\t\t\t\t\t.update(idempotencyKey)\n\t\t\t\t\t\t.digest(\"hex\")}`\n\t\t\t\t: `worker-message-${randomUUID()}`,\n\t\t\tkind: input.kind,\n\t\t\tcontent,\n\t\t\t...(senderAgentId ? { senderAgentId } : {}),\n\t\t\t...(threadId ? { threadId } : {}),\n\t\t\t...(replyToMessageId ? { replyToMessageId } : {}),\n\t\t\t...(input.expectReply === true ? { expectReply: true } : {}),\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t};\n\t\tlet queued = message;\n\t\tlet created = false;\n\t\tthis.update((state) => {\n\t\t\tconst existing = state.messages.find((candidate) => candidate.messageId === message.messageId);\n\t\t\tif (existing) {\n\t\t\t\tconst sameIntent =\n\t\t\t\t\texisting.kind === message.kind &&\n\t\t\t\t\texisting.content === message.content &&\n\t\t\t\t\texisting.senderAgentId === message.senderAgentId &&\n\t\t\t\t\texisting.threadId === message.threadId &&\n\t\t\t\t\texisting.replyToMessageId === message.replyToMessageId &&\n\t\t\t\t\texisting.expectReply === message.expectReply;\n\t\t\t\tif (!sameIntent) throw new Error(\"Worker control idempotency identity conflicts with an existing message.\");\n\t\t\t\tqueued = existing;\n\t\t\t\treturn state;\n\t\t\t}\n\t\t\tif (state.messages.filter((candidate) => candidate.deliveredAt === undefined).length >= MAX_MAILBOX_MESSAGES) {\n\t\t\t\tthrow new Error(`Worker agent mailbox reached its ${MAX_MAILBOX_MESSAGES} message limit.`);\n\t\t\t}\n\t\t\tcreated = true;\n\t\t\treturn { ...state, messages: [...state.messages, message] };\n\t\t});\n\t\tif (created) this.notify();\n\t\treturn structuredClone(queued);\n\t}\n\n\tpending(kind?: WorkerAgentMessageKind): WorkerAgentMessage[] {\n\t\treturn this.read()\n\t\t\t.messages.filter(\n\t\t\t\t(message) => message.deliveredAt === undefined && (kind === undefined || message.kind === kind),\n\t\t\t)\n\t\t\t.map((message) => structuredClone(message));\n\t}\n\n\tacknowledgeDelivered(messageId: string): void {\n\t\tthis.markTimestamp(messageId, \"deliveredAt\");\n\t}\n\n\tawaitingReplies(): WorkerAgentMessage[] {\n\t\treturn this.read()\n\t\t\t.messages.filter(\n\t\t\t\t(message) =>\n\t\t\t\t\tmessage.deliveredAt !== undefined && message.expectReply === true && message.repliedAt === undefined,\n\t\t\t)\n\t\t\t.map((message) => structuredClone(message));\n\t}\n\n\tgetMessage(messageId: string): WorkerAgentMessage | undefined {\n\t\tconst normalized = messageId.trim();\n\t\tif (!normalized) throw new TypeError(\"A worker control message id is required.\");\n\t\tconst message = this.read().messages.find((candidate) => candidate.messageId === normalized);\n\t\treturn message ? structuredClone(message) : undefined;\n\t}\n\n\tmarkReplied(messageId: string): boolean {\n\t\treturn this.markTimestamp(messageId, \"repliedAt\");\n\t}\n\n\tprivate markTimestamp(messageId: string, field: \"deliveredAt\" | \"repliedAt\"): boolean {\n\t\tconst normalized = messageId.trim();\n\t\tif (!normalized) throw new TypeError(\"A worker control message id is required.\");\n\t\tlet changed = false;\n\t\tthis.update((state) => {\n\t\t\tconst messages: WorkerAgentMessage[] = state.messages.map((message) => {\n\t\t\t\tif (message.messageId !== normalized || message[field] !== undefined) return message;\n\t\t\t\tchanged = true;\n\t\t\t\treturn { ...message, [field]: new Date().toISOString() };\n\t\t\t});\n\t\t\treturn changed ? { ...state, messages: pruneDeliveredHistory(messages) } : state;\n\t\t});\n\t\tif (changed) this.notify();\n\t\treturn changed;\n\t}\n\n\tsubscribe(listener: () => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\tprivate notify(): void {\n\t\tfor (const listener of this.listeners) listener();\n\t}\n\n\tprivate read(): WorkerAgentMailboxState {\n\t\tif (!existsSync(this.file)) {\n\t\t\treturn { version: 1, parentSessionId: this.parentSessionId, agentId: this.agentId, messages: [] };\n\t\t}\n\t\treturn parseState(\n\t\t\treadBoundedTextFileSync(this.file, MAX_MAILBOX_BYTES, \"Worker agent mailbox durable size bound\"),\n\t\t\tthis.parentSessionId,\n\t\t\tthis.agentId,\n\t\t);\n\t}\n\n\tprivate update(mutator: (state: WorkerAgentMailboxState) => WorkerAgentMailboxState): void {\n\t\twithFileLockSync(this.file, () => {\n\t\t\tconst state = this.read();\n\t\t\tconst mutated = mutator(state);\n\t\t\tconst next = { ...mutated, messages: pruneDeliveredHistory(mutated.messages) };\n\t\t\tif (next.messages.length > MAX_MAILBOX_RETAINED_MESSAGES || encodedStateBytes(next) > MAX_MAILBOX_BYTES) {\n\t\t\t\tthrow new Error(\"Worker agent mailbox exceeds its durable size bound.\");\n\t\t\t}\n\t\t\tif (JSON.stringify(next) !== JSON.stringify(state))\n\t\t\t\twriteFileAtomicSync(this.file, `${JSON.stringify(next)}\\n`, { mode: 0o600 });\n\t\t});\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker-attempt-executor.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/worker-attempt-executor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,KAAK,EAAE,GAAG,EAA6B,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGxE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"worker-attempt-executor.d.ts","sourceRoot":"","sources":["../../../src/core/delegation/worker-attempt-executor.ts"],"names":[],"mappings":"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"}
|