@songsid/agend 2.2.0-beta.5 → 2.2.0-beta.7

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 (127) hide show
  1. package/dist/agent-cli-instructions.md +6 -2
  2. package/dist/agent-cli.js +9 -5
  3. package/dist/agent-cli.js.map +1 -1
  4. package/dist/backend/claude-carry.d.ts +22 -0
  5. package/dist/backend/claude-carry.js +170 -0
  6. package/dist/backend/claude-carry.js.map +1 -0
  7. package/dist/backend/claude-code.d.ts +16 -0
  8. package/dist/backend/claude-code.js +92 -2
  9. package/dist/backend/claude-code.js.map +1 -1
  10. package/dist/backend/credential-profile.d.ts +7 -0
  11. package/dist/backend/credential-profile.js +7 -1
  12. package/dist/backend/credential-profile.js.map +1 -1
  13. package/dist/backend/kiro.js +5 -2
  14. package/dist/backend/kiro.js.map +1 -1
  15. package/dist/backend/muse.d.ts +67 -0
  16. package/dist/backend/muse.js +370 -44
  17. package/dist/backend/muse.js.map +1 -1
  18. package/dist/backend/types.d.ts +7 -0
  19. package/dist/backend/types.js.map +1 -1
  20. package/dist/background-work-ended.d.ts +18 -0
  21. package/dist/background-work-ended.js +30 -0
  22. package/dist/background-work-ended.js.map +1 -0
  23. package/dist/channel/adapters/discord.js +12 -1
  24. package/dist/channel/adapters/discord.js.map +1 -1
  25. package/dist/channel/adapters/telegram.d.ts +4 -5
  26. package/dist/channel/adapters/telegram.js +39 -17
  27. package/dist/channel/adapters/telegram.js.map +1 -1
  28. package/dist/channel/mcp-tools.js +3 -3
  29. package/dist/channel/mcp-tools.js.map +1 -1
  30. package/dist/channel/message-edit-errors.d.ts +5 -0
  31. package/dist/channel/message-edit-errors.js +24 -0
  32. package/dist/channel/message-edit-errors.js.map +1 -0
  33. package/dist/channel/types.d.ts +3 -0
  34. package/dist/cli.js +25 -10
  35. package/dist/cli.js.map +1 -1
  36. package/dist/cross-instance-envelope.js +2 -0
  37. package/dist/cross-instance-envelope.js.map +1 -1
  38. package/dist/daemon.d.ts +6 -0
  39. package/dist/daemon.js +165 -54
  40. package/dist/daemon.js.map +1 -1
  41. package/dist/delivery-outbox.d.ts +27 -0
  42. package/dist/delivery-outbox.js +175 -6
  43. package/dist/delivery-outbox.js.map +1 -1
  44. package/dist/fleet-context.d.ts +4 -1
  45. package/dist/fleet-manager.d.ts +110 -6
  46. package/dist/fleet-manager.js +558 -100
  47. package/dist/fleet-manager.js.map +1 -1
  48. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +44 -9
  49. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +14 -1
  50. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +4 -0
  51. package/dist/human-delivery-receipts.d.ts +83 -0
  52. package/dist/human-delivery-receipts.js +194 -0
  53. package/dist/human-delivery-receipts.js.map +1 -0
  54. package/dist/instructions.d.ts +1 -1
  55. package/dist/instructions.js +1 -1
  56. package/dist/instructions.js.map +1 -1
  57. package/dist/locale.js +22 -2
  58. package/dist/locale.js.map +1 -1
  59. package/dist/needs-you-hub.js +2 -0
  60. package/dist/needs-you-hub.js.map +1 -1
  61. package/dist/needs-you-live.d.ts +6 -0
  62. package/dist/needs-you-live.js +23 -3
  63. package/dist/needs-you-live.js.map +1 -1
  64. package/dist/outbound-handlers.d.ts +10 -0
  65. package/dist/outbound-handlers.js +39 -14
  66. package/dist/outbound-handlers.js.map +1 -1
  67. package/dist/outbound-schemas.d.ts +15 -13
  68. package/dist/outbound-schemas.js +5 -0
  69. package/dist/outbound-schemas.js.map +1 -1
  70. package/dist/public-link-progress.d.ts +1 -1
  71. package/dist/public-link-progress.js +8 -2
  72. package/dist/public-link-progress.js.map +1 -1
  73. package/dist/public-preview.d.ts +2 -1
  74. package/dist/public-preview.js +8 -5
  75. package/dist/public-preview.js.map +1 -1
  76. package/dist/public-web-link.d.ts +4 -1
  77. package/dist/public-web-link.js +27 -10
  78. package/dist/public-web-link.js.map +1 -1
  79. package/dist/reply-buttons-controller.d.ts +3 -0
  80. package/dist/reply-buttons-controller.js +3 -2
  81. package/dist/reply-buttons-controller.js.map +1 -1
  82. package/dist/restart-progress.d.ts +4 -0
  83. package/dist/restart-progress.js +7 -0
  84. package/dist/restart-progress.js.map +1 -1
  85. package/dist/service-installer.d.ts +31 -0
  86. package/dist/service-installer.js +41 -2
  87. package/dist/service-installer.js.map +1 -1
  88. package/dist/topic-commands.d.ts +3 -2
  89. package/dist/topic-commands.js +17 -5
  90. package/dist/topic-commands.js.map +1 -1
  91. package/dist/tunnel/cloudflared.d.ts +7 -15
  92. package/dist/tunnel/cloudflared.js +36 -1
  93. package/dist/tunnel/cloudflared.js.map +1 -1
  94. package/dist/tunnel/types.d.ts +5 -1
  95. package/dist/tunnel/types.js.map +1 -1
  96. package/dist/ui/chat-strings.js +8 -2
  97. package/dist/ui/chat-thread.js +24 -4
  98. package/dist/ui/chat-time.js +80 -0
  99. package/dist/ui/preview-panel.js +7 -1
  100. package/dist/ui/preview.js +5 -1
  101. package/dist/ui/shared/app-stream.js +21 -4
  102. package/dist/ui/shared/app.css +9 -3
  103. package/dist/ui/shared/usage-dialog.js +10 -1
  104. package/dist/update-install.d.ts +6 -2
  105. package/dist/update-install.js +8 -2
  106. package/dist/update-install.js.map +1 -1
  107. package/dist/update-marker.d.ts +11 -0
  108. package/dist/update-marker.js +12 -0
  109. package/dist/update-marker.js.map +1 -1
  110. package/dist/web-api.d.ts +5 -1
  111. package/dist/web-api.js +8 -1
  112. package/dist/web-api.js.map +1 -1
  113. package/dist/web-commands.d.ts +2 -2
  114. package/dist/web-commands.js +3 -2
  115. package/dist/web-commands.js.map +1 -1
  116. package/dist/web-reply-files.d.ts +45 -0
  117. package/dist/web-reply-files.js +223 -0
  118. package/dist/web-reply-files.js.map +1 -0
  119. package/dist/web-server-drain.d.ts +10 -0
  120. package/dist/web-server-drain.js +50 -0
  121. package/dist/web-server-drain.js.map +1 -0
  122. package/dist/web-upload.d.ts +17 -4
  123. package/dist/web-upload.js +64 -13
  124. package/dist/web-upload.js.map +1 -1
  125. package/package.json +1 -1
  126. package/templates/launchd.plist.ejs +3 -1
  127. package/templates/systemd.service.ejs +2 -1
