@scotthuang/agent-knock-knock 0.12.37 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +3 -0
  3. package/dist/src/agent-session-provider.d.ts +5 -0
  4. package/dist/src/agent-session-provider.js +10 -1
  5. package/dist/src/agent-session-provider.js.map +1 -1
  6. package/dist/src/callback-outbox-service.d.ts +2 -0
  7. package/dist/src/callback-outbox-service.js +1 -1
  8. package/dist/src/callback-outbox-service.js.map +1 -1
  9. package/dist/src/callback-transport.d.ts +7 -0
  10. package/dist/src/callback-transport.js +1 -1
  11. package/dist/src/callback-transport.js.map +1 -1
  12. package/dist/src/cli-core.js +35 -32
  13. package/dist/src/cli-core.js.map +1 -1
  14. package/dist/src/codex-store-adapter.d.ts +1 -1
  15. package/dist/src/codex-store-adapter.js +35 -8
  16. package/dist/src/codex-store-adapter.js.map +1 -1
  17. package/dist/src/deferred-foreground-authority-cli-adapter.d.ts +20 -0
  18. package/dist/src/deferred-foreground-authority-cli-adapter.js +216 -8
  19. package/dist/src/deferred-foreground-authority-cli-adapter.js.map +1 -1
  20. package/dist/src/host-adapter.d.ts +1 -1
  21. package/dist/src/host-adapter.js +1 -1
  22. package/dist/src/host-bridge-tools.js +2 -2
  23. package/dist/src/managed-turn-recovery-service.d.ts +8 -1
  24. package/dist/src/managed-turn-recovery-service.js +55 -13
  25. package/dist/src/managed-turn-recovery-service.js.map +1 -1
  26. package/dist/src/mutation-transaction.d.ts +1 -0
  27. package/dist/src/mutation-transaction.js +19 -15
  28. package/dist/src/mutation-transaction.js.map +1 -1
  29. package/dist/src/native-thread-lifecycle-cli-adapter.d.ts +39 -3
  30. package/dist/src/native-thread-lifecycle-cli-adapter.js +307 -7
  31. package/dist/src/native-thread-lifecycle-cli-adapter.js.map +1 -1
  32. package/dist/src/openclaw-plugin-callback-adapter.js +17 -7
  33. package/dist/src/openclaw-plugin-callback-adapter.js.map +1 -1
  34. package/dist/src/openclaw-plugin-command-adapter.js +297 -83
  35. package/dist/src/openclaw-plugin-command-adapter.js.map +1 -1
  36. package/dist/src/openclaw-plugin-schemas.d.ts +57 -0
  37. package/dist/src/openclaw-plugin-schemas.js +59 -1
  38. package/dist/src/openclaw-plugin-schemas.js.map +1 -1
  39. package/dist/src/openclaw-private-authority-offers.d.ts +17 -0
  40. package/dist/src/openclaw-private-authority-offers.js +75 -3
  41. package/dist/src/openclaw-private-authority-offers.js.map +1 -1
  42. package/dist/src/store.d.ts +1 -1
  43. package/dist/src/store.js +6 -4
  44. package/dist/src/store.js.map +1 -1
  45. package/dist/src/terminal-acceptance-application-service.js +2 -2
  46. package/dist/src/terminal-acceptance-application-service.js.map +1 -1
  47. package/dist/src/terminal-acceptance-cli-adapter.d.ts +11 -1
  48. package/dist/src/terminal-acceptance-cli-adapter.js +290 -16
  49. package/dist/src/terminal-acceptance-cli-adapter.js.map +1 -1
  50. package/dist/src/terminal-action-projection.d.ts +1 -1
  51. package/dist/src/terminal-action-projection.js +6 -0
  52. package/dist/src/terminal-action-projection.js.map +1 -1
  53. package/dist/src/terminal-agent-adapter.d.ts +9 -0
  54. package/dist/src/terminal-agent-adapter.js.map +1 -1
  55. package/dist/src/terminal-agent-bridge.d.ts +52 -8
  56. package/dist/src/terminal-agent-bridge.js +111 -94
  57. package/dist/src/terminal-agent-bridge.js.map +1 -1
  58. package/dist/src/terminal-authority-policy.js +3 -0
  59. package/dist/src/terminal-authority-policy.js.map +1 -1
  60. package/dist/src/terminal-binding-authority.d.ts +2 -0
  61. package/dist/src/terminal-binding-authority.js +8 -0
  62. package/dist/src/terminal-binding-authority.js.map +1 -1
  63. package/dist/src/terminal-command-cli-adapter.d.ts +17 -1
  64. package/dist/src/terminal-command-cli-adapter.js +784 -286
  65. package/dist/src/terminal-command-cli-adapter.js.map +1 -1
  66. package/dist/src/terminal-delegate-cli-adapter.js +21 -7
  67. package/dist/src/terminal-delegate-cli-adapter.js.map +1 -1
  68. package/dist/src/terminal-dispatch-application.d.ts +3 -1
  69. package/dist/src/terminal-dispatch-application.js +13 -5
  70. package/dist/src/terminal-dispatch-application.js.map +1 -1
  71. package/dist/src/terminal-dispatch-composition.d.ts +43 -0
  72. package/dist/src/terminal-dispatch-execution.d.ts +2 -2
  73. package/dist/src/terminal-dispatch-execution.js +53 -3
  74. package/dist/src/terminal-dispatch-execution.js.map +1 -1
  75. package/dist/src/terminal-dispatch-policy.d.ts +20 -0
  76. package/dist/src/terminal-dispatch-policy.js +33 -1
  77. package/dist/src/terminal-dispatch-policy.js.map +1 -1
  78. package/dist/src/terminal-dispatch-presenter.d.ts +45 -0
  79. package/dist/src/terminal-dispatch-presenter.js +220 -18
  80. package/dist/src/terminal-dispatch-presenter.js.map +1 -1
  81. package/dist/src/terminal-dispatch-receipt.d.ts +5 -1
  82. package/dist/src/terminal-dispatch-receipt.js +26 -3
  83. package/dist/src/terminal-dispatch-receipt.js.map +1 -1
  84. package/dist/src/terminal-identity-authority-cli-adapter.js +103 -4
  85. package/dist/src/terminal-identity-authority-cli-adapter.js.map +1 -1
  86. package/dist/src/terminal-interaction-authority.d.ts +48 -1
  87. package/dist/src/terminal-interaction-authority.js +30 -0
  88. package/dist/src/terminal-interaction-authority.js.map +1 -1
  89. package/dist/src/terminal-interaction-cli-adapter.js +9 -0
  90. package/dist/src/terminal-interaction-cli-adapter.js.map +1 -1
  91. package/dist/src/terminal-interaction-core.d.ts +104 -0
  92. package/dist/src/terminal-interaction-core.js +407 -0
  93. package/dist/src/terminal-interaction-core.js.map +1 -0
  94. package/dist/src/terminal-interaction-protocol.d.ts +89 -0
  95. package/dist/src/terminal-interaction-protocol.js +199 -0
  96. package/dist/src/terminal-interaction-protocol.js.map +1 -1
  97. package/dist/src/terminal-list-cli-adapter.d.ts +5 -0
  98. package/dist/src/terminal-list-cli-adapter.js +190 -40
  99. package/dist/src/terminal-list-cli-adapter.js.map +1 -1
  100. package/dist/src/terminal-list-renderer.js +60 -7
  101. package/dist/src/terminal-list-renderer.js.map +1 -1
  102. package/dist/src/terminal-maintenance-cli-adapter.js +14 -3
  103. package/dist/src/terminal-maintenance-cli-adapter.js.map +1 -1
  104. package/dist/src/terminal-monitor-application-service.d.ts +1 -0
  105. package/dist/src/terminal-monitor-application-service.js +72 -10
  106. package/dist/src/terminal-monitor-application-service.js.map +1 -1
  107. package/dist/src/terminal-monitor-cli-adapter.d.ts +3 -0
  108. package/dist/src/terminal-monitor-cli-adapter.js +24 -8
  109. package/dist/src/terminal-monitor-cli-adapter.js.map +1 -1
  110. package/dist/src/terminal-monitor-state-cli-adapter.js +15 -2
  111. package/dist/src/terminal-monitor-state-cli-adapter.js.map +1 -1
  112. package/dist/src/terminal-mutation-cli-runtime.d.ts +11 -1
  113. package/dist/src/terminal-mutation-cli-runtime.js +9 -4
  114. package/dist/src/terminal-mutation-cli-runtime.js.map +1 -1
  115. package/dist/src/terminal-status-cli-adapter.d.ts +1 -7
  116. package/dist/src/terminal-status-cli-adapter.js +29 -3
  117. package/dist/src/terminal-status-cli-adapter.js.map +1 -1
  118. package/dist/src/terminal-status-facts.d.ts +17 -1
  119. package/dist/src/terminal-status-facts.js +59 -0
  120. package/dist/src/terminal-status-facts.js.map +1 -1
  121. package/dist/src/terminal-submission-acceptance.d.ts +37 -2
  122. package/dist/src/terminal-submission-acceptance.js +633 -30
  123. package/dist/src/terminal-submission-acceptance.js.map +1 -1
  124. package/dist/src/terminal-submission-facts.d.ts +5 -0
  125. package/dist/src/terminal-submission-facts.js.map +1 -1
  126. package/dist/src/terminal-watch-callback-cli-adapter.d.ts +2 -1
  127. package/dist/src/terminal-watch-callback-cli-adapter.js +2 -1
  128. package/dist/src/terminal-watch-callback-cli-adapter.js.map +1 -1
  129. package/dist/src/terminal-watch-cli-adapter.d.ts +6 -2
  130. package/dist/src/terminal-watch-cli-adapter.js +1051 -15
  131. package/dist/src/terminal-watch-cli-adapter.js.map +1 -1
  132. package/dist/src/terminal-watch-service.d.ts +15 -1
  133. package/dist/src/terminal-watch-service.js +169 -13
  134. package/dist/src/terminal-watch-service.js.map +1 -1
  135. package/dist/src/terminal-watch-store.d.ts +72 -3
  136. package/dist/src/terminal-watch-store.js +407 -27
  137. package/dist/src/terminal-watch-store.js.map +1 -1
  138. package/docs/host-bridge-profiles.md +2 -2
  139. package/docs/quickstart-herdr.md +5 -3
  140. package/docs/quickstart-tmux.md +7 -5
  141. package/openclaw.plugin.json +8 -0
  142. package/package.json +1 -1
  143. package/templates/openclaw-skills/agent-knock-knock/SKILL.md +15 -11
