@agenticros/core 0.5.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 (151) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +88 -0
  3. package/dist/banner.d.ts +7 -0
  4. package/dist/banner.d.ts.map +1 -0
  5. package/dist/banner.js +25 -0
  6. package/dist/banner.js.map +1 -0
  7. package/dist/capabilities.d.ts +101 -0
  8. package/dist/capabilities.d.ts.map +1 -0
  9. package/dist/capabilities.js +240 -0
  10. package/dist/capabilities.js.map +1 -0
  11. package/dist/cmd-vel-twist.d.ts +9 -0
  12. package/dist/cmd-vel-twist.d.ts.map +1 -0
  13. package/dist/cmd-vel-twist.js +32 -0
  14. package/dist/cmd-vel-twist.js.map +1 -0
  15. package/dist/config.d.ts +1195 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +427 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/discovery.d.ts +113 -0
  20. package/dist/discovery.d.ts.map +1 -0
  21. package/dist/discovery.js +141 -0
  22. package/dist/discovery.js.map +1 -0
  23. package/dist/find-robots-for.d.ts +85 -0
  24. package/dist/find-robots-for.d.ts.map +1 -0
  25. package/dist/find-robots-for.js +120 -0
  26. package/dist/find-robots-for.js.map +1 -0
  27. package/dist/index.d.ts +32 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +20 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/memory/factory.d.ts +18 -0
  32. package/dist/memory/factory.d.ts.map +1 -0
  33. package/dist/memory/factory.js +51 -0
  34. package/dist/memory/factory.js.map +1 -0
  35. package/dist/memory/index.d.ts +3 -0
  36. package/dist/memory/index.d.ts.map +1 -0
  37. package/dist/memory/index.js +2 -0
  38. package/dist/memory/index.js.map +1 -0
  39. package/dist/memory/local/provider.d.ts +29 -0
  40. package/dist/memory/local/provider.d.ts.map +1 -0
  41. package/dist/memory/local/provider.js +202 -0
  42. package/dist/memory/local/provider.js.map +1 -0
  43. package/dist/memory/mem0/provider.d.ts +66 -0
  44. package/dist/memory/mem0/provider.d.ts.map +1 -0
  45. package/dist/memory/mem0/provider.js +310 -0
  46. package/dist/memory/mem0/provider.js.map +1 -0
  47. package/dist/memory/types.d.ts +91 -0
  48. package/dist/memory/types.d.ts.map +1 -0
  49. package/dist/memory/types.js +10 -0
  50. package/dist/memory/types.js.map +1 -0
  51. package/dist/mission-registry.d.ts +94 -0
  52. package/dist/mission-registry.d.ts.map +1 -0
  53. package/dist/mission-registry.js +123 -0
  54. package/dist/mission-registry.js.map +1 -0
  55. package/dist/mission-transcript-sink.d.ts +33 -0
  56. package/dist/mission-transcript-sink.d.ts.map +1 -0
  57. package/dist/mission-transcript-sink.js +76 -0
  58. package/dist/mission-transcript-sink.js.map +1 -0
  59. package/dist/mission.d.ts +281 -0
  60. package/dist/mission.d.ts.map +1 -0
  61. package/dist/mission.js +331 -0
  62. package/dist/mission.js.map +1 -0
  63. package/dist/planner/index.d.ts +84 -0
  64. package/dist/planner/index.d.ts.map +1 -0
  65. package/dist/planner/index.js +486 -0
  66. package/dist/planner/index.js.map +1 -0
  67. package/dist/robots.d.ts +133 -0
  68. package/dist/robots.d.ts.map +1 -0
  69. package/dist/robots.js +220 -0
  70. package/dist/robots.js.map +1 -0
  71. package/dist/topic-utils.d.ts +47 -0
  72. package/dist/topic-utils.d.ts.map +1 -0
  73. package/dist/topic-utils.js +136 -0
  74. package/dist/topic-utils.js.map +1 -0
  75. package/dist/transport/factory.d.ts +10 -0
  76. package/dist/transport/factory.d.ts.map +1 -0
  77. package/dist/transport/factory.js +40 -0
  78. package/dist/transport/factory.js.map +1 -0
  79. package/dist/transport/local/conversion.d.ts +30 -0
  80. package/dist/transport/local/conversion.d.ts.map +1 -0
  81. package/dist/transport/local/conversion.js +340 -0
  82. package/dist/transport/local/conversion.js.map +1 -0
  83. package/dist/transport/local/entities.d.ts +34 -0
  84. package/dist/transport/local/entities.d.ts.map +1 -0
  85. package/dist/transport/local/entities.js +108 -0
  86. package/dist/transport/local/entities.js.map +1 -0
  87. package/dist/transport/local/transport.d.ts +53 -0
  88. package/dist/transport/local/transport.d.ts.map +1 -0
  89. package/dist/transport/local/transport.js +344 -0
  90. package/dist/transport/local/transport.js.map +1 -0
  91. package/dist/transport/rosbridge/actions.d.ts +30 -0
  92. package/dist/transport/rosbridge/actions.d.ts.map +1 -0
  93. package/dist/transport/rosbridge/actions.js +61 -0
  94. package/dist/transport/rosbridge/actions.js.map +1 -0
  95. package/dist/transport/rosbridge/adapter.d.ts +29 -0
  96. package/dist/transport/rosbridge/adapter.d.ts.map +1 -0
  97. package/dist/transport/rosbridge/adapter.js +108 -0
  98. package/dist/transport/rosbridge/adapter.js.map +1 -0
  99. package/dist/transport/rosbridge/client.d.ts +55 -0
  100. package/dist/transport/rosbridge/client.d.ts.map +1 -0
  101. package/dist/transport/rosbridge/client.js +375 -0
  102. package/dist/transport/rosbridge/client.js.map +1 -0
  103. package/dist/transport/rosbridge/services.d.ts +14 -0
  104. package/dist/transport/rosbridge/services.d.ts.map +1 -0
  105. package/dist/transport/rosbridge/services.js +25 -0
  106. package/dist/transport/rosbridge/services.js.map +1 -0
  107. package/dist/transport/rosbridge/topics.d.ts +28 -0
  108. package/dist/transport/rosbridge/topics.d.ts.map +1 -0
  109. package/dist/transport/rosbridge/topics.js +59 -0
  110. package/dist/transport/rosbridge/topics.js.map +1 -0
  111. package/dist/transport/rosbridge/types.d.ts +87 -0
  112. package/dist/transport/rosbridge/types.d.ts.map +1 -0
  113. package/dist/transport/rosbridge/types.js +6 -0
  114. package/dist/transport/rosbridge/types.js.map +1 -0
  115. package/dist/transport/transport.d.ts +39 -0
  116. package/dist/transport/transport.d.ts.map +1 -0
  117. package/dist/transport/transport.js +2 -0
  118. package/dist/transport/transport.js.map +1 -0
  119. package/dist/transport/types.d.ts +100 -0
  120. package/dist/transport/types.d.ts.map +1 -0
  121. package/dist/transport/types.js +5 -0
  122. package/dist/transport/types.js.map +1 -0
  123. package/dist/transport/webrtc/signaling-client.d.ts +38 -0
  124. package/dist/transport/webrtc/signaling-client.d.ts.map +1 -0
  125. package/dist/transport/webrtc/signaling-client.js +161 -0
  126. package/dist/transport/webrtc/signaling-client.js.map +1 -0
  127. package/dist/transport/webrtc/signaling-types.d.ts +112 -0
  128. package/dist/transport/webrtc/signaling-types.d.ts.map +1 -0
  129. package/dist/transport/webrtc/signaling-types.js +8 -0
  130. package/dist/transport/webrtc/signaling-types.js.map +1 -0
  131. package/dist/transport/webrtc/transport.d.ts +67 -0
  132. package/dist/transport/webrtc/transport.d.ts.map +1 -0
  133. package/dist/transport/webrtc/transport.js +406 -0
  134. package/dist/transport/webrtc/transport.js.map +1 -0
  135. package/dist/transport/zenoh/adapter.d.ts +47 -0
  136. package/dist/transport/zenoh/adapter.d.ts.map +1 -0
  137. package/dist/transport/zenoh/adapter.js +296 -0
  138. package/dist/transport/zenoh/adapter.js.map +1 -0
  139. package/dist/transport/zenoh/cdr.d.ts +17 -0
  140. package/dist/transport/zenoh/cdr.d.ts.map +1 -0
  141. package/dist/transport/zenoh/cdr.js +170 -0
  142. package/dist/transport/zenoh/cdr.js.map +1 -0
  143. package/dist/transport/zenoh/keys.d.ts +21 -0
  144. package/dist/transport/zenoh/keys.d.ts.map +1 -0
  145. package/dist/transport/zenoh/keys.js +44 -0
  146. package/dist/transport/zenoh/keys.js.map +1 -0
  147. package/dist/transport-pool.d.ts +74 -0
  148. package/dist/transport-pool.d.ts.map +1 -0
  149. package/dist/transport-pool.js +135 -0
  150. package/dist/transport-pool.js.map +1 -0
  151. package/package.json +80 -0
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Mission runner — Phase 1.c of the AgenticROS strategy.
3
+ *
4
+ * A mission is a declarative sequence of capability invocations. Each step
5
+ * names a capability (from the registry exposed by `ros2_list_capabilities`)
6
+ * with literal or templated inputs, where templates can reference outputs
7
+ * from earlier steps via `{{stepId.outputs.fieldName}}`.
8
+ *
9
+ * The runner here is transport-agnostic — it takes a `dispatcher` callback
10
+ * that knows how to invoke a single tool for the host adapter. Adapters
11
+ * pass their existing tool dispatch path (handleToolCall in claude-code,
12
+ * tool.execute() in OpenClaw, executeTool() in Gemini), and the runner
13
+ * stays the same across all three.
14
+ *
15
+ * Phase 1.d adds multi-robot routing: `mission.robot_id` (optional) and
16
+ * per-step `inputs.robot_id` are auto-injected into every dispatched
17
+ * tool call when the binding's tool args don't already specify one. The
18
+ * adapter-side tool handlers then resolve the robot via
19
+ * `resolveRobotFromArgs(config, args)` and route the underlying
20
+ * publish/subscribe/etc. through that robot's namespace.
21
+ *
22
+ * Precedence (highest wins):
23
+ * 1. Tool args produced by the binding (`binding.buildArgs(inputs)`)
24
+ * — if it sets `robot_id`, that's final.
25
+ * 2. Per-step `inputs.robot_id` (lets a mission mix robots step-by-step).
26
+ * 3. Mission-level `mission.robot_id` (the default for every step).
27
+ * 4. None — the adapter falls back to the active robot.
28
+ *
29
+ * Phase 1.f extends the runner with two additive capabilities:
30
+ * - `cancellation`: a token the runner checks BEFORE each step. The
31
+ * adapter holds the token in its `MissionRegistry` so a sibling
32
+ * tool call (`mission_cancel(mission_id)`) can flip
33
+ * `cancellation.cancelled` mid-run and stop the mission gracefully.
34
+ * Steps that have already completed keep their results; the current
35
+ * step finishes naturally (the runner doesn't preempt
36
+ * `await dispatcher(...)` because that requires per-tool cancel
37
+ * support — out of scope for Phase 1.f); subsequent steps are
38
+ * marked `"cancelled"` and skipped.
39
+ * - `transcript`: a callback invoked after every step with the
40
+ * step's `MissionStepResult`. Adapters wire this to the shared
41
+ * memory subsystem so a second agent can `recall(namespace=
42
+ * "mission:<id>")` and inspect what's run so far. The runner
43
+ * itself owns no I/O — the callback can be a no-op when memory
44
+ * is disabled.
45
+ *
46
+ * What's still deferred:
47
+ * - Parallel step execution (today: sequential only).
48
+ * - Per-tool cancellation (cancel TIES to step boundaries today).
49
+ * - Natural-language plan compilation (today: declarative only).
50
+ * - Retry / backoff policies.
51
+ *
52
+ * See: docs/strategy-ai-agents-plus-ros.md §4 (Phase 1.c / 1.f).
53
+ */
54
+ import type { Capability } from "./capabilities.js";
55
+ /**
56
+ * Cancellation token consumed by `runMission`.
57
+ *
58
+ * Plain object (not AbortController) so it's easy to share across
59
+ * processes via a registry without pulling Web platform shims in. The
60
+ * runner only reads `cancelled`; `reason` is surfaced in the result
61
+ * for traceability.
62
+ */
63
+ export interface MissionCancellationToken {
64
+ cancelled: boolean;
65
+ /** Optional free-text reason — bubbled up into the cancelled step results. */
66
+ reason?: string;
67
+ }
68
+ /**
69
+ * Per-step transcript sink. Called immediately after a step finishes
70
+ * (including cancelled / skipped steps) so an external store sees the
71
+ * whole timeline, not just the post-mortem `MissionResult`.
72
+ *
73
+ * The callback is best-effort: thrown errors are logged but never
74
+ * propagate up — losing a transcript entry must not abort an
75
+ * otherwise-healthy mission.
76
+ */
77
+ export type MissionTranscriptSink = (entry: MissionTranscriptEntry) => Promise<void> | void;
78
+ /** One transcript entry per executed step. */
79
+ export interface MissionTranscriptEntry {
80
+ /** Unique id of the running mission (assigned by the adapter, not the runner). */
81
+ mission_id: string;
82
+ /** Free-text mission label. */
83
+ mission_name?: string;
84
+ /** Adapter that ran the mission (e.g. "claude-code", "openclaw", "gemini"). */
85
+ adapter?: string;
86
+ /** When the step started (ms since epoch). */
87
+ started_at: number;
88
+ /** Mission-level robot id (empty when unset). */
89
+ robot_id?: string;
90
+ /** Index of this step in mission.steps (0-based). */
91
+ step_index: number;
92
+ /** Total steps in the mission. */
93
+ step_total: number;
94
+ /** Snapshot of the per-step result. */
95
+ result: MissionStepResult;
96
+ }
97
+ /** One step in a mission. */
98
+ export interface MissionStep {
99
+ /** Unique id within the mission, used by later steps for `{{id.outputs.x}}`. */
100
+ id: string;
101
+ /**
102
+ * Capability id (e.g. `drive_base`, `find_object`). The runner looks this
103
+ * up in the capability registry and uses a dispatch map to find the
104
+ * underlying tool to invoke.
105
+ */
106
+ capability: string;
107
+ /**
108
+ * Inputs to the capability. Values can be literals or `{{stepId.outputs.x}}`
109
+ * templates that resolve from prior steps' outputs.
110
+ */
111
+ inputs?: Record<string, unknown>;
112
+ /**
113
+ * Optional behaviour when this step fails. Defaults to "stop".
114
+ * - "stop": halt the mission, mark it failed
115
+ * - "continue": record the failure and run the next step anyway
116
+ */
117
+ on_fail?: "stop" | "continue";
118
+ }
119
+ /** A complete mission plan. */
120
+ export interface Mission {
121
+ /** Free-text label for logs / chat replies (e.g. "find chair and approach"). */
122
+ name?: string;
123
+ /**
124
+ * Optional planning notes from the agent — surfaced in the result for
125
+ * downstream summarisation. The runner ignores it.
126
+ */
127
+ goal?: string;
128
+ /**
129
+ * Optional default robot id for every step. Each step's tool args get
130
+ * `robot_id` auto-injected from this when the step doesn't supply its
131
+ * own and the binding's tool args don't already include one. Unknown
132
+ * robot ids surface as a tool error from the adapter, not from the
133
+ * runner. Empty/whitespace is ignored (uses the active robot).
134
+ */
135
+ robot_id?: string;
136
+ steps: MissionStep[];
137
+ }
138
+ /** Result of a single step. */
139
+ export interface MissionStepResult {
140
+ id: string;
141
+ capability: string;
142
+ /**
143
+ * Final step outcome:
144
+ * - "ok": tool returned cleanly, outputs (if any) parsed.
145
+ * - "error": tool returned an error or the binding/build threw.
146
+ * - "skipped": earlier step failed with on_fail=stop.
147
+ * - "cancelled": mission was cancelled (Phase 1.f) before this step ran.
148
+ */
149
+ status: "ok" | "error" | "skipped" | "cancelled";
150
+ /** Resolved inputs (with `{{...}}` templates substituted). */
151
+ inputs: Record<string, unknown>;
152
+ /** Outputs parsed from the tool response (may be `undefined` for fire-and-forget). */
153
+ outputs?: Record<string, unknown>;
154
+ /** Free-form text the tool returned (e.g. for human display). */
155
+ message?: string;
156
+ /** Error message when status is "error". */
157
+ error?: string;
158
+ /** Wall time in ms. */
159
+ duration_ms: number;
160
+ }
161
+ /** Result of a mission run. */
162
+ export interface MissionResult {
163
+ /**
164
+ * Overall mission outcome:
165
+ * - "ok": every step succeeded (or skipped on_fail=continue).
166
+ * - "error": one or more steps errored with on_fail=stop.
167
+ * - "cancelled": mission was cancelled mid-run (Phase 1.f). Some
168
+ * steps may have completed successfully — see steps[].
169
+ */
170
+ status: "ok" | "error" | "cancelled";
171
+ /** Number of steps that ran (skipped/cancelled steps are NOT counted as run). */
172
+ steps_run: number;
173
+ steps_total: number;
174
+ /** Per-step results, in declaration order. */
175
+ steps: MissionStepResult[];
176
+ /** Total wall time across all steps. */
177
+ duration_ms: number;
178
+ /** Brief one-line summary suitable for chat reply. */
179
+ summary: string;
180
+ /**
181
+ * Mission-level default robot id used during this run (surfaced for
182
+ * traceability — useful in chat replies and logs). Empty string when
183
+ * the mission didn't pin a robot.
184
+ */
185
+ robot_id?: string;
186
+ /**
187
+ * Phase 1.f — the mission id the adapter registered before running.
188
+ * Empty when the adapter didn't pass an id (e.g. ad-hoc dispatcher
189
+ * tests). Use this with `mission_cancel(mission_id)` to abort a
190
+ * mission mid-run, or `memory_recall(namespace="mission:<id>")` to
191
+ * read the transcript later.
192
+ */
193
+ mission_id?: string;
194
+ /**
195
+ * Phase 1.f — set when the mission was cancelled. Carries the free-text
196
+ * reason the canceller supplied (or "cancelled" when none was given).
197
+ */
198
+ cancellation_reason?: string;
199
+ }
200
+ /**
201
+ * A dispatcher invokes a single MCP tool by name and returns:
202
+ * - `text`: the tool's text response (free-form, for human display)
203
+ * - `outputs`: optional structured outputs (parsed JSON when the text
204
+ * payload is a JSON blob). The runner uses these for
205
+ * `{{...}}` template resolution by later steps.
206
+ *
207
+ * Adapters wrap their existing tool entry points to satisfy this contract.
208
+ */
209
+ export type MissionToolDispatcher = (toolName: string, args: Record<string, unknown>) => Promise<{
210
+ text: string;
211
+ outputs?: Record<string, unknown>;
212
+ isError?: boolean;
213
+ }>;
214
+ /**
215
+ * Capability → MCP tool mapping. Each entry says "to satisfy capability X,
216
+ * call tool Y with these arguments". The transform receives the step's
217
+ * (already template-resolved) inputs and returns the args object the tool
218
+ * expects.
219
+ *
220
+ * Why a separate map (not a field on the capability itself)?
221
+ * - Some capabilities map onto different tools per adapter
222
+ * (claude-code's `ros2_find_object` is a single tool call; the OpenClaw
223
+ * adapter equivalent runs in a different process).
224
+ * - Skill-declared capabilities will eventually carry their own
225
+ * implementation hint (`implementation.kind = "in_process"|"external_ros_node"`),
226
+ * but until that wire-up is real, mapping happens here.
227
+ */
228
+ export interface CapabilityToolBinding {
229
+ /** The MCP tool name to invoke. */
230
+ tool: string;
231
+ /** Transform the step's resolved inputs into the tool's expected arguments. */
232
+ buildArgs: (inputs: Record<string, unknown>) => Record<string, unknown>;
233
+ /**
234
+ * Optional: extract structured outputs from the tool's text response
235
+ * for `{{...}}` template references by later steps. When omitted, the
236
+ * runner attempts to JSON-parse the text and use the result.
237
+ */
238
+ parseOutputs?: (text: string) => Record<string, unknown> | undefined;
239
+ }
240
+ export type CapabilityToolBindings = Record<string, CapabilityToolBinding>;
241
+ /** Phase 1.f optional behaviour bundle for `runMission`. */
242
+ export interface RunMissionOptions {
243
+ /**
244
+ * Stable identifier for this mission run. Adapters generate it and
245
+ * register a cancellation token under this key, so a sibling
246
+ * `mission_cancel(mission_id)` tool call can flip the token mid-run.
247
+ * Surfaced in the result + every transcript entry.
248
+ */
249
+ mission_id?: string;
250
+ /**
251
+ * Cancellation token the runner checks BEFORE each step. When
252
+ * `cancelled` is true at a step boundary, the remaining steps are
253
+ * marked "cancelled" and the mission returns with
254
+ * `status: "cancelled"`.
255
+ */
256
+ cancellation?: MissionCancellationToken;
257
+ /**
258
+ * Best-effort transcript sink — called after every step finishes
259
+ * (including skipped/cancelled). Adapters wire this to the memory
260
+ * subsystem so a downstream agent can read the timeline. Thrown
261
+ * errors are swallowed; transcripts are not gated by the mission's
262
+ * success.
263
+ */
264
+ transcript?: MissionTranscriptSink;
265
+ /** Adapter label (e.g. "claude-code", "openclaw", "gemini") — copied into transcripts. */
266
+ adapter?: string;
267
+ }
268
+ /**
269
+ * Execute a mission sequentially.
270
+ *
271
+ * @param mission The declarative plan.
272
+ * @param capabilities Capability registry — used to validate that each
273
+ * requested capability id is real.
274
+ * @param bindings Capability → tool mapping; entries missing here yield
275
+ * an "unsupported capability" error for that step.
276
+ * @param dispatcher Adapter-supplied function that invokes a tool by name.
277
+ * @param options Phase 1.f options (cancellation token, transcript sink, mission id).
278
+ * Omit for legacy callers.
279
+ */
280
+ export declare function runMission(mission: Mission, capabilities: Capability[], bindings: CapabilityToolBindings, dispatcher: MissionToolDispatcher, options?: RunMissionOptions): Promise<MissionResult>;
281
+ //# sourceMappingURL=mission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission.d.ts","sourceRoot":"","sources":["../src/mission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Mission runner — Phase 1.c of the AgenticROS strategy.
3
+ *
4
+ * A mission is a declarative sequence of capability invocations. Each step
5
+ * names a capability (from the registry exposed by `ros2_list_capabilities`)
6
+ * with literal or templated inputs, where templates can reference outputs
7
+ * from earlier steps via `{{stepId.outputs.fieldName}}`.
8
+ *
9
+ * The runner here is transport-agnostic — it takes a `dispatcher` callback
10
+ * that knows how to invoke a single tool for the host adapter. Adapters
11
+ * pass their existing tool dispatch path (handleToolCall in claude-code,
12
+ * tool.execute() in OpenClaw, executeTool() in Gemini), and the runner
13
+ * stays the same across all three.
14
+ *
15
+ * Phase 1.d adds multi-robot routing: `mission.robot_id` (optional) and
16
+ * per-step `inputs.robot_id` are auto-injected into every dispatched
17
+ * tool call when the binding's tool args don't already specify one. The
18
+ * adapter-side tool handlers then resolve the robot via
19
+ * `resolveRobotFromArgs(config, args)` and route the underlying
20
+ * publish/subscribe/etc. through that robot's namespace.
21
+ *
22
+ * Precedence (highest wins):
23
+ * 1. Tool args produced by the binding (`binding.buildArgs(inputs)`)
24
+ * — if it sets `robot_id`, that's final.
25
+ * 2. Per-step `inputs.robot_id` (lets a mission mix robots step-by-step).
26
+ * 3. Mission-level `mission.robot_id` (the default for every step).
27
+ * 4. None — the adapter falls back to the active robot.
28
+ *
29
+ * Phase 1.f extends the runner with two additive capabilities:
30
+ * - `cancellation`: a token the runner checks BEFORE each step. The
31
+ * adapter holds the token in its `MissionRegistry` so a sibling
32
+ * tool call (`mission_cancel(mission_id)`) can flip
33
+ * `cancellation.cancelled` mid-run and stop the mission gracefully.
34
+ * Steps that have already completed keep their results; the current
35
+ * step finishes naturally (the runner doesn't preempt
36
+ * `await dispatcher(...)` because that requires per-tool cancel
37
+ * support — out of scope for Phase 1.f); subsequent steps are
38
+ * marked `"cancelled"` and skipped.
39
+ * - `transcript`: a callback invoked after every step with the
40
+ * step's `MissionStepResult`. Adapters wire this to the shared
41
+ * memory subsystem so a second agent can `recall(namespace=
42
+ * "mission:<id>")` and inspect what's run so far. The runner
43
+ * itself owns no I/O — the callback can be a no-op when memory
44
+ * is disabled.
45
+ *
46
+ * What's still deferred:
47
+ * - Parallel step execution (today: sequential only).
48
+ * - Per-tool cancellation (cancel TIES to step boundaries today).
49
+ * - Natural-language plan compilation (today: declarative only).
50
+ * - Retry / backoff policies.
51
+ *
52
+ * See: docs/strategy-ai-agents-plus-ros.md §4 (Phase 1.c / 1.f).
53
+ */
54
+ const TEMPLATE_RE = /\{\{\s*([a-zA-Z0-9_]+)\.outputs\.([a-zA-Z0-9_]+)\s*\}\}/g;
55
+ /**
56
+ * Substitute `{{stepId.outputs.field}}` references in `value` using the
57
+ * given step output map. Recurses into nested objects/arrays.
58
+ *
59
+ * String values containing exactly one template reference are replaced with
60
+ * the raw value (preserving type — number stays number, etc.). Strings with
61
+ * interpolated text get string-substituted.
62
+ */
63
+ function resolveTemplates(value, outputs) {
64
+ if (typeof value === "string") {
65
+ const matches = [...value.matchAll(TEMPLATE_RE)];
66
+ if (matches.length === 0)
67
+ return value;
68
+ // Whole-string single template: preserve type.
69
+ if (matches.length === 1) {
70
+ const m = matches[0];
71
+ if (m[0] === value.trim()) {
72
+ const stepOuts = outputs[m[1]];
73
+ return stepOuts ? stepOuts[m[2]] : undefined;
74
+ }
75
+ }
76
+ return value.replace(TEMPLATE_RE, (_, stepId, field) => {
77
+ const stepOuts = outputs[stepId];
78
+ const v = stepOuts ? stepOuts[field] : undefined;
79
+ return v === undefined ? "" : String(v);
80
+ });
81
+ }
82
+ if (Array.isArray(value))
83
+ return value.map((v) => resolveTemplates(v, outputs));
84
+ if (value && typeof value === "object") {
85
+ const out = {};
86
+ for (const [k, v] of Object.entries(value)) {
87
+ out[k] = resolveTemplates(v, outputs);
88
+ }
89
+ return out;
90
+ }
91
+ return value;
92
+ }
93
+ function tryParseJsonOutputs(text) {
94
+ // Tools often return "Summary line.\n{json}" — try parsing each line plus
95
+ // the whole payload, returning the first JSON object we find.
96
+ const candidates = [text, text.trim(), text.split("\n").pop() ?? ""];
97
+ for (const c of candidates) {
98
+ if (!c || !c.trim().startsWith("{"))
99
+ continue;
100
+ try {
101
+ const parsed = JSON.parse(c);
102
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
103
+ return parsed;
104
+ }
105
+ }
106
+ catch {
107
+ }
108
+ }
109
+ return undefined;
110
+ }
111
+ /**
112
+ * Execute a mission sequentially.
113
+ *
114
+ * @param mission The declarative plan.
115
+ * @param capabilities Capability registry — used to validate that each
116
+ * requested capability id is real.
117
+ * @param bindings Capability → tool mapping; entries missing here yield
118
+ * an "unsupported capability" error for that step.
119
+ * @param dispatcher Adapter-supplied function that invokes a tool by name.
120
+ * @param options Phase 1.f options (cancellation token, transcript sink, mission id).
121
+ * Omit for legacy callers.
122
+ */
123
+ export async function runMission(mission, capabilities, bindings, dispatcher, options) {
124
+ const capIds = new Set(capabilities.map((c) => c.id));
125
+ const stepOutputs = {};
126
+ const results = [];
127
+ const t0Mission = Date.now();
128
+ let aborted = false;
129
+ let cancelled = false;
130
+ // Phase 1.f — best-effort transcript emit. Synchronous helper so the
131
+ // mission loop stays linear; the caller's sink may itself be async
132
+ // but we don't block the next step on it.
133
+ const emitTranscript = (idx, started_at, result) => {
134
+ if (!options?.transcript)
135
+ return;
136
+ try {
137
+ const entry = {
138
+ mission_id: options.mission_id ?? "",
139
+ mission_name: mission.name,
140
+ adapter: options.adapter,
141
+ started_at,
142
+ robot_id: typeof mission.robot_id === "string" ? mission.robot_id : "",
143
+ step_index: idx,
144
+ step_total: mission.steps.length,
145
+ result,
146
+ };
147
+ // Fire-and-forget — never throw out of the runner. We catch
148
+ // synchronous throws AND attach a no-op .catch on the promise so
149
+ // a rejected async sink doesn't surface as an unhandled rejection.
150
+ const ret = options.transcript(entry);
151
+ if (ret && typeof ret.catch === "function") {
152
+ ret.catch(() => { });
153
+ }
154
+ }
155
+ catch {
156
+ // Transcript loss never breaks the mission.
157
+ }
158
+ };
159
+ for (let idx = 0; idx < mission.steps.length; idx++) {
160
+ const step = mission.steps[idx];
161
+ const t0 = Date.now();
162
+ // Phase 1.f — honour cancellation token at the step boundary. We
163
+ // check BEFORE the step runs so that a cancel arriving while
164
+ // step N is in-flight only affects step N+1 onward (per-tool
165
+ // preemption is out of scope; see the module header).
166
+ if (!cancelled && options?.cancellation?.cancelled) {
167
+ cancelled = true;
168
+ }
169
+ if (cancelled) {
170
+ const result = {
171
+ id: step.id,
172
+ capability: step.capability,
173
+ status: "cancelled",
174
+ inputs: {},
175
+ message: `Cancelled: ${options?.cancellation?.reason ?? "cancelled"}`,
176
+ duration_ms: 0,
177
+ };
178
+ results.push(result);
179
+ emitTranscript(idx, t0, result);
180
+ continue;
181
+ }
182
+ if (aborted) {
183
+ const result = {
184
+ id: step.id,
185
+ capability: step.capability,
186
+ status: "skipped",
187
+ inputs: {},
188
+ message: "Skipped: earlier step failed and on_fail=stop.",
189
+ duration_ms: 0,
190
+ };
191
+ results.push(result);
192
+ emitTranscript(idx, t0, result);
193
+ continue;
194
+ }
195
+ if (!capIds.has(step.capability)) {
196
+ const result = {
197
+ id: step.id,
198
+ capability: step.capability,
199
+ status: "error",
200
+ inputs: step.inputs ?? {},
201
+ error: `Capability "${step.capability}" not found in registry. Use ros2_list_capabilities to see what's available.`,
202
+ duration_ms: Date.now() - t0,
203
+ };
204
+ results.push(result);
205
+ emitTranscript(idx, t0, result);
206
+ if ((step.on_fail ?? "stop") === "stop")
207
+ aborted = true;
208
+ continue;
209
+ }
210
+ const binding = bindings[step.capability];
211
+ if (!binding) {
212
+ const result = {
213
+ id: step.id,
214
+ capability: step.capability,
215
+ status: "error",
216
+ inputs: step.inputs ?? {},
217
+ error: `Capability "${step.capability}" is registered but has no mission-runner tool binding yet. See docs/strategy-ai-agents-plus-ros.md §4 Phase 1.c.`,
218
+ duration_ms: Date.now() - t0,
219
+ };
220
+ results.push(result);
221
+ emitTranscript(idx, t0, result);
222
+ if ((step.on_fail ?? "stop") === "stop")
223
+ aborted = true;
224
+ continue;
225
+ }
226
+ const resolvedInputs = resolveTemplates(step.inputs ?? {}, stepOutputs) ?? {};
227
+ let toolArgs;
228
+ try {
229
+ toolArgs = binding.buildArgs(resolvedInputs);
230
+ }
231
+ catch (err) {
232
+ const result = {
233
+ id: step.id,
234
+ capability: step.capability,
235
+ status: "error",
236
+ inputs: resolvedInputs,
237
+ error: `Failed to build args for tool ${binding.tool}: ${err instanceof Error ? err.message : String(err)}`,
238
+ duration_ms: Date.now() - t0,
239
+ };
240
+ results.push(result);
241
+ emitTranscript(idx, t0, result);
242
+ if ((step.on_fail ?? "stop") === "stop")
243
+ aborted = true;
244
+ continue;
245
+ }
246
+ // Inject robot_id when the binding didn't set one. Per-step inputs
247
+ // take precedence over the mission-level default; empty strings
248
+ // mean "use the active robot" so we ignore them. This is what
249
+ // makes per-tool fleet routing work end-to-end from `run_mission`.
250
+ if (!("robot_id" in toolArgs) || typeof toolArgs.robot_id !== "string" || toolArgs.robot_id.trim().length === 0) {
251
+ const stepRid = typeof resolvedInputs.robot_id === "string" ? resolvedInputs.robot_id.trim() : "";
252
+ const missionRid = typeof mission.robot_id === "string" ? mission.robot_id.trim() : "";
253
+ const effective = stepRid || missionRid;
254
+ if (effective)
255
+ toolArgs.robot_id = effective;
256
+ }
257
+ try {
258
+ const dispatched = await dispatcher(binding.tool, toolArgs);
259
+ const outputs = dispatched.outputs ??
260
+ binding.parseOutputs?.(dispatched.text) ??
261
+ tryParseJsonOutputs(dispatched.text);
262
+ stepOutputs[step.id] = outputs;
263
+ const status = dispatched.isError ? "error" : "ok";
264
+ const result = {
265
+ id: step.id,
266
+ capability: step.capability,
267
+ status,
268
+ inputs: resolvedInputs,
269
+ outputs,
270
+ message: dispatched.text,
271
+ ...(dispatched.isError ? { error: dispatched.text } : {}),
272
+ duration_ms: Date.now() - t0,
273
+ };
274
+ results.push(result);
275
+ emitTranscript(idx, t0, result);
276
+ if (status === "error" && (step.on_fail ?? "stop") === "stop")
277
+ aborted = true;
278
+ }
279
+ catch (err) {
280
+ const msg = err instanceof Error ? err.message : String(err);
281
+ const result = {
282
+ id: step.id,
283
+ capability: step.capability,
284
+ status: "error",
285
+ inputs: resolvedInputs,
286
+ error: msg,
287
+ duration_ms: Date.now() - t0,
288
+ };
289
+ results.push(result);
290
+ emitTranscript(idx, t0, result);
291
+ if ((step.on_fail ?? "stop") === "stop")
292
+ aborted = true;
293
+ }
294
+ }
295
+ // "Ran" counts steps that actually executed — skipped (on_fail=stop)
296
+ // and cancelled (Phase 1.f) are explicitly excluded.
297
+ const ran = results.filter((r) => r.status !== "skipped" && r.status !== "cancelled").length;
298
+ const failed = results.filter((r) => r.status === "error").length;
299
+ let overallStatus = failed === 0 ? "ok" : "error";
300
+ if (cancelled)
301
+ overallStatus = "cancelled";
302
+ const summary = summariseMission(mission, results, overallStatus);
303
+ return {
304
+ status: overallStatus,
305
+ steps_run: ran,
306
+ steps_total: mission.steps.length,
307
+ steps: results,
308
+ duration_ms: Date.now() - t0Mission,
309
+ summary,
310
+ robot_id: typeof mission.robot_id === "string" ? mission.robot_id : "",
311
+ ...(options?.mission_id ? { mission_id: options.mission_id } : {}),
312
+ ...(cancelled
313
+ ? { cancellation_reason: options?.cancellation?.reason ?? "cancelled" }
314
+ : {}),
315
+ };
316
+ }
317
+ function summariseMission(mission, results, status) {
318
+ const label = mission.name ?? "Mission";
319
+ const ran = results.filter((r) => r.status !== "skipped" && r.status !== "cancelled").length;
320
+ const cancelled = results.filter((r) => r.status === "cancelled").length;
321
+ const failed = results.filter((r) => r.status === "error");
322
+ if (status === "ok") {
323
+ return `${label}: completed ${ran}/${results.length} step(s) successfully.`;
324
+ }
325
+ if (status === "cancelled") {
326
+ return `${label}: cancelled after ${ran} step(s) — ${cancelled} remaining step(s) skipped.`;
327
+ }
328
+ const first = failed[0];
329
+ return `${label}: failed at step "${first?.id ?? "?"}" (${first?.capability ?? "?"}): ${first?.error ?? "unknown error"}.`;
330
+ }
331
+ //# sourceMappingURL=mission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission.js","sourceRoot":"","sources":["../src/mission.ts"],"names":[],"mappings":"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"}