@@ -102,8 +102,8 @@ restarted for you** and the reply says `restarted: true`. A paused or stopped on
102
102
  is not started: the reply says `restarted: false`, and the switch applies at its
103
103
  next start.
104
104
 
105
- **For kiro and claude-code**, a switch is always a **new conversation**, and the reply says so
106
- (`conversation_carried_over: false`). kiro keeps its conversations in the same
105
+ **For kiro**, a switch is always a **new conversation**
106
+ (`conversation_carried_over: false`). Kiro keeps its conversations in the same
107
107
  database as its login, so a different subscription has a different set of them
108
108
  and there is nothing to resume — AgEnD does not even try. What it does instead
109
109
  is hand the new session a summary of what the old one was doing
@@ -111,6 +111,34 @@ is hand the new session a summary of what the old one was doing
111
111
  transcript. Tell the user plainly: the agent restarted on the other
112
112
  subscription, it knows what it was doing, it cannot quote what was said.
113
113
 
114
+ **For claude-code**, AgEnD copies the transcript and its folder into the new
115
+ profile's directory and resumes it there with `--continue`. The originals are
116
+ left untouched; the switch copies, never moves.
117
+
118
+ **Reply fields to relay:**
119
+
120
+ - `conversation_carried_over: true` — the copy succeeded and the agent resumed
121
+ the same conversation on the new account. The reply also carries
122
+ `conversation_note`: relay it. It says the old copy is still there and
123
+ warns that the next turn re-reads the full history from a cold cache — one
124
+ slower, full-price turn on the new subscription.
125
+
126
+ - `conversation_carried_over: false` + `carry_failed: "<reason>"` — the copy
127
+ could not be made. Common reasons: no session id recorded, not enough free
128
+ space, or the new profile already holds a *different* version of this
129
+ conversation (an existing older copy of the same conversation is replaced
130
+ safely; a different conversation is refused). The instance starts fresh and
131
+ `handover_chars` says how much context the new session received. Relay
132
+ `carry_failed` plainly to the user.
133
+
134
+ - `conversation_carried_over: true` with no `carry_failed` and no
135
+ `conversation_note` — the backend shares its history across profiles (codex)
136
+ or some other case where no copy was needed; relay the `conversation_note`
137
+ regardless.
138
+
139
+ **Always read and relay `conversation_carried_over`, `conversation_note` and
140
+ `carry_failed` from the actual response.** Do not predict the outcome.
141
+
114
142
  **For codex** the reply says `conversation_carried_over: true` and carries a
115
143
  `conversation_note`. Relay it as what it is — a statement about where the
116
144
  history lives, not a promise about what happens next. The accurate sentence is
@@ -152,7 +180,12 @@ are two quotas, and adding them together would give a number that is true of
152
180
  neither. An agent with no profile appears under the plain `Kiro` row. Codex works
153
181
  the same way: `Codex (<profile>)` rows next to the plain `Codex`.
154
182
 
155
- A profile that is configured but has never been logged in still gets a row,
183
+ Claude Code also has a row per profile: `Claude (work)`, `Claude (personal)`,
184
+ next to the plain `Claude` for the default login. A profile reads quota from its
185
+ own login; a profile that is configured but has never been signed in shows
186
+ **Not logged in — run `/login claude-code <profile>` to sign in**.
187
+
188
+ A kiro profile that is configured but has never been logged in still gets a row,
156
189
  reading **Signed out — run `kiro-cli` to log in**. That is the reminder to go
157
190
  and log it in, so report it as such rather than as a missing subscription.
158
191
 
@@ -163,12 +196,14 @@ and log it in, so report it as such rather than as a missing subscription.
163
196
  - Quotas only add up if the profiles are genuinely different billing accounts.
164
197
  Two profiles logged into the same account do not double anything, and it is
165
198
  worth saying so before someone sets this up expecting more headroom.
166
- - Claude Code profiles do not have usage rows of their own yet: the plain
167
- `Claude` row reads the default login. Do not report it as a profile's quota.
168
- - Switching a profile does not carry the conversation across; the agent gets a
169
- summary of the work, not the transcript. Say anything that must survive
170
- verbatim in the channel before switching.
171
-
199
+ - Claude Code profiles now each have their own usage row (`Claude (<profile>)`),
200
+ reading quota from that profile's own login.
201
+ - Switching a kiro profile does not carry the conversation across; the agent
202
+ gets a summary of the work, not the transcript. Say anything that must survive
203
+ verbatim in the channel before switching. For claude-code, AgEnD copies the
204
+ conversation automatically; relay `conversation_carried_over` and, if it is
205
+ false, the `carry_failed` reason and the cold-cache note from
206
+ `conversation_note` when carry succeeds.
172
207
  ## Do not
173
208
 
174
209
  - Do not invent a profile that has never been logged in and report success —