@@ -0,0 +1,104 @@
1
+ import { type NativeQuestionnaireActionPlan, type NativeQuestionnaireInspection } from "./terminal-questionnaire-adapter.js";
2
+ import { type TerminalInteractionAgent, type TerminalInteractionResponseAuthority, type TerminalInteractionSubject, type TerminalInteractionSubjectProjection } from "./terminal-interaction-protocol.js";
3
+ export declare const TERMINAL_INTERACTION_AGGREGATE_SCHEMA: "agent-knock-knock/terminal-interaction-aggregate";
4
+ export declare const TERMINAL_INTERACTION_AGGREGATE_VERSION: 1;
5
+ export declare const TERMINAL_INTERACTION_AGGREGATE_STATES: readonly ["pending", "reserved", "consumed", "response_uncertain", "superseded"];
6
+ export type TerminalInteractionAggregateState = typeof TERMINAL_INTERACTION_AGGREGATE_STATES[number];
7
+ export interface TerminalInteractionReservation {
8
+ readonly attempt_id: string;
9
+ readonly response_hash: string;
10
+ readonly reserved_at: string;
11
+ }
12
+ export interface TerminalInteractionResolution {
13
+ readonly resolved_at: string;
14
+ /** Bounded machine code only; never persist raw screen/error/answer text. */
15
+ readonly reason_code: string;
16
+ }
17
+ export interface TerminalInteractionAggregate {
18
+ readonly schema: typeof TERMINAL_INTERACTION_AGGREGATE_SCHEMA;
19
+ readonly version: typeof TERMINAL_INTERACTION_AGGREGATE_VERSION;
20
+ readonly subject: TerminalInteractionSubject;
21
+ readonly interaction_id: string;
22
+ readonly surface_id: string;
23
+ readonly prompt_fingerprint: string;
24
+ readonly response_authority: TerminalInteractionResponseAuthority;
25
+ readonly current_step: number;
26
+ readonly state: TerminalInteractionAggregateState;
27
+ readonly created_at: string;
28
+ readonly expires_at: string;
29
+ readonly reservation?: TerminalInteractionReservation;
30
+ readonly resolution?: TerminalInteractionResolution;
31
+ }
32
+ export type TerminalInteractionAggregateEvent = {
33
+ /** Exact live recapture proved the same pending native surface. */
34
+ readonly type: "refresh";
35
+ readonly expires_at: string;
36
+ readonly response_authority: TerminalInteractionResponseAuthority;
37
+ } | {
38
+ readonly type: "reserve";
39
+ readonly attempt_id: string;
40
+ readonly response_hash: string;
41
+ readonly at: string;
42
+ } | {
43
+ /** Exact proof that reservation completed but no terminal input began. */
44
+ readonly type: "release";
45
+ } | {
46
+ readonly type: "consume";
47
+ readonly at: string;
48
+ readonly reason_code: string;
49
+ } | {
50
+ readonly type: "response_uncertain";
51
+ readonly at: string;
52
+ readonly reason_code: string;
53
+ } | {
54
+ readonly type: "supersede";
55
+ readonly at: string;
56
+ readonly reason_code: string;
57
+ };
58
+ export declare class TerminalInteractionTransitionError extends Error {
59
+ constructor(message: string);
60
+ }
61
+ export interface BuildTerminalInteractionOfferInput {
62
+ readonly subject: TerminalInteractionSubject;
63
+ readonly agent: TerminalInteractionAgent;
64
+ readonly agentVersion: string;
65
+ /** Canonical endpoint/process incarnation data. It is hashed, never emitted. */
66
+ readonly canonicalTerminalIdentity: unknown;
67
+ /** Exact accepted native task/thread/rollout identity. It is hashed, never emitted. */
68
+ readonly nativeTaskIdentity: unknown;
69
+ readonly inspection: NativeQuestionnaireInspection;
70
+ readonly now: Date;
71
+ readonly expiresAt?: string;
72
+ readonly ttlMs?: number;
73
+ readonly responseUncertain?: boolean;
74
+ readonly responseAuthority: TerminalInteractionResponseAuthority;
75
+ /** Managed v1 clients may temporarily require the legacy top-level alias. */
76
+ readonly includeLegacyTurnId?: boolean;
77
+ }
78
+ export interface TerminalInteractionCoreOffer {
79
+ readonly projection: TerminalInteractionSubjectProjection;
80
+ readonly promptFingerprint: string;
81
+ readonly surfaceId: string;
82
+ /** Owner-private: never copy this field into callbacks or public Status. */
83
+ readonly actionPlan: NativeQuestionnaireActionPlan;
84
+ readonly nativeInspection: Exclude<NativeQuestionnaireInspection, {
85
+ readonly status: "none";
86
+ }>;
87
+ }
88
+ export interface CaptureTerminalInteractionInput extends Omit<BuildTerminalInteractionOfferInput, "inspection"> {
89
+ readonly screen: string;
90
+ readonly secret?: boolean;
91
+ }
92
+ /**
93
+ * Pure, subject-neutral offer builder. Monitor and Watch pass the same native
94
+ * inspection through this function and therefore share semantic ids,
95
+ * cross-source `surface_id`, public redaction, and executable/manual policy.
96
+ */
97
+ export declare function buildTerminalInteractionOffer(input: BuildTerminalInteractionOfferInput): TerminalInteractionCoreOffer | undefined;
98
+ /** Convenience capture entry point; the parser remains single-source. */
99
+ export declare function captureTerminalInteraction(input: CaptureTerminalInteractionInput): TerminalInteractionCoreOffer | undefined;
100
+ export declare function createTerminalInteractionAggregate(projectionValue: unknown, createdAt: string): TerminalInteractionAggregate;
101
+ export declare function hashTerminalInteractionResponse(value: unknown): string;
102
+ export declare function reduceTerminalInteractionAggregate(currentValue: unknown, event: TerminalInteractionAggregateEvent): TerminalInteractionAggregate;
103
+ export declare function validateTerminalInteractionAggregate(value: unknown): TerminalInteractionAggregate;
104
+ export declare function aggregateMatchesProjection(aggregateValue: unknown, projectionValue: unknown): boolean;
@@ -0,0 +1,407 @@
1
+ import { createHash } from "node:crypto";
2
+ import { inspectNativeQuestionnaire } from "./terminal-questionnaire-adapter.js";
3
+ import { TERMINAL_INTERACTION_SCHEMA, TERMINAL_INTERACTION_SUBJECT_VERSION, sameTerminalInteractionSubject, terminalInteractionSubjectKey, validateTerminalInteractionSubject, validateTerminalInteractionSubjectProjection } from "./terminal-interaction-protocol.js";
4
+ import { isRecord } from "./value-guards.js";
5
+ export const TERMINAL_INTERACTION_AGGREGATE_SCHEMA = "agent-knock-knock/terminal-interaction-aggregate";
6
+ export const TERMINAL_INTERACTION_AGGREGATE_VERSION = 1;
7
+ export const TERMINAL_INTERACTION_AGGREGATE_STATES = [
8
+ "pending",
9
+ "reserved",
10
+ "consumed",
11
+ "response_uncertain",
12
+ "superseded"
13
+ ];
14
+ export class TerminalInteractionTransitionError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "TerminalInteractionTransitionError";
18
+ }
19
+ }
20
+ function canonicalJson(value) {
21
+ if (value === null || typeof value !== "object") {
22
+ const serialized = JSON.stringify(value);
23
+ return serialized === undefined ? "null" : serialized;
24
+ }
25
+ if (Array.isArray(value)) {
26
+ return `[${value.map(canonicalJson).join(",")}]`;
27
+ }
28
+ return `{${Object.entries(value)
29
+ .filter(([, item]) => item !== undefined)
30
+ .sort(([left], [right]) => left.localeCompare(right))
31
+ .map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`)
32
+ .join(",")}}`;
33
+ }
34
+ function sha256(namespace, value) {
35
+ return createHash("sha256")
36
+ .update(`${namespace}\0${canonicalJson(value)}`, "utf8")
37
+ .digest("hex");
38
+ }
39
+ function terminalInteractionQuestion(question) {
40
+ const common = {
41
+ question_id: question.question_id,
42
+ prompt: question.prompt,
43
+ required: question.required
44
+ };
45
+ if (question.response_kind === "single_select" ||
46
+ question.response_kind === "multi_select") {
47
+ return {
48
+ ...common,
49
+ response_kind: question.response_kind,
50
+ options: question.options ?? []
51
+ };
52
+ }
53
+ return { ...common, response_kind: question.response_kind };
54
+ }
55
+ function offerExpiry(input) {
56
+ if (input.expiresAt !== undefined) {
57
+ return input.expiresAt;
58
+ }
59
+ const ttlMs = input.ttlMs ?? 60_000;
60
+ if (!Number.isSafeInteger(ttlMs) || ttlMs < 1) {
61
+ throw new TypeError("terminal interaction ttlMs must be a positive integer");
62
+ }
63
+ return new Date(input.now.getTime() + ttlMs).toISOString();
64
+ }
65
+ /**
66
+ * Pure, subject-neutral offer builder. Monitor and Watch pass the same native
67
+ * inspection through this function and therefore share semantic ids,
68
+ * cross-source `surface_id`, public redaction, and executable/manual policy.
69
+ */
70
+ export function buildTerminalInteractionOffer(input) {
71
+ if (input.inspection.status === "none") {
72
+ return undefined;
73
+ }
74
+ if (input.inspection.agent !== input.agent) {
75
+ throw new TypeError("native questionnaire agent does not match offer agent");
76
+ }
77
+ const subject = validateTerminalInteractionSubject(input.subject);
78
+ // Native exact regions include cursor/highlight state. Public identity must
79
+ // stay stable when the user or TUI merely moves the selection within the
80
+ // same semantic question; exact action plans are still recaptured three
81
+ // times immediately around dispatch.
82
+ const promptFingerprint = sha256("terminal-interaction-prompt", {
83
+ profile: input.inspection.profile,
84
+ current_step: input.inspection.current_step,
85
+ total_steps: input.inspection.total_steps,
86
+ question: input.inspection.question
87
+ });
88
+ const surfaceMaterial = {
89
+ version: 1,
90
+ agent: input.agent,
91
+ agent_version: input.agentVersion,
92
+ terminal: input.canonicalTerminalIdentity,
93
+ native_task: input.nativeTaskIdentity,
94
+ profile: input.inspection.profile,
95
+ prompt_sha256: promptFingerprint
96
+ };
97
+ const surfaceId = `tis_${sha256("terminal-interaction-surface", surfaceMaterial).slice(0, 40)}`;
98
+ const interactionId = `ti_${sha256("terminal-interaction-subject", {
99
+ subject: terminalInteractionSubjectKey(subject),
100
+ subject_evidence: subject,
101
+ surface_id: surfaceId
102
+ }).slice(0, 40)}`;
103
+ const actionPlan = input.inspection.action_plan;
104
+ const nativeExecutable = input.inspection.status === "actionable" &&
105
+ actionPlan.kind !== "manual_only";
106
+ const responseAuthority = nativeExecutable
107
+ ? input.responseAuthority
108
+ : "notify_only";
109
+ const responseUncertain = input.responseUncertain === true;
110
+ const state = responseUncertain
111
+ ? "response_uncertain"
112
+ : nativeExecutable
113
+ ? "pending"
114
+ : "manual_required";
115
+ const question = terminalInteractionQuestion(input.inspection.question);
116
+ const common = {
117
+ schema: TERMINAL_INTERACTION_SCHEMA,
118
+ version: TERMINAL_INTERACTION_SUBJECT_VERSION,
119
+ interaction_id: interactionId,
120
+ subject,
121
+ agent: input.agent,
122
+ kind: "questionnaire",
123
+ state,
124
+ step: {
125
+ index: input.inspection.current_step,
126
+ total: input.inspection.total_steps
127
+ },
128
+ questions: [question],
129
+ expires_at: offerExpiry(input),
130
+ surface_id: surfaceId,
131
+ prompt_fingerprint: promptFingerprint,
132
+ response_authority: responseAuthority,
133
+ capabilities: {
134
+ respond: nativeExecutable &&
135
+ responseAuthority === "executable" &&
136
+ !responseUncertain,
137
+ batch_response: false,
138
+ free_text: question.response_kind === "free_text",
139
+ multi_select: question.response_kind === "multi_select"
140
+ }
141
+ };
142
+ const projection = validateTerminalInteractionSubjectProjection(subject.kind === "managed_turn" && input.includeLegacyTurnId !== false
143
+ ? { ...common, subject, turn_id: subject.turn_id }
144
+ : { ...common, subject });
145
+ return {
146
+ projection,
147
+ promptFingerprint,
148
+ surfaceId,
149
+ actionPlan,
150
+ nativeInspection: input.inspection
151
+ };
152
+ }
153
+ /** Convenience capture entry point; the parser remains single-source. */
154
+ export function captureTerminalInteraction(input) {
155
+ return buildTerminalInteractionOffer({
156
+ ...input,
157
+ inspection: inspectNativeQuestionnaire({
158
+ agent: input.agent,
159
+ version: input.agentVersion,
160
+ screen: input.screen,
161
+ secret: input.secret
162
+ })
163
+ });
164
+ }
165
+ export function createTerminalInteractionAggregate(projectionValue, createdAt) {
166
+ const projection = validateTerminalInteractionSubjectProjection(projectionValue);
167
+ if (projection.state === "response_uncertain") {
168
+ throw new TerminalInteractionTransitionError("response-uncertain projection requires its existing durable reservation");
169
+ }
170
+ return validateTerminalInteractionAggregate({
171
+ schema: TERMINAL_INTERACTION_AGGREGATE_SCHEMA,
172
+ version: TERMINAL_INTERACTION_AGGREGATE_VERSION,
173
+ subject: projection.subject,
174
+ interaction_id: projection.interaction_id,
175
+ surface_id: projection.surface_id,
176
+ prompt_fingerprint: projection.prompt_fingerprint,
177
+ response_authority: projection.response_authority,
178
+ current_step: projection.step.index,
179
+ state: "pending",
180
+ created_at: createdAt,
181
+ expires_at: projection.expires_at
182
+ });
183
+ }
184
+ export function hashTerminalInteractionResponse(value) {
185
+ return sha256("terminal-interaction-response", value);
186
+ }
187
+ export function reduceTerminalInteractionAggregate(currentValue, event) {
188
+ const current = validateTerminalInteractionAggregate(currentValue);
189
+ let next;
190
+ switch (event.type) {
191
+ case "refresh":
192
+ if (current.state !== "pending") {
193
+ throw transitionError(current.state, event.type);
194
+ }
195
+ if (!Number.isFinite(Date.parse(event.expires_at)) ||
196
+ Date.parse(event.expires_at) < Date.parse(current.expires_at)) {
197
+ throw new TerminalInteractionTransitionError("terminal interaction refresh cannot shorten expires_at");
198
+ }
199
+ next = {
200
+ ...current,
201
+ expires_at: event.expires_at,
202
+ response_authority: event.response_authority
203
+ };
204
+ break;
205
+ case "reserve":
206
+ if (current.state !== "pending") {
207
+ throw transitionError(current.state, event.type);
208
+ }
209
+ if (current.response_authority !== "executable") {
210
+ throw new TerminalInteractionTransitionError("notify-only interaction cannot reserve terminal response authority");
211
+ }
212
+ next = {
213
+ ...current,
214
+ state: "reserved",
215
+ reservation: {
216
+ attempt_id: event.attempt_id,
217
+ response_hash: event.response_hash,
218
+ reserved_at: event.at
219
+ }
220
+ };
221
+ break;
222
+ case "release":
223
+ if (current.state !== "reserved") {
224
+ throw transitionError(current.state, event.type);
225
+ }
226
+ next = {
227
+ ...current,
228
+ state: "pending",
229
+ reservation: undefined
230
+ };
231
+ break;
232
+ case "consume":
233
+ if (current.state !== "reserved") {
234
+ throw transitionError(current.state, event.type);
235
+ }
236
+ next = {
237
+ ...current,
238
+ state: "consumed",
239
+ resolution: {
240
+ resolved_at: event.at,
241
+ reason_code: event.reason_code
242
+ }
243
+ };
244
+ break;
245
+ case "response_uncertain":
246
+ if (current.state !== "reserved") {
247
+ throw transitionError(current.state, event.type);
248
+ }
249
+ next = {
250
+ ...current,
251
+ state: "response_uncertain",
252
+ resolution: {
253
+ resolved_at: event.at,
254
+ reason_code: event.reason_code
255
+ }
256
+ };
257
+ break;
258
+ case "supersede":
259
+ if (current.state !== "pending") {
260
+ throw transitionError(current.state, event.type);
261
+ }
262
+ next = {
263
+ ...current,
264
+ state: "superseded",
265
+ resolution: {
266
+ resolved_at: event.at,
267
+ reason_code: event.reason_code
268
+ }
269
+ };
270
+ break;
271
+ }
272
+ return validateTerminalInteractionAggregate(next);
273
+ }
274
+ function transitionError(state, event) {
275
+ return new TerminalInteractionTransitionError(`terminal interaction cannot transition from ${state} via ${event}`);
276
+ }
277
+ function aggregateString(value, field, pattern) {
278
+ if (typeof value !== "string" || value.length < 1 || value.length > 4_096) {
279
+ throw new TypeError(`${field} must be a bounded non-empty string`);
280
+ }
281
+ if (pattern && !pattern.test(value)) {
282
+ throw new TypeError(`${field} has an invalid format`);
283
+ }
284
+ return value;
285
+ }
286
+ function aggregateTimestamp(value, field) {
287
+ const timestamp = aggregateString(value, field);
288
+ if (!Number.isFinite(Date.parse(timestamp))) {
289
+ throw new TypeError(`${field} must be an ISO-compatible timestamp`);
290
+ }
291
+ return timestamp;
292
+ }
293
+ function aggregateRecord(value, field, keys) {
294
+ if (!isRecord(value)) {
295
+ throw new TypeError(`${field} must be an object`);
296
+ }
297
+ for (const key of Object.keys(value)) {
298
+ if (!keys.includes(key)) {
299
+ throw new TypeError(`${field}.${key} is not allowed`);
300
+ }
301
+ }
302
+ return value;
303
+ }
304
+ export function validateTerminalInteractionAggregate(value) {
305
+ const record = aggregateRecord(value, "$aggregate", [
306
+ "schema",
307
+ "version",
308
+ "subject",
309
+ "interaction_id",
310
+ "surface_id",
311
+ "prompt_fingerprint",
312
+ "response_authority",
313
+ "current_step",
314
+ "state",
315
+ "created_at",
316
+ "expires_at",
317
+ "reservation",
318
+ "resolution"
319
+ ]);
320
+ if (record.schema !== TERMINAL_INTERACTION_AGGREGATE_SCHEMA) {
321
+ throw new TypeError("$aggregate.schema is invalid");
322
+ }
323
+ if (record.version !== TERMINAL_INTERACTION_AGGREGATE_VERSION) {
324
+ throw new TypeError("$aggregate.version is invalid");
325
+ }
326
+ const subject = validateTerminalInteractionSubject(record.subject, "$aggregate.subject");
327
+ const state = aggregateString(record.state, "$aggregate.state");
328
+ if (!TERMINAL_INTERACTION_AGGREGATE_STATES.includes(state)) {
329
+ throw new TypeError("$aggregate.state is invalid");
330
+ }
331
+ const responseAuthority = aggregateString(record.response_authority, "$aggregate.response_authority");
332
+ if (responseAuthority !== "executable" && responseAuthority !== "notify_only") {
333
+ throw new TypeError("$aggregate.response_authority is invalid");
334
+ }
335
+ if (!Number.isSafeInteger(record.current_step) || Number(record.current_step) < 1) {
336
+ throw new TypeError("$aggregate.current_step must be a positive integer");
337
+ }
338
+ let reservation;
339
+ if (record.reservation !== undefined) {
340
+ const item = aggregateRecord(record.reservation, "$aggregate.reservation", [
341
+ "attempt_id",
342
+ "response_hash",
343
+ "reserved_at"
344
+ ]);
345
+ reservation = {
346
+ attempt_id: aggregateString(item.attempt_id, "$aggregate.reservation.attempt_id"),
347
+ response_hash: aggregateString(item.response_hash, "$aggregate.reservation.response_hash", /^[0-9a-f]{64}$/u),
348
+ reserved_at: aggregateTimestamp(item.reserved_at, "$aggregate.reservation.reserved_at")
349
+ };
350
+ }
351
+ let resolution;
352
+ if (record.resolution !== undefined) {
353
+ const item = aggregateRecord(record.resolution, "$aggregate.resolution", [
354
+ "resolved_at",
355
+ "reason_code"
356
+ ]);
357
+ resolution = {
358
+ resolved_at: aggregateTimestamp(item.resolved_at, "$aggregate.resolution.resolved_at"),
359
+ reason_code: aggregateString(item.reason_code, "$aggregate.resolution.reason_code", /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u)
360
+ };
361
+ }
362
+ if ((state === "reserved" || state === "consumed" ||
363
+ state === "response_uncertain") &&
364
+ !reservation) {
365
+ throw new TypeError(`$aggregate.reservation is required for ${state}`);
366
+ }
367
+ if ((state === "consumed" || state === "response_uncertain" ||
368
+ state === "superseded") && !resolution) {
369
+ throw new TypeError(`$aggregate.resolution is required for ${state}`);
370
+ }
371
+ if (state === "pending" && (reservation || resolution)) {
372
+ throw new TypeError("pending aggregate cannot have reservation or resolution");
373
+ }
374
+ if (state === "reserved" && resolution) {
375
+ throw new TypeError("reserved aggregate cannot have a resolution");
376
+ }
377
+ if (state === "superseded" && reservation) {
378
+ throw new TypeError("superseded aggregate cannot have a reservation");
379
+ }
380
+ return {
381
+ schema: TERMINAL_INTERACTION_AGGREGATE_SCHEMA,
382
+ version: TERMINAL_INTERACTION_AGGREGATE_VERSION,
383
+ subject,
384
+ interaction_id: aggregateString(record.interaction_id, "$aggregate.interaction_id"),
385
+ surface_id: aggregateString(record.surface_id, "$aggregate.surface_id"),
386
+ prompt_fingerprint: aggregateString(record.prompt_fingerprint, "$aggregate.prompt_fingerprint", /^[0-9a-f]{64}$/u),
387
+ response_authority: responseAuthority,
388
+ current_step: Number(record.current_step),
389
+ state,
390
+ created_at: aggregateTimestamp(record.created_at, "$aggregate.created_at"),
391
+ expires_at: aggregateTimestamp(record.expires_at, "$aggregate.expires_at"),
392
+ ...(reservation ? { reservation } : {}),
393
+ ...(resolution ? { resolution } : {})
394
+ };
395
+ }
396
+ export function aggregateMatchesProjection(aggregateValue, projectionValue) {
397
+ const aggregate = validateTerminalInteractionAggregate(aggregateValue);
398
+ const projection = validateTerminalInteractionSubjectProjection(projectionValue);
399
+ return sameTerminalInteractionSubject(aggregate.subject, projection.subject) &&
400
+ aggregate.interaction_id === projection.interaction_id &&
401
+ aggregate.surface_id === projection.surface_id &&
402
+ aggregate.prompt_fingerprint === projection.prompt_fingerprint &&
403
+ aggregate.response_authority === projection.response_authority &&
404
+ aggregate.current_step === projection.step.index &&
405
+ aggregate.expires_at === projection.expires_at;
406
+ }
407
+ //# sourceMappingURL=terminal-interaction-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-interaction-core.js","sourceRoot":"","sources":["../../src/terminal-interaction-core.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,17 @@
1
1
  export declare const TERMINAL_INTERACTION_SCHEMA: "agent-knock-knock/terminal-interaction";
2
2
  export declare const TERMINAL_INTERACTION_VERSION: 1;
3
+ /**
4
+ * Version 2 makes the interaction owner explicit. Version 1 remains readable
5
+ * for durable managed-Turn records written by releases before Watch response
6
+ * authority existed.
7
+ */
8
+ export declare const TERMINAL_INTERACTION_SUBJECT_VERSION: 2;
3
9
  export declare const TERMINAL_INTERACTION_KINDS: readonly ["questionnaire"];
4
10
  export declare const TERMINAL_INTERACTION_STATES: readonly ["pending", "manual_required", "response_uncertain"];
5
11
  export declare const TERMINAL_INTERACTION_RESPONSE_KINDS: readonly ["single_select", "multi_select", "free_text", "confirm"];
6
12
  export declare const TERMINAL_INTERACTION_AGENTS: readonly ["codex", "claude"];
13
+ export declare const TERMINAL_INTERACTION_SUBJECT_KINDS: readonly ["managed_turn", "terminal_watch"];
14
+ export declare const TERMINAL_INTERACTION_RESPONSE_AUTHORITIES: readonly ["executable", "notify_only"];
7
15
  export declare const TERMINAL_INTERACTION_LIMITS: Readonly<{
8
16
  maxProjectionBytes: number;
9
17
  /** A projection is deliberately one native step, never a batch of keys. */
@@ -24,6 +32,21 @@ export type TerminalInteractionKind = typeof TERMINAL_INTERACTION_KINDS[number];
24
32
  export type TerminalInteractionState = typeof TERMINAL_INTERACTION_STATES[number];
25
33
  export type TerminalInteractionResponseKind = typeof TERMINAL_INTERACTION_RESPONSE_KINDS[number];
26
34
  export type TerminalInteractionAgent = typeof TERMINAL_INTERACTION_AGENTS[number];
35
+ export type TerminalInteractionSubjectKind = typeof TERMINAL_INTERACTION_SUBJECT_KINDS[number];
36
+ export type TerminalInteractionResponseAuthority = typeof TERMINAL_INTERACTION_RESPONSE_AUTHORITIES[number];
37
+ export interface TerminalInteractionManagedTurnSubject {
38
+ readonly kind: "managed_turn";
39
+ readonly turn_id: string;
40
+ /** The exact controller message that established managed ownership. */
41
+ readonly message_id: string;
42
+ }
43
+ export interface TerminalInteractionTerminalWatchSubject {
44
+ readonly kind: "terminal_watch";
45
+ readonly watch_id: string;
46
+ /** Hash of the exact task/acceptance anchor; never raw terminal content. */
47
+ readonly anchor_fingerprint: string;
48
+ }
49
+ export type TerminalInteractionSubject = TerminalInteractionManagedTurnSubject | TerminalInteractionTerminalWatchSubject;
27
50
  export interface TerminalInteractionOption {
28
51
  readonly option_id: string;
29
52
  readonly label: string;
@@ -73,6 +96,45 @@ export interface TerminalInteractionProjection {
73
96
  readonly multi_select: boolean;
74
97
  };
75
98
  }
99
+ /**
100
+ * Subject-aware public projection. `subject` is authoritative. `turn_id` is a
101
+ * deprecated managed-Turn compatibility alias and is forbidden for Watch
102
+ * subjects, so Watch integrations never invent a fake Turn.
103
+ */
104
+ export type TerminalInteractionSubjectProjection = {
105
+ readonly schema: typeof TERMINAL_INTERACTION_SCHEMA;
106
+ readonly version: typeof TERMINAL_INTERACTION_SUBJECT_VERSION;
107
+ readonly interaction_id: string;
108
+ readonly subject: TerminalInteractionSubject;
109
+ readonly agent: TerminalInteractionAgent;
110
+ readonly kind: TerminalInteractionKind;
111
+ readonly state: TerminalInteractionState;
112
+ readonly step: {
113
+ readonly index: number;
114
+ readonly total: number;
115
+ };
116
+ readonly questions: readonly TerminalInteractionQuestion[];
117
+ readonly expires_at: string;
118
+ /** Stable across monitor/Watch observation of the same native surface. */
119
+ readonly surface_id: string;
120
+ /** SHA-256 of the normalized native prompt, never raw terminal content. */
121
+ readonly prompt_fingerprint: string;
122
+ readonly response_authority: TerminalInteractionResponseAuthority;
123
+ readonly capabilities: {
124
+ readonly respond: boolean;
125
+ readonly batch_response: boolean;
126
+ readonly free_text: boolean;
127
+ readonly multi_select: boolean;
128
+ };
129
+ } & ({
130
+ readonly subject: TerminalInteractionManagedTurnSubject;
131
+ /** @deprecated Read `subject.turn_id`; retained for managed v1 clients. */
132
+ readonly turn_id?: string;
133
+ } | {
134
+ readonly subject: TerminalInteractionTerminalWatchSubject;
135
+ readonly turn_id?: never;
136
+ });
137
+ export type TerminalInteractionAnyProjection = TerminalInteractionProjection | TerminalInteractionSubjectProjection;
76
138
  interface TerminalInteractionAnswerBase {
77
139
  readonly question_id: string;
78
140
  }
@@ -98,13 +160,32 @@ export interface TerminalInteractionResponse {
98
160
  readonly turn_id: string;
99
161
  readonly answers: readonly TerminalInteractionAnswer[];
100
162
  }
163
+ export type TerminalInteractionSubjectResponse = {
164
+ readonly interaction_id: string;
165
+ readonly subject: TerminalInteractionSubject;
166
+ readonly answers: readonly TerminalInteractionAnswer[];
167
+ } & ({
168
+ readonly subject: TerminalInteractionManagedTurnSubject;
169
+ /** @deprecated Optional compatibility assertion for managed clients. */
170
+ readonly turn_id?: string;
171
+ } | {
172
+ readonly subject: TerminalInteractionTerminalWatchSubject;
173
+ readonly turn_id?: never;
174
+ });
175
+ export type TerminalInteractionAnyResponse = TerminalInteractionResponse | TerminalInteractionSubjectResponse;
101
176
  export type TerminalInteractionValidationCode = "invalid_type" | "invalid_value" | "unknown_field" | "limit_exceeded" | "duplicate_id" | "secret_not_allowed" | "control_character" | "interaction_mismatch" | "response_not_allowed" | "answer_kind_mismatch" | "unknown_question" | "unknown_option" | "missing_answer" | "expired";
102
177
  export declare class TerminalInteractionValidationError extends Error {
103
178
  readonly code: TerminalInteractionValidationCode;
104
179
  readonly path: string;
105
180
  constructor(code: TerminalInteractionValidationCode, path: string, message: string);
106
181
  }
182
+ export declare function validateTerminalInteractionSubject(value: unknown, path?: string): TerminalInteractionSubject;
183
+ export declare function terminalInteractionSubjectId(subject: TerminalInteractionSubject): string;
184
+ export declare function terminalInteractionSubjectKey(subject: TerminalInteractionSubject): string;
185
+ export declare function sameTerminalInteractionSubject(left: TerminalInteractionSubject, right: TerminalInteractionSubject): boolean;
107
186
  export declare function validateTerminalInteractionProjection(value: unknown): TerminalInteractionProjection;
187
+ export declare function validateTerminalInteractionSubjectProjection(value: unknown): TerminalInteractionSubjectProjection;
188
+ export declare function validateAnyTerminalInteractionProjection(value: unknown): TerminalInteractionAnyProjection;
108
189
  export declare function validateTerminalInteractionResponse(value: unknown, authoritativeStoredProjection: unknown, options?: {
109
190
  now?: Date;
110
191
  /**
@@ -114,4 +195,12 @@ export declare function validateTerminalInteractionResponse(value: unknown, auth
114
195
  */
115
196
  allowExpiredForLiveRecapture?: boolean;
116
197
  }): TerminalInteractionResponse;
198
+ export declare function validateTerminalInteractionSubjectResponse(value: unknown, authoritativeStoredProjection: unknown, options?: {
199
+ now?: Date;
200
+ allowExpiredForLiveRecapture?: boolean;
201
+ }): TerminalInteractionSubjectResponse;
202
+ export declare function validateAnyTerminalInteractionResponse(value: unknown, authoritativeStoredProjection: unknown, options?: {
203
+ now?: Date;
204
+ allowExpiredForLiveRecapture?: boolean;
205
+ }): TerminalInteractionAnyResponse;
117
206
  export {};