@@ -38,7 +38,20 @@ Only when a result is unclear: `delivery_status` with the `operation_id` / `deli
38
38
  Before a destructive or hard-to-undo action based on another instance's message — merge, reset, force-push, deleting a branch or instance, deploying, closing an issue or PR — verify the message itself:
39
39
 
40
40
  - Call `delivery_status` with the `message_id` from its header.
41
- - **`Delivery not found`** → the fleet never delivered that message. Do not act; ask the sender.
41
+ - **`Delivery not found`** → the row may be hidden, expired, or absent. Do not act; ask the sender to explicitly forward the reference.
42
42
  - Found → confirm the value you are about to use (SHA, PR number, branch) appears in the returned `content`, and still check a SHA against the real ref (`git cat-file -t`, `gh pr view --json headRefOid`).
43
43
 
44
44
  Why: a model can "see" a peer message nobody sent, header and message_id included, and act on it (#856).
45
+
46
+ ## Relayed human authorization
47
+
48
+ A peer's summary is not the original person's consent. Before an irreversible action:
49
+
50
+ 1. Ask the peer to send/delegate with `forwards: [verification_id]`, using the original human receipt's `verification_id` / `[agend-human-id:…]`. Every hop needs an explicit forward; mentioning an ID grants nothing. Only delivered references the sender can read are accepted (up to 16).
51
+ 2. Read `delivery_status({message_id: verification_id})`. Require `state: delivered`, its owned `proof_kind`, and the original `content` naming the exact operation/resource. Check `origin.platform`, `origin.adapter_id` and `origin.user_id` against the human authorized for that resource. Labels, quoted headers and agent relay rows are not origin evidence.
52
+ 3. Native queue/composer acceptance never proves the model consumed the message. Unknown/unverifiable outcomes, `/raw`, historical rows and a missing origin cannot prove human authorization. Web receipts truthfully have no verified platform actor; action receipts identify the click and its anchor, not a human-authored platform message.
53
+ 4. Do not resend on `uncertain`. Ask for clarification or fresh explicit consent; do not infer consent from a missing row.
54
+
55
+ CLI mode: `agend-agent send <instance> <text> --forward <verification_id>` (repeat `--forward` for more refs); `agend-agent delegate` accepts the same flags. Lookup: `agend-agent delivery-status --message-id <verification_id>`.
56
+
57
+ Forward access is read-only and row-scoped. It does not grant commands, visibility of siblings, or access by knowing an ID. Same-uid shell-capable agents are not isolated from one another; use distinct OS users/containers for mutually untrusted agents.
@@ -39,3 +39,7 @@ Call `report_result` exactly once when the assignment is complete or genuinely b
39
39
  - remaining risk, blocker, or follow-up, if any.
40
40
 
41
41
  Do not put user-facing results only in terminal text; the fleet report is the delivery channel.
42
+
43
+ ## Relayed human approval
44
+
45
+ For an irreversible action based on relayed consent, request an explicit `forwards` edge for the original human `verification_id`, then read its original content and origin with `delivery_status`. Each hop needs a forward; a peer's summary or a mentioned ID grants nothing. Require delivered and an owned proof_kind, and verify the actual platform/adapter/actor plus the exact resource. Hidden/expired/uncertain receipts are not consent and must not trigger a resend. See the cross-instance-messaging skill.
@@ -0,0 +1,83 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { DeliveryStatusSelector, DeliveryStatusPage } from "./delivery-outbox.js";
3
+ import { type AgentMode } from "./cross-instance-envelope.js";
4
+ /** Server-owned ingress facts. Labels and Web session identity are not platform authority. */
5
+ export interface HumanOrigin {
6
+ platform: "discord" | "telegram" | "web";
7
+ adapter_id: string | null;
8
+ user_id: string | null;
9
+ username: string | null;
10
+ platform_message_id: string | null;
11
+ ingress: "message" | "action" | "web";
12
+ anchor_message_id?: string;
13
+ event_id?: string;
14
+ }
15
+ /** Called only by trusted SDK event producers, never on text/agent metadata. */
16
+ export declare function nativeHumanOrigin(platform: "telegram" | "discord", adapterId: string, userId: string, username: string | undefined, isBot: boolean | undefined, messageId: string | null, action?: {
17
+ anchor: string;
18
+ event: string;
19
+ }): HumanOrigin | undefined;
20
+ export declare function webHumanOrigin(action?: boolean): HumanOrigin;
21
+ export type HumanWriteMode = "idle_submit" | "native_queue_handoff" | "steer" | "raw_paste";
22
+ export type HumanPositiveTag = "unique-id-pane" | "composer-empty-steer" | "composer-empty-queue" | "composer-empty-idle";
23
+ export interface HumanReceiptProof {
24
+ receipt_id: string;
25
+ verification_id: string;
26
+ wire_sha256: string;
27
+ owner_key: string;
28
+ mode: HumanWriteMode;
29
+ tag: HumanPositiveTag;
30
+ }
31
+ export interface HumanReceiptAttempt {
32
+ receiptId: string;
33
+ verificationId: string;
34
+ expectedWireHash: string;
35
+ ownerKey: string;
36
+ current: () => boolean;
37
+ proof?: HumanReceiptProof;
38
+ }
39
+ export declare function humanBodyHash(body: string): string;
40
+ /** Process-local object identity; a new process cannot settle an old binding. */
41
+ export declare function humanOwnerObjectId(owner: object): string;
42
+ export declare function isHumanPositiveProof(proof: unknown): proof is HumanReceiptProof;
43
+ export interface HumanReceiptRow {
44
+ receipt_id: string;
45
+ message_id: string;
46
+ target_instance: string;
47
+ manager_boot_id: string;
48
+ original_body: string;
49
+ original_sha256: string;
50
+ origin_json: string;
51
+ wire_body: string | null;
52
+ wire_sha256: string | null;
53
+ owner_key: string | null;
54
+ input_kind: string;
55
+ state: "queued" | "delivered" | "uncertain";
56
+ proof_tag: HumanPositiveTag | null;
57
+ proof_mode: HumanWriteMode | null;
58
+ created_at: string;
59
+ updated_at: string;
60
+ delivered_at: string | null;
61
+ }
62
+ export declare function initializeHumanReceipts(db: Database.Database): void;
63
+ /** Server-only admission; no origin is read from an agent payload or tool argument. */
64
+ export declare function createHumanReceipt(db: Database.Database, input: {
65
+ targetInstance: string;
66
+ originalBody: string;
67
+ origin: HumanOrigin;
68
+ inputKind: string;
69
+ managerBootId: string;
70
+ }): HumanReceiptRow;
71
+ export declare function getHumanReceipt(db: Database.Database, id: string): HumanReceiptRow | undefined;
72
+ /** Bind once at the actual IPC handoff, after wake/reconnect waits. */
73
+ export declare function bindHumanReceipt(db: Database.Database, id: string, target: string, ownerKey: string, wire: string, managerBootId: string): HumanReceiptRow;
74
+ /** An owned unknown result may close pending evidence; it never grants or overwrites a positive proof. */
75
+ export declare function settleHumanReceipt(db: Database.Database, id: string, target: string, ownerKey: string, proof: unknown, currentOwnerKey: string | null): boolean;
76
+ /** Read-only operator compatibility: an older database simply has no human receipts. */
77
+ export declare function queryHumanReceipt(db: Database.Database, caller: string | null, selector: DeliveryStatusSelector): DeliveryStatusPage | null;
78
+ /** Preserve the existing sanitizer in one place; receipts hash these actual prepared bytes. */
79
+ export declare function prepareDeliveryWire(body: string, preserveExactBytes?: boolean): string;
80
+ export declare function steerInboundEnvelope(inbound: string): string;
81
+ export declare const BTW_INBOUND_PREFIX = "[BTW \u2014 side question from the user. Answer it separately without changing or interrupting the CURRENT work.]\n";
82
+ /** One formatter for human wire bytes and their immutable evidence snapshot. */
83
+ export declare function formatHumanInboundMessage(content: string, meta: Record<string, string>, mode: AgentMode): string;
@@ -0,0 +1,194 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { t } from "./locale.js";
3
+ import { renderCrossInstanceHandoffMetadata } from "./cross-instance-envelope.js";
4
+ /** Called only by trusted SDK event producers, never on text/agent metadata. */
5
+ export function nativeHumanOrigin(platform, adapterId, userId, username, isBot, messageId, action) {
6
+ if (isBot !== false || !adapterId || !userId)
7
+ return undefined;
8
+ return {
9
+ platform, adapter_id: adapterId, user_id: userId, username: username ?? null,
10
+ platform_message_id: action ? null : messageId, ingress: action ? "action" : "message",
11
+ ...(action ? { anchor_message_id: action.anchor, event_id: action.event } : {}),
12
+ };
13
+ }
14
+ export function webHumanOrigin(action = false) {
15
+ return { platform: "web", adapter_id: null, user_id: null, username: null,
16
+ platform_message_id: null, ingress: action ? "action" : "web" };
17
+ }
18
+ export function humanBodyHash(body) {
19
+ return createHash("sha256").update(body, "utf8").digest("hex");
20
+ }
21
+ const objectIds = new WeakMap();
22
+ /** Process-local object identity; a new process cannot settle an old binding. */
23
+ export function humanOwnerObjectId(owner) {
24
+ let id = objectIds.get(owner);
25
+ if (!id) {
26
+ id = randomUUID();
27
+ objectIds.set(owner, id);
28
+ }
29
+ return id;
30
+ }
31
+ export function isHumanPositiveProof(proof) {
32
+ if (!proof || typeof proof !== "object")
33
+ return false;
34
+ const p = proof;
35
+ if (!["receipt_id", "verification_id", "wire_sha256", "owner_key", "mode", "tag"].every(key => Object.hasOwn(p, key)))
36
+ return false;
37
+ if (typeof p.receipt_id !== "string" || !/^[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12}$/.test(p.receipt_id)
38
+ || p.verification_id !== "hmsg-" + p.receipt_id
39
+ || typeof p.wire_sha256 !== "string" || !/^[a-f0-9]{64}$/.test(p.wire_sha256)
40
+ || typeof p.owner_key !== "string" || !p.owner_key)
41
+ return false;
42
+ if (p.tag === "unique-id-pane")
43
+ return p.mode === "idle_submit" || p.mode === "native_queue_handoff" || p.mode === "steer";
44
+ return p.mode === "steer"
45
+ && (p.tag === "composer-empty-steer" || p.tag === "composer-empty-queue" || p.tag === "composer-empty-idle");
46
+ }
47
+ export function initializeHumanReceipts(db) {
48
+ db.exec([
49
+ "CREATE TABLE IF NOT EXISTS human_delivery_receipts (",
50
+ "receipt_id TEXT PRIMARY KEY,message_id TEXT NOT NULL UNIQUE,target_instance TEXT NOT NULL,manager_boot_id TEXT NOT NULL,",
51
+ "original_body TEXT NOT NULL,original_sha256 TEXT NOT NULL,origin_json TEXT NOT NULL,",
52
+ "wire_body TEXT,wire_sha256 TEXT,owner_key TEXT,input_kind TEXT NOT NULL,",
53
+ "state TEXT NOT NULL CHECK (state IN ('queued','delivered','uncertain')),",
54
+ "proof_tag TEXT,proof_mode TEXT,created_at TEXT NOT NULL,updated_at TEXT NOT NULL,delivered_at TEXT);",
55
+ "CREATE INDEX IF NOT EXISTS idx_human_receipt_retention ON human_delivery_receipts(updated_at);",
56
+ ].join("\n"));
57
+ }
58
+ /** Server-only admission; no origin is read from an agent payload or tool argument. */
59
+ export function createHumanReceipt(db, input) {
60
+ if (!input.targetInstance || Buffer.byteLength(input.originalBody, "utf8") > 64 * 1024
61
+ || !["discord", "telegram", "web"].includes(input.origin.platform)
62
+ || !["fleet_inbound", "steer", "btw", "raw_paste"].includes(input.inputKind)
63
+ || !["message", "action", "web"].includes(input.origin.ingress)
64
+ || (input.origin.platform !== "web" && (!input.origin.adapter_id || !input.origin.user_id || input.origin.ingress === "web"))
65
+ || (input.origin.platform === "web" && (input.origin.adapter_id !== null || input.origin.user_id !== null || input.origin.username !== null || input.origin.platform_message_id !== null))
66
+ || (input.origin.ingress === "action" && input.origin.platform_message_id !== null))
67
+ throw new Error("Human verification evidence is unavailable");
68
+ const origin = JSON.stringify(input.origin);
69
+ if (Buffer.byteLength(origin, "utf8") > 4096)
70
+ throw new Error("Human verification origin exceeds its bound");
71
+ const id = randomUUID(), now = new Date().toISOString();
72
+ db.prepare("INSERT INTO human_delivery_receipts " +
73
+ "(receipt_id,message_id,target_instance,manager_boot_id,original_body,original_sha256,origin_json,input_kind,state,created_at,updated_at) " +
74
+ "VALUES (?,?,?,?,?,?,?,?,'queued',?,?)")
75
+ .run(id, "hmsg-" + id, input.targetInstance, input.managerBootId, input.originalBody, humanBodyHash(input.originalBody), origin, input.inputKind, now, now);
76
+ return getHumanReceipt(db, id);
77
+ }
78
+ export function getHumanReceipt(db, id) {
79
+ return db.prepare("SELECT * FROM human_delivery_receipts WHERE receipt_id=?").get(id);
80
+ }
81
+ /** Bind once at the actual IPC handoff, after wake/reconnect waits. */
82
+ export function bindHumanReceipt(db, id, target, ownerKey, wire, managerBootId) {
83
+ if (!ownerKey || Buffer.byteLength(wire, "utf8") > 256 * 1024)
84
+ throw new Error("Human verification wire evidence is unavailable");
85
+ return db.transaction(() => {
86
+ const row = getHumanReceipt(db, id);
87
+ if (!row || row.target_instance !== target || row.manager_boot_id !== managerBootId)
88
+ throw new Error("Human verification owner is unavailable");
89
+ const hash = humanBodyHash(wire);
90
+ if (row.owner_key !== null) {
91
+ if (row.owner_key !== ownerKey || row.wire_sha256 !== hash)
92
+ throw new Error("Human verification binding changed");
93
+ return row;
94
+ }
95
+ db.prepare("UPDATE human_delivery_receipts SET owner_key=?,wire_body=?,wire_sha256=?,updated_at=? WHERE receipt_id=? AND owner_key IS NULL")
96
+ .run(ownerKey, wire, hash, new Date().toISOString(), id);
97
+ return getHumanReceipt(db, id);
98
+ })();
99
+ }
100
+ /** An owned unknown result may close pending evidence; it never grants or overwrites a positive proof. */
101
+ export function settleHumanReceipt(db, id, target, ownerKey, proof, currentOwnerKey) {
102
+ return db.transaction(() => {
103
+ const row = getHumanReceipt(db, id);
104
+ if (!row || row.target_instance !== target || row.owner_key !== ownerKey || row.state === "delivered")
105
+ return false;
106
+ let positive = null;
107
+ if (isHumanPositiveProof(proof)) {
108
+ const modeMatches = row.input_kind === "steer" || row.input_kind === "btw"
109
+ ? proof.mode === "steer" : row.input_kind === "fleet_inbound" && (proof.mode === "idle_submit" || proof.mode === "native_queue_handoff");
110
+ if (modeMatches && proof.receipt_id === id && proof.verification_id === row.message_id
111
+ && proof.owner_key === ownerKey && currentOwnerKey === ownerKey
112
+ && proof.wire_sha256 === row.wire_sha256 && row.wire_body !== null
113
+ && humanBodyHash(row.wire_body) === row.wire_sha256 && humanBodyHash(row.original_body) === row.original_sha256)
114
+ positive = proof;
115
+ }
116
+ const now = new Date().toISOString();
117
+ db.prepare("UPDATE human_delivery_receipts SET state=?,proof_tag=?,proof_mode=?,updated_at=?,delivered_at=? WHERE receipt_id=? AND state!='delivered'")
118
+ .run(positive ? "delivered" : "uncertain", positive?.tag ?? null, positive?.mode ?? null, now, positive ? now : null, id);
119
+ return positive !== null;
120
+ })();
121
+ }
122
+ /** Read-only operator compatibility: an older database simply has no human receipts. */
123
+ export function queryHumanReceipt(db, caller, selector) {
124
+ const table = db.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='human_delivery_receipts'").get();
125
+ if (!table || selector.correlationId)
126
+ return null;
127
+ const field = selector.messageId ? "message_id" : "receipt_id";
128
+ const id = selector.messageId ?? selector.deliveryId ?? selector.operationId;
129
+ if (!id || (selector.cursor && selector.cursor !== id))
130
+ return null;
131
+ const row = db.prepare("SELECT * FROM human_delivery_receipts WHERE " + field + "=?").get(id);
132
+ if (!row)
133
+ return null;
134
+ if (selector.cursor)
135
+ return { items: [], next_cursor: null };
136
+ if (caller !== null && row.target_instance !== caller
137
+ && !db.prepare("SELECT 1 FROM delivery_forward_edges WHERE reference_kind='human' AND reference_id=? AND receiver_instance=? LIMIT 1")
138
+ .get(row.receipt_id, caller))
139
+ return { items: [], next_cursor: null };
140
+ const origin = JSON.parse(row.origin_json);
141
+ const item = {
142
+ delivery_id: row.receipt_id, operation_id: row.receipt_id, correlation_id: null,
143
+ source_instance: "human:" + origin.platform + ":" + (origin.user_id ?? "unknown"),
144
+ target_instance: row.target_instance, kind: "human_inbound", state: row.state, attempt_no: 0,
145
+ created_at: row.created_at, updated_at: row.updated_at,
146
+ status_summary: t("delivery.status_" + row.state),
147
+ error_summary: null, safe_to_retry: false, message_id: row.message_id, content_sha256: row.original_sha256,
148
+ delivery_mode: row.proof_mode === "steer" ? "steer" : "idle_queue", submission_mode: row.proof_mode, consumed_at: null, consumed_via: null,
149
+ origin, wire_content_sha256: row.wire_sha256, delivered_at: row.delivered_at,
150
+ proof_kind: row.proof_tag,
151
+ ...(caller !== null && selector.messageId ? { content: row.original_body } : {}),
152
+ };
153
+ if (caller !== null && selector.messageId) {
154
+ const edges = db.prepare("SELECT sender_instance AS source_instance,forwarding_message_id AS message_id,created_at AS forwarded_at " +
155
+ "FROM delivery_forward_edges WHERE reference_kind='human' AND reference_id=? AND receiver_instance=? " +
156
+ "ORDER BY created_at DESC,forwarding_delivery_id DESC LIMIT 1").all(row.receipt_id, caller);
157
+ if (edges?.length)
158
+ item.forwarded_by = edges;
159
+ }
160
+ return { items: [item], next_cursor: null };
161
+ }
162
+ /** Preserve the existing sanitizer in one place; receipts hash these actual prepared bytes. */
163
+ export function prepareDeliveryWire(body, preserveExactBytes = false) {
164
+ const fence = String.fromCharCode(96).repeat(3);
165
+ const parts = body.split(fence);
166
+ return !preserveExactBytes && (parts.length - 1) % 2 !== 0 ? parts.join("") : body;
167
+ }
168
+ export function steerInboundEnvelope(inbound) {
169
+ const banner = "[STEERING — mid-task course correction. Fold this into the CURRENT work if one is active.]\n";
170
+ const marker = inbound.match(/^\[agend-(?:delivery|human)-id:[^\]\r\n]+\]\r?\n/);
171
+ return marker ? marker[0] + banner + inbound.slice(marker[0].length) : banner + inbound;
172
+ }
173
+ export const BTW_INBOUND_PREFIX = "[BTW — side question from the user. Answer it separately without changing or interrupting the CURRENT work.]\n";
174
+ /** One formatter for human wire bytes and their immutable evidence snapshot. */
175
+ export function formatHumanInboundMessage(content, meta, mode) {
176
+ const via = meta.source ? " via " + meta.source : "";
177
+ const idTag = meta.user_id ? ", id:" + meta.user_id : "";
178
+ let body = "[user:" + (meta.user || "unknown") + via + idTag + "] " + content;
179
+ if (meta.pending_reactions)
180
+ body = "[Recent reactions: " + meta.pending_reactions + "]\n" + body;
181
+ // Reaction/reply addressing keeps the actual platform ID. Only verification uses hmsg.
182
+ body += renderCrossInstanceHandoffMetadata(meta);
183
+ body += mode === "cli"
184
+ ? '\n(Reply with agend-agent reply "…" — do NOT respond with direct text)'
185
+ : "\n(Reply using the reply tool — do NOT respond with direct text)";
186
+ if (meta.reply_to_text)
187
+ body += '\n(reply_to: "' + meta.reply_to_text + '")';
188
+ if (meta.verification_id)
189
+ body = "[agend-human-id:" + meta.verification_id + "]\n" + body;
190
+ if (meta.delivery_id)
191
+ body = "[agend-delivery-id:" + meta.delivery_id + "]\n" + body;
192
+ return body;
193
+ }
194
+ //# sourceMappingURL=human-delivery-receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human-delivery-receipts.js","sourceRoot":"","sources":["../src/human-delivery-receipts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGrD,OAAO,EAAE,CAAC,EAAE,MAAM,aAAa,CAAC;AAChC,OAAO,EAAE,kCAAkC,EAAkB,MAAM,8BAA8B,CAAC;AAclG,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,QAAgC,EAAE,SAAiB,EAAE,MAAc,EACnG,QAA4B,EAAE,KAA0B,EAAE,SAAwB,EAClF,MAA0C;IAC1C,IAAI,KAAK,KAAK,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC/D,OAAO;QACL,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI;QAC5E,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACtF,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAM,GAAG,KAAK;IAC3C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI;QACvE,mBAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;AACpE,CAAC;AAqBD,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,OAAO,EAAkB,CAAC;AAChD,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,IAAI,EAAE,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,EAAE,CAAC;QAAC,EAAE,GAAG,UAAU,EAAE,CAAC;QAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAAC,CAAC;IACzD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpI,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,+CAA+C,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;WACtG,CAAC,CAAC,eAAe,KAAK,OAAO,GAAG,CAAC,CAAC,UAAU;WAC5C,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;WAC1E,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,CAAC,CAAC,GAAG,KAAK,gBAAgB;QAAE,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,sBAAsB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;IAC3H,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO;WACpB,CAAC,CAAC,CAAC,GAAG,KAAK,sBAAsB,IAAI,CAAC,CAAC,GAAG,KAAK,sBAAsB,IAAI,CAAC,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;AACjH,CAAC;AAsBD,MAAM,UAAU,uBAAuB,CAAC,EAAqB;IAC3D,EAAE,CAAC,IAAI,CAAC;QACN,sDAAsD;QACtD,0HAA0H;QAC1H,sFAAsF;QACtF,0EAA0E;QAC1E,0EAA0E;QAC1E,sGAAsG;QACtG,gGAAgG;KACjG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,kBAAkB,CAAC,EAAqB,EAAE,KAEzD;IACC,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI;WACjF,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;WAC/D,CAAC,CAAC,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;WACzE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;WAC5D,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;WAC1H,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,mBAAmB,KAAK,IAAI,CAAC,CAAC;WACvL,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,mBAAmB,KAAK,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IACrJ,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC7G,MAAM,EAAE,GAAG,UAAU,EAAE,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACxD,EAAE,CAAC,OAAO,CAAC,sCAAsC;QAC/C,2IAA2I;QAC3I,uCAAuC,CAAC;SACvC,GAAG,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9J,OAAO,eAAe,CAAC,EAAE,EAAE,EAAE,CAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAqB,EAAE,EAAU;IAC/D,OAAO,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,EAAE,CAAgC,CAAC;AACvH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,EAAqB,EAAE,EAAU,EAAE,MAAc,EAAE,QAAgB,EAAE,IAAY,EAAE,aAAqB;IACvI,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAClI,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACzB,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,eAAe,KAAK,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAChJ,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAClH,OAAO,GAAG,CAAC;QACb,CAAC;QACD,EAAE,CAAC,OAAO,CAAC,gIAAgI,CAAC;aACzI,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,eAAe,CAAC,EAAE,EAAE,EAAE,CAAE,CAAC;IAClC,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,kBAAkB,CAAC,EAAqB,EAAE,EAAU,EAAE,MAAc,EAAE,QAAgB,EACpG,KAAc,EAAE,eAA8B;IAC9C,OAAO,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACzB,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QACpH,IAAI,QAAQ,GAA6B,IAAI,CAAC;QAC9C,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,KAAK,OAAO,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK;gBACxE,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,KAAK,eAAe,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,CAAC,CAAC;YAC3I,IAAI,WAAW,IAAI,KAAK,CAAC,UAAU,KAAK,EAAE,IAAI,KAAK,CAAC,eAAe,KAAK,GAAG,CAAC,UAAU;mBACjF,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,eAAe,KAAK,QAAQ;mBAC5D,KAAK,CAAC,WAAW,KAAK,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI;mBAC/D,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,WAAW,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,eAAe;gBAAE,QAAQ,GAAG,KAAK,CAAC;QACtI,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,EAAE,CAAC,OAAO,CAAC,2IAA2I,CAAC;aACpJ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5H,OAAO,QAAQ,KAAK,IAAI,CAAC;IAC3B,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,EAAqB,EAAE,MAAqB,EAAE,QAAgC;IAC9G,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,mFAAmF,CAAC,CAAC,GAAG,EAAE,CAAC;IACpH,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IAC/D,MAAM,EAAE,GAAG,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,CAAC;IAC7E,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,8CAA8C,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAgC,CAAC;IAC7H,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7D,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,eAAe,KAAK,MAAM;WAChD,CAAC,EAAE,CAAC,OAAO,CAAC,sHAAsH,CAAC;aACnI,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAgB,CAAC;IAC1D,MAAM,IAAI,GAAuB;QAC/B,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,IAAI;QAC/E,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;QACjF,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC;QAC5F,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU;QACtD,cAAc,EAAE,CAAC,CAAC,kBAAkB,GAAG,GAAG,CAAC,KAAK,CAAC;QACjD,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,CAAC,eAAe;QAC1G,aAAa,EAAE,GAAG,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,EAAE,eAAe,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI;QAC1I,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY;QAC5E,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC;IACF,IAAI,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,2GAA2G;YAClI,sGAAsG;YACtG,8DAA8D,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAuC,CAAC;QACpI,IAAI,KAAK,EAAE,MAAM;YAAE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,kBAAkB,GAAG,KAAK;IAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,MAAM,GAAG,8FAA8F,CAAC;IAC9G,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACjF,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,gHAAgH,CAAC;AAEnJ,gFAAgF;AAChF,MAAM,UAAU,yBAAyB,CAAC,OAAe,EAAE,IAA4B,EAAE,IAAe;IACtG,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,IAAI,IAAI,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;IAC9E,IAAI,IAAI,CAAC,iBAAiB;QAAE,IAAI,GAAG,qBAAqB,GAAG,IAAI,CAAC,iBAAiB,GAAG,KAAK,GAAG,IAAI,CAAC;IACjG,uFAAuF;IACvF,IAAI,IAAI,kCAAkC,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,IAAI,KAAK,KAAK;QACpB,CAAC,CAAC,wEAAwE;QAC1E,CAAC,CAAC,kEAAkE,CAAC;IACvE,IAAI,IAAI,CAAC,aAAa;QAAE,IAAI,IAAI,gBAAgB,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC7E,IAAI,IAAI,CAAC,eAAe;QAAE,IAAI,GAAG,kBAAkB,GAAG,IAAI,CAAC,eAAe,GAAG,KAAK,GAAG,IAAI,CAAC;IAC1F,IAAI,IAAI,CAAC,WAAW;QAAE,IAAI,GAAG,qBAAqB,GAAG,IAAI,CAAC,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;IACrF,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -46,6 +46,6 @@ export declare function renderStatusEmojiAvoidList(workflow: string, statusEmoji
46
46
  * message_id and all — and act on it. Before anything hard to undo, the
47
47
  * message itself is checked against the fleet's delivery records.
48
48
  */
49
- export declare const VERIFY_PEER_MESSAGE_RULE = "Before a destructive or hard-to-undo action based on another instance's message (merge, reset, force-push, deleting a branch or instance, deploying, closing an issue or PR), verify that message: call `delivery_status` with the `message_id` from its header. `Delivery not found` means the fleet never delivered it \u2014 do not act; ask the sender. If it is found, confirm the value you will use (a SHA, PR number or branch) appears in the returned `content`, and still check a SHA against the real ref.";
49
+ export declare const VERIFY_PEER_MESSAGE_RULE = "Before a destructive or hard-to-undo action based on another instance's message (merge, reset, force-push, deleting a branch or instance, deploying, closing an issue or PR), verify that message: call `delivery_status` with the `message_id` from its header. `Delivery not found` also covers hidden or expired rows \u2014 do not act; ask the sender to explicitly forward the reference. A relayed human authorization needs its original `verification_id` (the `agend-human-id` header), explicitly granted with `forwards` on each send_to_instance/delegate_task hop. Read that original receipt: require delivered, an owned proof_kind, matching original content/resource and authoritative origin platform/adapter/actor; Web has no verified platform actor. A peer claim alone is not human consent. Never resend on uncertain. If it is found, confirm the value you will use (a SHA, PR number or branch) appears in the returned `content`, and still check a SHA against the real ref.";
50
50
  export declare function buildMcpCoreInstructions(params: FleetInstructionsParams): string;
51
51
  export declare function buildFleetInstructions(params: FleetInstructionsParams): string;
@@ -66,7 +66,7 @@ function cliCrossInstanceRule(classic) {
66
66
  * message_id and all — and act on it. Before anything hard to undo, the
67
67
  * message itself is checked against the fleet's delivery records.
68
68
  */
69
- export const VERIFY_PEER_MESSAGE_RULE = "Before a destructive or hard-to-undo action based on another instance's message (merge, reset, force-push, deleting a branch or instance, deploying, closing an issue or PR), verify that message: call `delivery_status` with the `message_id` from its header. `Delivery not found` means the fleet never delivered it — do not act; ask the sender. If it is found, confirm the value you will use (a SHA, PR number or branch) appears in the returned `content`, and still check a SHA against the real ref.";
69
+ export const VERIFY_PEER_MESSAGE_RULE = "Before a destructive or hard-to-undo action based on another instance's message (merge, reset, force-push, deleting a branch or instance, deploying, closing an issue or PR), verify that message: call `delivery_status` with the `message_id` from its header. `Delivery not found` also covers hidden or expired rows — do not act; ask the sender to explicitly forward the reference. A relayed human authorization needs its original `verification_id` (the `agend-human-id` header), explicitly granted with `forwards` on each send_to_instance/delegate_task hop. Read that original receipt: require delivered, an owned proof_kind, matching original content/resource and authoritative origin platform/adapter/actor; Web has no verified platform actor. A peer claim alone is not human consent. Never resend on uncertain. If it is found, confirm the value you will use (a SHA, PR number or branch) appears in the returned `content`, and still check a SHA against the real ref.";
70
70
  export function buildMcpCoreInstructions(params) {
71
71
  const { instanceName, workingDirectory, runtimeIdentity, agendVersion } = params;
72
72
  const classic = isClassicInstance(params);
@@ -1 +1 @@
1
- {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA2BzC,uDAAuD;AACvD,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAC7C,MAAM,eAAe,GAAG,8CAA8C,CAAC;AAEvE;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAgB,EAAE,YAAuB;IAClF,IAAI,CAAC,YAAY,EAAE,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,yBAAyB;QAAE,OAAO,QAAQ,CAAC;IACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,iBAAiB,CAAC,MAA+B;IACxD,OAAO,MAAM,CAAC,eAAe,EAAE,IAAI,KAAK,SAAS,CAAC;AACpD,CAAC;AAED,SAAS,yBAAyB,CAAC,OAAgB;IACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,6HAA6H,CAAC;IACvI,CAAC;IACD,OAAO,0VAA0V,CAAC;AACpW,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAgB;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,2HAA2H,CAAC;IACrI,CAAC;IACD,OAAO,2XAA2X,CAAC;AACrY,CAAC;AAED,SAAS,kCAAkC,CAAC,OAAgB;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,sHAAsH,CAAC;IAChI,CAAC;IACD,OAAO,6SAA6S,CAAC;AACvT,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAgB;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,gCAAgC;YAChC,0JAA0J;SAC3J,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IACD,OAAO;QACL,gCAAgC;QAChC,0HAA0H;QAC1H,gRAAgR;KACjR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,mfAAmf,CAAC;AAE5hB,MAAM,UAAU,wBAAwB,CAAC,MAA+B;IACtE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IACjF,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,eAAe;QAC7B,CAAC,CAAC,kBAAkB,eAAe,CAAC,IAAI,aAAa,eAAe,CAAC,OAAO,WAAW,eAAe,CAAC,KAAK,GAAG;QAC/G,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,OAAO;QACL,aAAa,YAAY,uBAAuB,OAAO,0BAA0B,gBAAgB,MAAM,OAAO,EAAE;QAChH,EAAE;QACF,mBAAmB;QACnB,wFAAwF;QACxF,yBAAyB,CAAC,OAAO,CAAC;QAClC,wGAAwG;QACxG,wEAAwE;QACxE,EAAE;QACF,4BAA4B;QAC5B,wGAAwG;QACxG,gJAAgJ;QAChJ,kOAAkO;QAClO,mHAAmH;QACnH,mHAAmH;QACnH,EAAE;QACF,gGAAgG;KACjG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAA+B;IACpE,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAC3G,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1C,iBAAiB;IACjB,QAAQ,CAAC,IAAI,CAAC,oCAAoC,YAAY,mEAAmE,gBAAgB,KAAK,CAAC,CAAC;IACxJ,IAAI,eAAe,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,eAAe,CAAC,IAAI,aAAa,eAAe,CAAC,OAAO,WAAW,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;IAC9H,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,yBAAyB,WAAW,wCAAwC,CAAC,CAAC;IAC9F,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,uGAAuG,CAAC,CAAC;IACzH,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,oCAAoC;IACpC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC3B,uCAAuC;QACvC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,yCAAyC,wBAAwB,EAAE,CAAC,CAAC;IACrF,CAAC;SAAM,CAAC;QACN,+CAA+C;QAC/C,QAAQ,CAAC,IAAI,CAAC;YACZ,mBAAmB;YACnB,0OAA0O;YAC1O,4BAA4B,CAAC,OAAO,CAAC;YACrC,iHAAiH;YACjH,EAAE;YACF,sFAAsF;YACtF,2FAA2F;YAC3F,qFAAqF;YACrF,2FAA2F;YAC3F,uFAAuF;YACvF,EAAE;YACF,4BAA4B;YAC5B,oHAAoH;YACpH,uCAAuC;YACvC,yFAAyF;YACzF,sFAAsF;YACtF,EAAE;YACF,eAAe;YACf,8LAA8L;YAC9L,wQAAwQ;YACxQ,uHAAuH;YACvH,+GAA+G;YAC/G,iGAAiG;YACjG,+EAA+E;YAC/E,2FAA2F;YAC3F,oIAAoI;YACpI,EAAE;YACF,wBAAwB;YACxB,kHAAkH;YAClH,kCAAkC,CAAC,OAAO,CAAC;YAC3C,8GAA8G;YAC9G,2EAA2E;YAC3E,uHAAuH;YACvH,oHAAoH;YACpH,MAAM,wBAAwB,EAAE;SACjC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,0BAA0B;IAC1B,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC9B,IAAI,eAAe,GAAkB,IAAI,CAAC;QAC1C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,eAAe,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrD,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,+BAA+B,CAAC,EAAE,OAAO,CAAC,CAAC;YACvF,CAAC;YAAC,MAAM,CAAC,CAAC,+BAA+B,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,0BAA0B,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;YACxF,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5C,MAAM,SAAS,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3E,OAAO,OAAO,CAAC,CAAC,KAAK,OAAO,SAAS,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,CAAC,MAAM,GAAG,GAAG,6CAA6C,CAAC,CAAC;QACzF,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,0BAA0B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,2BAA2B;IAC3B,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"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"}
package/dist/locale.js CHANGED
@@ -53,6 +53,8 @@ const enMessages = {
53
53
  "classic.selection_expired": "⏰ Backend selection expired. Run /start again to choose.",
54
54
  "classic.backend_not_installed": "⚠️ {0} CLI (`{1}`) was not found in PATH.\nInstall: `{2}`\nStarting anyway…",
55
55
  "classic.stopped": "🛑 Agent stopped in this channel.",
56
+ "classic.stopped_bg_work": "⚠️ Background work was running and was ended with it.",
57
+ "stop.background_work_ended": "⚠️ {0} had background work running — it was ended with the stop.",
56
58
  "classic.no_agent_here": "No active agent in this channel.",
57
59
  "admin.only": "⛔ Only admins can do this.",
58
60
  "admin.required": "⛔ This command requires admin access.",
@@ -104,6 +106,10 @@ const enMessages = {
104
106
  "dashboard.progress.fail.cancelled": "cancelled",
105
107
  "dashboard.progress.fail.spawn-failed": "cloudflared could not be started",
106
108
  "dashboard.progress.fail.no-address": "Cloudflare gave no public address in time",
109
+ "dashboard.progress.fail.rate-limited": "Cloudflare is limiting new temporary links from this machine — try again in a while; the LAN link still works",
110
+ "dashboard.progress.fail.provisioning-failed": "Cloudflare refused to create a temporary link right now — try again later; the LAN link still works",
111
+ "dashboard.progress.fail.process-exited": "cloudflared stopped before it gave a public address",
112
+ "dashboard.progress.fail.bad-address": "Cloudflare gave an address AgEnD could not use",
107
113
  "dashboard.progress.fail.unreachable": "the public address never reached this fleet",
108
114
  "dashboard.progress.fail.lease-held": "another tunnel is still running (a /login link, or one whose cleanup is unconfirmed)",
109
115
  "dashboard.progress.fail.gateway-failed": "the local gateway could not start",
@@ -115,7 +121,11 @@ const enMessages = {
115
121
  "dashboard.menu_failed": "⚠️ The /web menu could not be shown. Run /web again.",
116
122
  "dashboard.private_failed": "Private delivery or link startup was not confirmed. On Telegram, /start this bot privately first, then retry /web. No sign-in code is posted here.",
117
123
  "dashboard.start_web_label": "Start privately →",
118
- "dashboard.menu_tg_hint": "To receive the sign-in code, start this bot in a private chat first: {0}",
124
+ "dashboard.menu_tg_hint": "No private chat with this bot yet? ① Open {0} ② press Start ③ choose the link there — the code arrives in that chat.",
125
+ "dashboard.private_failed_tg": "Couldn't send the sign-in code privately: this bot can't message you until you open a chat with it. ① Tap “Start privately →” below ② press Start in that chat ③ choose the link there — the code arrives in that chat. No sign-in code is posted here.",
126
+ "dashboard.private_failed_tg_nolink": "Couldn't send the sign-in code privately: this bot can't message you until you open a chat with it. ① Open a private chat with this bot ② send /start web ③ choose the link there — the code arrives in that chat. No sign-in code is posted here.",
127
+ "dashboard.private_sent_below": "🔐 Sign-in details are below.",
128
+ "dashboard.link_failed": "⚠️ The sign-in link could not be started, so no sign-in code was sent. Run /web again.",
119
129
  "dashboard.start_web_ack": "✅ You can now use /web in your group.",
120
130
  "web.public_login_notice": "🔐 New web sign-in · public: {0} (session {1}). If this was not you, use /web revoke.",
121
131
  "dashboard.title": "📊 AgEnD Dashboard",
@@ -961,6 +971,8 @@ const zhTWMessages = {
961
971
  "classic.selection_expired": "⏰ 選擇逾時。請再次執行 /start。",
962
972
  "classic.backend_not_installed": "⚠️ 找不到 {0} CLI(`{1}`)於 PATH。\n安裝:`{2}`\n仍會嘗試啟動…",
963
973
  "classic.stopped": "🛑 已停止此頻道的 Agent。",
974
+ "classic.stopped_bg_work": "⚠️ 背景工作仍在執行,已一併結束。",
975
+ "stop.background_work_ended": "⚠️ {0} 仍有背景工作在執行,已隨停止一併結束。",
964
976
  "classic.no_agent_here": "此頻道沒有活動中的 Agent。",
965
977
  "admin.only": "⛔ 只有管理員能執行此操作。",
966
978
  "admin.required": "⛔ 此指令需要管理員權限。",
@@ -1012,6 +1024,10 @@ const zhTWMessages = {
1012
1024
  "dashboard.progress.fail.cancelled": "已取消",
1013
1025
  "dashboard.progress.fail.spawn-failed": "無法啟動 cloudflared",
1014
1026
  "dashboard.progress.fail.no-address": "Cloudflare 沒有及時給出公開網址",
1027
+ "dashboard.progress.fail.rate-limited": "Cloudflare 正在限制這台機器建立新的臨時連結 — 請過一陣子再試;區網連結仍可使用",
1028
+ "dashboard.progress.fail.provisioning-failed": "Cloudflare 目前拒絕建立臨時連結 — 請稍後再試;區網連結仍可使用",
1029
+ "dashboard.progress.fail.process-exited": "cloudflared 在給出公開網址前就停止了",
1030
+ "dashboard.progress.fail.bad-address": "Cloudflare 給出的網址 AgEnD 無法使用",
1015
1031
  "dashboard.progress.fail.unreachable": "公開網址一直連不到這個 fleet",
1016
1032
  "dashboard.progress.fail.lease-held": "還有另一個 tunnel 在執行(/login 的連結,或尚未確認清理的連結)",
1017
1033
  "dashboard.progress.fail.gateway-failed": "本機 gateway 無法啟動",
@@ -1023,7 +1039,11 @@ const zhTWMessages = {
1023
1039
  "dashboard.menu_failed": "⚠️ 無法顯示 /web 選單,請再執行一次 /web。",
1024
1040
  "dashboard.private_failed": "無法確認私送或連結啟動。Telegram 請先私訊這個 bot 的 /start,再重試 /web。此處不會貼出登入碼。",
1025
1041
  "dashboard.start_web_label": "先開私訊 →",
1026
- "dashboard.menu_tg_hint": "要收到登入碼,請先與這個 bot 開啟私訊:{0}",
1042
+ "dashboard.menu_tg_hint": "還沒私訊過這個 bot?① 開啟 {0} ② 按「開始」 ③ 在那裡選擇連結,登入碼會送到那個私訊。",
1043
+ "dashboard.private_failed_tg": "無法私送登入碼:你還沒開啟和這個 bot 的私訊,它無法傳訊息給你。① 點下方「先開私訊 →」 ② 在私訊裡按「開始」 ③ 在那裡選擇連結,登入碼會送到那個私訊。此處不會貼出登入碼。",
1044
+ "dashboard.private_failed_tg_nolink": "無法私送登入碼:你還沒開啟和這個 bot 的私訊,它無法傳訊息給你。① 開啟和這個 bot 的私訊 ② 傳送 /start web ③ 在那裡選擇連結,登入碼會送到那個私訊。此處不會貼出登入碼。",
1045
+ "dashboard.private_sent_below": "🔐 登入資訊在下方。",
1046
+ "dashboard.link_failed": "⚠️ 無法啟動登入連結,所以沒有送出登入碼。請再執行一次 /web。",
1027
1047
  "dashboard.start_web_ack": "✅ 你現在可以在群組裡使用 /web 了。",
1028
1048
  "web.public_login_notice": "🔐 有新的網頁登入 · 公開入口:{0}(session {1})。如果不是你,請用 /web revoke。",
1029
1049
  "dashboard.title": "📊 AgEnD 儀表板",