@tagma/sdk 0.7.42 → 0.7.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -32,7 +32,6 @@ bun add @tagma/sdk
32
32
  ```yaml
33
33
  pipeline:
34
34
  name: build-and-test
35
- mode: trusted # required for shell command tasks
36
35
  tracks:
37
36
  - id: backend
38
37
  name: Backend
@@ -89,7 +88,6 @@ pipeline:
89
88
  requires:
90
89
  sdk: '>=0.7.40'
91
90
  name: my-pipeline
92
- mode: trusted
93
91
  driver: opencode
94
92
  timeout: 30m
95
93
  plugins:
@@ -155,7 +153,6 @@ pipeline:
155
153
  | ------------- | ------------------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
156
154
  | `requires` | `{ sdk?: string }` | No | SDK-owned compatibility gate. `serializePipeline()` adds or raises `requires.sdk` when the YAML uses features that need a newer SDK |
157
155
  | `name` | `string` | Yes | Pipeline name, used in logs and run IDs |
158
- | `mode` | `trusted \| safe` | No | Execution boundary. Defaults to `safe`; `safe` blocks shell tasks, hooks, automatic plugins, execute permissions, and non-allowlisted capabilities |
159
156
  | `driver` | `string` | No | Default driver for all tracks/tasks (inherited). Built-in: `opencode` |
160
157
  | `model` | `string` | No | Default model for all tracks/tasks (inherited). Exact model name, e.g. `claude-sonnet-4-6` |
161
158
  | `permissions` | `Permissions` | No | Default permissions inherited by all tracks/tasks (see Permissions) |
@@ -185,59 +182,58 @@ Each hook value can be a single command string or an array of commands.
185
182
 
186
183
  | Field | Type | Required | Default | Description |
187
184
  | --------------- | -------------------- | -------- | ----------------------- | -------------------------------------------------------------------- |
188
- | `id` | `string` | Yes | | Unique track identifier |
189
- | `name` | `string` | Yes | | Display name |
190
- | `color` | `string` | No | | Color hint for UI rendering (e.g. `"#3b82f6"`) |
185
+ | `id` | `string` | Yes | - | Unique track identifier |
186
+ | `name` | `string` | Yes | - | Display name |
187
+ | `color` | `string` | No | - | Color hint for UI rendering (e.g. `"#3b82f6"`) |
191
188
  | `driver` | `string` | No | Inherited from pipeline | Driver for all tasks in this track |
192
189
  | `model` | `string` | No | Inherited from pipeline | Exact model name passed to the driver CLI (e.g. `claude-sonnet-4-6`) |
193
- | `agent_profile` | `string` | No | | Named agent configuration profile |
190
+ | `agent_profile` | `string` | No | - | Named agent configuration profile |
194
191
  | `cwd` | `string` | No | Pipeline workDir | Working directory for tasks in this track (relative path) |
195
192
  | `permissions` | `Permissions` | No | Inherited from pipeline | Default permissions for tasks (see Permissions) |
196
193
  | `on_failure` | `OnFailure` | No | `skip_downstream` | Failure strategy: `skip_downstream`, `stop_all`, `ignore` |
197
- | `middlewares` | `MiddlewareConfig[]` | No | | Middlewares applied to all tasks (task-level overrides track-level) |
198
- | `tasks` | `TaskConfig[]` | Yes | | Ordered list of tasks in this track |
194
+ | `middlewares` | `MiddlewareConfig[]` | No | - | Middlewares applied to all tasks (task-level overrides track-level) |
195
+ | `tasks` | `TaskConfig[]` | Yes | - | Ordered list of tasks in this track |
199
196
 
200
197
  ### Task Fields
201
198
 
202
199
  | Field | Type | Required | Default | Description |
203
200
  | --------------- | -------------------- | -------- | -------------------- | ------------------------------------------------------------------------------------------------------ |
204
- | `id` | `string` | Yes | | Unique task identifier within its track. Cross-track refs use `trackId.taskId` |
205
- | `name` | `string` | No | | Display name |
206
- | `prompt` | `string` | No\* | | AI prompt to send to the driver. \*Mutually exclusive with `command` |
207
- | `command` | `string` | No\* | | Shell command to execute directly. \*Mutually exclusive with `prompt` |
208
- | `depends_on` | `string[]` | No | | Task IDs that must complete before this task runs. Cross-track refs use `trackId.taskId` |
209
- | `continue_from` | `string` | No | | Task ID whose output/session to continue from (session handoff). Cross-track refs use `trackId.taskId` |
201
+ | `id` | `string` | Yes | - | Unique task identifier within its track. Cross-track refs use `trackId.taskId` |
202
+ | `name` | `string` | No | - | Display name |
203
+ | `prompt` | `string` | No\* | - | AI prompt to send to the driver. \*Mutually exclusive with `command` |
204
+ | `command` | `string` | No\* | - | Shell command to execute directly. \*Mutually exclusive with `prompt` |
205
+ | `depends_on` | `string[]` | No | - | Task IDs that must complete before this task runs. Cross-track refs use `trackId.taskId` |
206
+ | `continue_from` | `string` | No | - | Task ID whose output/session to continue from (session handoff). Cross-track refs use `trackId.taskId` |
210
207
  | `driver` | `string` | No | Inherited from track | Driver override for this task |
211
208
  | `model` | `string` | No | Inherited from track | Model name override for this task |
212
209
  | `agent_profile` | `string` | No | Inherited from track | Agent profile override |
213
210
  | `cwd` | `string` | No | Inherited from track | Working directory override (relative path) |
214
- | `timeout` | `string` | No | | Task-level timeout. Format: `"30s"`, `"5m"`, `"2h"` |
211
+ | `timeout` | `string` | No | - | Task-level timeout. Format: `"30s"`, `"5m"`, `"2h"` |
215
212
  | `permissions` | `Permissions` | No | Inherited from track | Permission override (see Permissions) |
216
213
  | `middlewares` | `MiddlewareConfig[]` | No | Inherited from track | Middleware override. Set `[]` to disable inherited middlewares |
217
- | `trigger` | `TriggerConfig` | No | | Gate that must resolve before the task runs (see Triggers) |
218
- | `completion` | `CompletionConfig` | No | | Post-execution check to validate task output (see Completions) |
219
- | `inputs` | `TaskInputBindings` | No | | Task input bindings for `{{inputs.<name>}}`; optional `type` enables coercion/validation |
220
- | `outputs` | `TaskOutputBindings` | No | | Named outputs published after success; optional `type` enables coercion/validation |
214
+ | `trigger` | `TriggerConfig` | No | - | Gate that must resolve before the task runs (see Triggers) |
215
+ | `completion` | `CompletionConfig` | No | - | Post-execution check to validate task output (see Completions) |
216
+ | `inputs` | `TaskInputBindings` | No | - | Task input bindings for `{{inputs.<name>}}`; optional `type` enables coercion/validation |
217
+ | `outputs` | `TaskOutputBindings` | No | - | Named outputs published after success; optional `type` enables coercion/validation |
221
218
 
222
219
  ### Permissions
223
220
 
224
221
  | Field | Type | Default | Description |
225
222
  | --------- | --------- | ------- | -------------------------------------------------- |
226
- | `read` | `boolean` | | Allow the AI driver/agent to read files |
227
- | `write` | `boolean` | | Allow the AI driver/agent to write files |
228
- | `execute` | `boolean` | | Allow the AI driver/agent to execute tool commands |
223
+ | `read` | `boolean` | - | Allow the AI driver/agent to read files |
224
+ | `write` | `boolean` | - | Allow the AI driver/agent to write files |
225
+ | `execute` | `boolean` | - | Allow the AI driver/agent to execute tool commands |
229
226
 
230
227
  `permissions` are passed to AI drivers that support them. They do not sandbox
231
- YAML `command` tasks; command tasks are host shell execution and are controlled
232
- by `mode: safe` / `mode: trusted`.
228
+ YAML `command` tasks; command tasks execute through the host shell.
233
229
 
234
230
  ### Inheritance
235
231
 
236
- Fields are inherited top-down: **pipeline track task**. A value set at a lower level overrides the inherited value.
232
+ Fields are inherited top-down: **pipeline -> track -> task**. A value set at a lower level overrides the inherited value.
237
233
 
238
- Inherited from pipeline track task: `driver`, `model`, `reasoning_effort`, `permissions`. `cwd` is inherited track task only (the pipeline's cwd is the workDir argument passed to `tagma.run` / `loadPipeline`, not a YAML field).
234
+ Inherited from pipeline -> track -> task: `driver`, `model`, `reasoning_effort`, `permissions`. `cwd` is inherited track -> task only (the pipeline's cwd is the workDir argument passed to `tagma.run` / `loadPipeline`, not a YAML field).
239
235
 
240
- `middlewares` is **track task only** there is no `pipeline.middlewares` field. Track-level `middlewares` apply to all tasks in the track. Setting task-level `middlewares` **replaces** (not appends) the track-level list. Use `middlewares: []` to disable all inherited middlewares for a task.
236
+ `middlewares` is **track -> task only** - there is no `pipeline.middlewares` field. Track-level `middlewares` apply to all tasks in the track. Setting task-level `middlewares` **replaces** (not appends) the track-level list. Use `middlewares: []` to disable all inherited middlewares for a task.
241
237
 
242
238
  ---
243
239
 
@@ -346,69 +342,69 @@ Tasks can declare named, typed `inputs` / `outputs`. Inputs flow in from upstrea
346
342
 
347
343
  File and directory trigger watch paths may be relative to `workDir`, absolute, or external. This exception is only for trigger watch paths; other path fields remain workspace-bound.
348
344
 
349
- #### `manual` Human approval gate
345
+ #### `manual` - Human approval gate
350
346
 
351
347
  | Field | Type | Required | Default | Description |
352
348
  | ---------- | ---------- | -------- | ------------------------------------------------------ | ------------------------------------------------- |
353
- | `type` | `"manual"` | Yes | | Trigger type |
349
+ | `type` | `"manual"` | Yes | - | Trigger type |
354
350
  | `message` | `string` | No | `"Manual confirmation required for task \"{taskId}\""` | Message shown to the approver |
355
- | `timeout` | `string` | No | | How long to wait for a decision before timing out |
356
- | `metadata` | `object` | No | | Arbitrary metadata passed to the approval gateway |
351
+ | `timeout` | `string` | No | - | How long to wait for a decision before timing out |
352
+ | `metadata` | `object` | No | - | Arbitrary metadata passed to the approval gateway |
357
353
 
358
- #### `file` File watcher gate
354
+ #### `file` - File watcher gate
359
355
 
360
356
  | Field | Type | Required | Default | Description |
361
357
  | --------- | -------- | -------- | ------- | ---------------------------------------------- |
362
- | `type` | `"file"` | Yes | | Trigger type |
363
- | `path` | `string` | Yes | | File path to watch (relative to workDir) |
364
- | `timeout` | `string` | No | | How long to wait for the file to appear/change |
358
+ | `type` | `"file"` | Yes | - | Trigger type |
359
+ | `path` | `string` | Yes | - | File path to watch (relative to workDir) |
360
+ | `timeout` | `string` | No | - | How long to wait for the file to appear/change |
365
361
 
366
362
  #### `directory` - Directory watcher gate
367
363
 
368
364
  | Field | Type | Required | Default | Description |
369
365
  | --------- | ------------- | -------- | ------- | ------------------------------------------------ |
370
- | `type` | `"directory"` | Yes | | Trigger type |
371
- | `path` | `string` | Yes | | Directory path to watch (relative to workDir) |
372
- | `timeout` | `string` | No | | How long to wait for the directory to be created |
366
+ | `type` | `"directory"` | Yes | - | Trigger type |
367
+ | `path` | `string` | Yes | - | Directory path to watch (relative to workDir) |
368
+ | `timeout` | `string` | No | - | How long to wait for the directory to be created |
373
369
 
374
370
  ---
375
371
 
376
372
  ### Built-in Completions
377
373
 
378
- #### `exit_code` Exit code check
374
+ #### `exit_code` - Exit code check
379
375
 
380
376
  | Field | Type | Required | Default | Description |
381
377
  | -------- | -------------------- | -------- | ------- | ------------------------------------------------------------------ |
382
- | `type` | `"exit_code"` | Yes | | Completion type |
378
+ | `type` | `"exit_code"` | Yes | - | Completion type |
383
379
  | `expect` | `number \| number[]` | No | `0` | Expected exit code(s). Pass an array for multiple acceptable codes |
384
380
 
385
- #### `file_exists` File existence check
381
+ #### `file_exists` - File existence check
386
382
 
387
383
  | Field | Type | Required | Default | Description |
388
384
  | ---------- | -------------------------- | -------- | ------- | ----------------------------------------------------- |
389
- | `type` | `"file_exists"` | Yes | | Completion type |
390
- | `path` | `string` | Yes | | File or directory path to check (relative to workDir) |
385
+ | `type` | `"file_exists"` | Yes | - | Completion type |
386
+ | `path` | `string` | Yes | - | File or directory path to check (relative to workDir) |
391
387
  | `kind` | `"file" \| "dir" \| "any"` | No | `"any"` | Entity type constraint |
392
- | `min_size` | `number` | No | | Minimum file size in bytes (files only) |
388
+ | `min_size` | `number` | No | - | Minimum file size in bytes (files only) |
393
389
 
394
- #### `output_check` Command-based output validation
390
+ #### `output_check` - Command-based output validation
395
391
 
396
392
  | Field | Type | Required | Default | Description |
397
393
  | --------- | ---------------- | -------- | ------- | ----------------------------------------------------------------------- |
398
- | `type` | `"output_check"` | Yes | | Completion type |
399
- | `check` | `string` | Yes | | Shell command to run. Task stdout is piped to its stdin; exits 0 = pass |
394
+ | `type` | `"output_check"` | Yes | - | Completion type |
395
+ | `check` | `string` | Yes | - | Shell command to run. Task stdout is piped to its stdin; exits 0 = pass |
400
396
  | `timeout` | `string` | No | `"30s"` | Max time to wait for the check command |
401
397
 
402
398
  ---
403
399
 
404
400
  ### Built-in Middlewares
405
401
 
406
- #### `static_context` Prepend file content to prompt
402
+ #### `static_context` - Prepend file content to prompt
407
403
 
408
404
  | Field | Type | Required | Default | Description |
409
405
  | ------- | ------------------ | -------- | ------------------------- | ---------------------------------------------- |
410
- | `type` | `"static_context"` | Yes | | Middleware type |
411
- | `file` | `string` | Yes | | Path to the context file (relative to workDir) |
406
+ | `type` | `"static_context"` | Yes | - | Middleware type |
407
+ | `file` | `string` | Yes | - | Path to the context file (relative to workDir) |
412
408
  | `label` | `string` | No | `"Reference: {filename}"` | Label for the injected context section |
413
409
 
414
410
  ## API
@@ -454,7 +450,7 @@ File and directory trigger watch paths may be relative to `workDir`, absolute, o
454
450
  ### Config: `@tagma/sdk/config`
455
451
 
456
452
  - immutable config editing helpers
457
- - raw validation helpers (`validateRaw`, plus `validateConfig` for the resolved-config counterpart same function as `@tagma/sdk/yaml`'s `validateConfig`, re-exported here so config-editor code paths stay on `./config` without dipping into `./yaml`)
453
+ - raw validation helpers (`validateRaw`, plus `validateConfig` for the resolved-config counterpart - same function as `@tagma/sdk/yaml`'s `validateConfig`, re-exported here so config-editor code paths stay on `./config` without dipping into `./yaml`)
458
454
  - resolved and raw DAG helpers
459
455
  - task reference helpers
460
456
 
@@ -469,16 +465,16 @@ File and directory trigger watch paths may be relative to `workDir`, absolute, o
469
465
 
470
466
  ### Approval: `@tagma/sdk/approval`
471
467
 
472
- - `InMemoryApprovalGateway` default in-memory approval gateway implementation
468
+ - `InMemoryApprovalGateway` - default in-memory approval gateway implementation
473
469
  - type re-exports: `ApprovalDecision`, `ApprovalEvent`, `ApprovalGateway`, `ApprovalListener`, `ApprovalOutcome`, `ApprovalRequest`, `ApprovalRequestHandle`
474
470
 
475
471
  ### Utils: `@tagma/sdk/utils`
476
472
 
477
- - `parseDuration`, `validatePath`, `generateRunId`, `nowISO`, `truncateForName` small framework-free helpers re-exported from `@tagma/core`. See the Utilities table at the bottom of this README
473
+ - `parseDuration`, `validatePath`, `generateRunId`, `nowISO`, `truncateForName` - small framework-free helpers re-exported from `@tagma/core`. See the Utilities table at the bottom of this README
478
474
 
479
475
  ### Runtime approval adapters
480
476
 
481
- These ship in `@tagma/runtime-bun`, not `@tagma/sdk` when you `bun add @tagma/sdk`, runtime-bun comes along as a transitive dep, but you import the adapters from runtime-bun directly:
477
+ These ship in `@tagma/runtime-bun`, not `@tagma/sdk` - when you `bun add @tagma/sdk`, runtime-bun comes along as a transitive dep, but you import the adapters from runtime-bun directly:
482
478
 
483
479
  - `@tagma/runtime-bun/adapters/stdin-approval`
484
480
  - `@tagma/runtime-bun/adapters/websocket-approval`
@@ -522,21 +518,19 @@ Options:
522
518
  - `approvalGateway` -- custom `ApprovalGateway` instance (defaults to `InMemoryApprovalGateway`)
523
519
  - `signal` -- `AbortSignal` to cancel the run externally
524
520
  - `onEvent` -- callback for real-time `RunEventPayload` updates. Every payload carries `runId`. The editor server stamps a per-run `seq` on top of this payload before broadcasting over SSE (producing a `WireRunEvent`); the SDK itself does not stamp `seq`. Event variants:
525
- - `run_start` pipeline approved and all tasks transitioned to `waiting`; includes `tasks: RunTaskState[]` (wire-shape snapshot of every task). Fires only when the `pipeline_start` hook allows the run blocked pipelines emit no wire events at all.
526
- - `task_update` a task's status or result changed; flat fields (`status`, `startedAt?`, `finishedAt?`, `durationMs?`, `exitCode?`, `stdout?`, `stderr?`, `stdoutPath?`, `stderrPath?`, `stdoutBytes?`, `stderrBytes?`, `sessionId?`, `normalizedOutput?`, `outputs?`, `inputs?`, `resolvedDriver?`, `resolvedModel?`, `resolvedPermissions?`) so clients can fold partial updates with `??` semantics. `inputs` carries the resolved task input map (set once just before the task transitions to `running`); `outputs` carries the extracted binding output map after a successful terminal transition. `startedAt` is populated before the `running` transition; `finishedAt` and result fields are populated before any terminal-status transition. Terminal-state locking in the engine guarantees at most one terminal event per task.
527
- - `task_log` a structured log line was written to `pipeline.log`. Mirrors every `Logger` call (info/warn/error/debug/section/quiet) and carries `{ taskId: string | null, level, timestamp, text }`. `taskId` is non-null for lines tagged with a `[task:<id>]` prefix (or passed explicitly to `section`/`quiet`) and `null` for pipeline-wide messages such as the configuration dump and DAG topology. Use this to stream the full run process into UIs without tailing the log file.
528
- - `run_end` pipeline finished; includes `success: boolean` and `abortReason: 'timeout' | 'stop_all' | 'external' | null`. `null` means the run completed on its own steam (success may still be `false` if tasks failed).
529
- - `run_error` reserved for fatal engine errors surfaced over the wire.
530
- - `approval_request` / `approval_resolved` bridged from the approval gateway so hosts see approvals on the same channel as task updates, without separately subscribing to the gateway.
521
+ - `run_start` - pipeline approved and all tasks transitioned to `waiting`; includes `tasks: RunTaskState[]` (wire-shape snapshot of every task). Fires only when the `pipeline_start` hook allows the run - blocked pipelines emit no wire events at all.
522
+ - `task_update` - a task's status or result changed; flat fields (`status`, `startedAt?`, `finishedAt?`, `durationMs?`, `exitCode?`, `stdout?`, `stderr?`, `stdoutPath?`, `stderrPath?`, `stdoutBytes?`, `stderrBytes?`, `sessionId?`, `normalizedOutput?`, `outputs?`, `inputs?`, `resolvedDriver?`, `resolvedModel?`, `resolvedPermissions?`) so clients can fold partial updates with `??` semantics. `inputs` carries the resolved task input map (set once just before the task transitions to `running`); `outputs` carries the extracted binding output map after a successful terminal transition. `startedAt` is populated before the `running` transition; `finishedAt` and result fields are populated before any terminal-status transition. Terminal-state locking in the engine guarantees at most one terminal event per task.
523
+ - `task_log` - a structured log line was written to `pipeline.log`. Mirrors every `Logger` call (info/warn/error/debug/section/quiet) and carries `{ taskId: string | null, level, timestamp, text }`. `taskId` is non-null for lines tagged with a `[task:<id>]` prefix (or passed explicitly to `section`/`quiet`) and `null` for pipeline-wide messages such as the configuration dump and DAG topology. Use this to stream the full run process into UIs without tailing the log file.
524
+ - `run_end` - pipeline finished; includes `success: boolean` and `abortReason: 'timeout' | 'stop_all' | 'external' | null`. `null` means the run completed on its own steam (success may still be `false` if tasks failed).
525
+ - `run_error` - reserved for fatal engine errors surfaced over the wire.
526
+ - `approval_request` / `approval_resolved` - bridged from the approval gateway so hosts see approvals on the same channel as task updates, without separately subscribing to the gateway.
531
527
  - `runId` -- caller-supplied run ID. Must match `run_[A-Za-z0-9_-]{1,128}`. When provided the engine uses this instead of generating its own, keeping the caller and the SDK log directories aligned on the same ID
532
528
  - `maxLogRuns` -- number of per-run log directories to keep under `<workDir>/.tagma/logs/` (default: 20)
533
529
  - `skipPluginLoading` -- skip the engine's built-in `loadPlugins(config.plugins)` call. Set this when the host has already pre-loaded plugins from a custom resolution path (e.g. the editor loading from the user's workspace `node_modules`) so the engine doesn't re-resolve them via Node's default cwd-based import.
534
- - `mode` -- override `config.mode` for this run. `safe` is the default. `safe` blocks `command` tasks, lifecycle hooks, automatic `pipeline.plugins` loading, execute permissions, and non-allowlisted driver/trigger/completion/middleware types.
535
- - `safeModeAllowlist` -- extends the built-in safe-mode allowlist for trusted host integrations.
536
530
  - `envPolicy` -- controls child process environment inheritance. Defaults to a minimal environment (`PATH`, home/user/temp/system keys). Use `{ mode: 'allowlist', keys: [...] }` or `{ mode: 'inherit' }` only when the host deliberately wants to expose more env vars.
537
531
  - `logPrompt` -- when `true`, writes the final middleware-expanded prompt to the run log. Defaults to `false`.
538
532
 
539
- > **stdout / stderr persistence.** With the default Bun runtime, the engine streams every task's stdout and stderr to disk under `<workDir>/.tagma/logs/<runId>/<taskId>.stdout` and `.stderr`. Custom runtimes can relocate those artifacts by implementing `runtime.logStore.taskOutputPath()`. The `TaskResult.stdout` / `stderr` strings are bounded tails (8 MB / 4 MB by default) long outputs are truncated from the head with a marker, and consumers that need the full bytes should read `TaskResult.stdoutPath` / `stderrPath`. Use `TaskResult.stdoutBytes` / `stderrBytes` to display "32 MB (truncated)" without re-stat'ing the file.
533
+ > **stdout / stderr persistence.** With the default Bun runtime, the engine streams every task's stdout and stderr to disk under `<workDir>/.tagma/logs/<runId>/<taskId>.stdout` and `.stderr`. Custom runtimes can relocate those artifacts by implementing `runtime.logStore.taskOutputPath()`. The `TaskResult.stdout` / `stderr` strings are bounded tails (8 MB / 4 MB by default) - long outputs are truncated from the head with a marker, and consumers that need the full bytes should read `TaskResult.stdoutPath` / `stderrPath`. Use `TaskResult.stdoutBytes` / `stderrBytes` to display "32 MB (truncated)" without re-stat'ing the file.
540
534
 
541
535
  ### Workflow graph YAML
542
536
 
@@ -569,14 +563,14 @@ Per-pipeline `lifecycle.max_runs` defaults to `1`. `lifecycle.stop_when` default
569
563
 
570
564
  ### `PipelineRunner`
571
565
 
572
- Higher-level wrapper for managing multiple concurrent pipeline runs designed for sidecar / Tauri IPC scenarios where the frontend controls pipeline lifecycle by ID.
566
+ Higher-level wrapper for managing multiple concurrent pipeline runs - designed for sidecar / Tauri IPC scenarios where the frontend controls pipeline lifecycle by ID.
573
567
 
574
568
  ```ts
575
569
  import { PipelineRunner } from '@tagma/sdk/pipeline-runner';
576
570
 
577
571
  const runner = new PipelineRunner(config, workDir, options?); // options: Omit<RunPipelineOptions, 'signal' | 'onEvent'>
578
572
 
579
- // Subscribe before start handler is called for every RunEventPayload
573
+ // Subscribe before start - handler is called for every RunEventPayload
580
574
  const unsubscribe = runner.subscribe((event) => {
581
575
  tauriEmit('run_event', { id: runner.instanceId, event });
582
576
  });
@@ -593,7 +587,7 @@ runner.abort();
593
587
  // per-task view without having to buffer the event stream themselves.
594
588
  // task_output chunks are folded into RunTaskState.stdout/stderr while a task
595
589
  // is running; the terminal task_update replaces them with the final bounded tail.
596
- // Pipeline-wide log lines (taskId: null config dump, DAG topology,
590
+ // Pipeline-wide log lines (taskId: null - config dump, DAG topology,
597
591
  // hook output without a [task:<id>] prefix) are NOT folded into any task's
598
592
  // log buffer; subscribe at the event stream level if you need them.
599
593
  const tasks = runner.getTasks(); // ReadonlyMap<taskId, RunTaskState>
@@ -601,9 +595,9 @@ const tasks = runner.getTasks(); // ReadonlyMap<taskId, RunTaskState>
601
595
 
602
596
  Properties:
603
597
 
604
- - `instanceId` stable ID assigned at construction, safe to use as a Map key before `start()`
605
- - `runId` engine-assigned run ID, available after the first `run_start` event (`null` until then)
606
- - `status` `'idle' | 'running' | 'done' | 'aborted' | 'failed'` (see `PipelineRunnerStatus`). `aborted` covers caller-initiated `abort()`; `failed` covers thrown engine errors and completed runs whose `EngineResult.success` is `false`.
598
+ - `instanceId` - stable ID assigned at construction, safe to use as a Map key before `start()`
599
+ - `runId` - engine-assigned run ID, available after the first `run_start` event (`null` until then)
600
+ - `status` - `'idle' | 'running' | 'done' | 'aborted' | 'failed'` (see `PipelineRunnerStatus`). `aborted` covers caller-initiated `abort()`; `failed` covers thrown engine errors and completed runs whose `EngineResult.success` is `false`.
607
601
 
608
602
  ### `TriggerBlockedError` / `TriggerTimeoutError`
609
603
 
@@ -676,7 +670,7 @@ export const HttpTrigger: TriggerPlugin = {
676
670
 
677
671
  Trigger `watch()` methods must return `{ fired, dispose }`: the engine awaits
678
672
  `fired` and calls `dispose()` on success, failure, task timeout, and pipeline
679
- abort. The schema is purely descriptive plugins still perform their own runtime validation. Supported field types: `string`, `number`, `boolean`, `enum`, `path`, `duration`, `number-or-list`, `command`, `json`. Each field can declare `required`, `default`, `description`, `enum`, `min`/`max`, `placeholder`. Built-in plugins (`file`/`manual` triggers; `exit_code`/`file_exists`/`output_check` completions; `static_context` middleware) all ship with schemas so editors can generate forms out of the box.
673
+ abort. The schema is purely descriptive - plugins still perform their own runtime validation. Supported field types: `string`, `number`, `boolean`, `enum`, `path`, `duration`, `number-or-list`, `command`, `json`. Each field can declare `required`, `default`, `description`, `enum`, `min`/`max`, `placeholder`. Built-in plugins (`file`/`manual` triggers; `exit_code`/`file_exists`/`output_check` completions; `static_context` middleware) all ship with schemas so editors can generate forms out of the box.
680
674
 
681
675
  ### `PluginRegistry.getHandler(category, type): PluginType`
682
676
 
@@ -692,7 +686,7 @@ Lists all registered handler type names for a plugin category (`'drivers'`, `'tr
692
686
 
693
687
  ### `resolveConfig(raw: RawPipelineConfig, workDir: string): PipelineConfig`
694
688
 
695
- Resolves a raw pipeline config into a fully resolved `PipelineConfig` applies inheritance (pipeline track task) for driver, model, permissions, and cwd. Validates and resolves all file paths against `workDir`.
689
+ Resolves a raw pipeline config into a fully resolved `PipelineConfig` - applies inheritance (pipeline -> track -> task) for driver, model, permissions, and cwd. Validates and resolves all file paths against `workDir`.
696
690
 
697
691
  Use `loadPipeline` for the common parse-and-resolve flow. Use `resolveConfig` directly when you need to manipulate the raw config between parsing and resolution.
698
692
 
@@ -706,7 +700,7 @@ Starts a WebSocket server for remote approval decisions.
706
700
 
707
701
  ### Config CRUD (`config-ops`)
708
702
 
709
- Pure, immutable helper functions for building and editing `RawPipelineConfig` in a visual editor. No runtime dependencies safe to use in renderer processes.
703
+ Pure, immutable helper functions for building and editing `RawPipelineConfig` in a visual editor. No runtime dependencies - safe to use in renderer processes.
710
704
 
711
705
  ```ts
712
706
  import {
@@ -741,11 +735,11 @@ const yaml = serializePipeline(config);
741
735
  | `moveTrack(config, trackId, toIndex)` | Reorder a track |
742
736
  | `updateTrack(config, trackId, fields)` | Patch track fields (not tasks) |
743
737
  | `upsertTask(config, trackId, task)` | Insert or replace a task |
744
- | `removeTask(config, trackId, taskId, cleanRefs?)` | Remove a task; pass `cleanRefs: true` to also strip dangling `depends_on` / `continue_from` / `inputs.from` references. Only refs that resolve to the deleted task are removed same-named tasks in other tracks are unaffected |
738
+ | `removeTask(config, trackId, taskId, cleanRefs?)` | Remove a task; pass `cleanRefs: true` to also strip dangling `depends_on` / `continue_from` / `inputs.from` references. Only refs that resolve to the deleted task are removed - same-named tasks in other tracks are unaffected |
745
739
  | `moveTask(config, trackId, taskId, toIndex)` | Reorder a task within its track |
746
740
  | `transferTask(config, fromTrackId, taskId, toTrackId, qualifyRefs?)` | Move a task across tracks (see invariants below) |
747
741
 
748
- `transferTask` invariants the call is a **no-op** (returns the input config unchanged) when:
742
+ `transferTask` invariants - the call is a **no-op** (returns the input config unchanged) when:
749
743
 
750
744
  - the target track doesn't exist, **or**
751
745
  - the target track already contains a task with the same id
@@ -757,11 +751,11 @@ When `qualifyRefs` is `true` (default), reference rewriting runs in two passes s
757
751
  - the **moved task's own** bare `depends_on`, `continue_from`, and `inputs.from` entries that pointed at siblings in the source track are rewritten to `fromTrackId.<dep>` (so they keep pointing at the original peers, not at coincidental same-named tasks in the destination track)
758
752
  - bare references **from other tasks** that resolved to the moved task are rewritten to `toTrackId.taskId` when same-track resolution would otherwise break (i.e. no shadow task exists in the referencing track and no other track still holds the bare id globally); this includes `depends_on`, `continue_from`, and `inputs.from`
759
753
 
760
- Pass `qualifyRefs: false` to skip both passes useful when the caller is doing a batch move and will requalify everything itself.
754
+ Pass `qualifyRefs: false` to skip both passes - useful when the caller is doing a batch move and will requalify everything itself.
761
755
 
762
756
  ### `parseYaml(content: string): RawPipelineConfig`
763
757
 
764
- Parses a YAML string and returns the raw (unresolved) pipeline config. Use this when you need to edit and re-save YAML without losing relative paths or user-authored formatting pass the result to `serializePipeline()` rather than going through `loadPipeline()`.
758
+ Parses a YAML string and returns the raw (unresolved) pipeline config. Use this when you need to edit and re-save YAML without losing relative paths or user-authored formatting - pass the result to `serializePipeline()` rather than going through `loadPipeline()`.
765
759
 
766
760
  ### `deresolvePipeline(config: PipelineConfig, workDir: string): RawPipelineConfig`
767
761
 
@@ -770,7 +764,7 @@ Converts a resolved `PipelineConfig` back to a `RawPipelineConfig` suitable for
770
764
  Use this when you have a programmatically modified resolved config and need to save it back to YAML:
771
765
 
772
766
  ```ts
773
- // Correct: load modify resolved config deresolve save
767
+ // Correct: load -> modify resolved config -> deresolve -> save
774
768
  const config = await loadPipeline(yaml, workDir);
775
769
  const modified = { ...config, name: 'renamed' };
776
770
  const savedYaml = serializePipeline(deresolvePipeline(modified, workDir));
@@ -783,13 +777,13 @@ const savedYaml = serializePipeline(updatedRaw);
783
777
 
784
778
  ### `validateConfig(config: PipelineConfig, workDir?: string): string[]`
785
779
 
786
- Validates a resolved pipeline config without executing it. Checks DAG structure (cycles, missing dependencies). When `workDir` is supplied, also validates that every track / task `cwd` resolves inside it (no `..` traversal, no absolute paths escaping the root); without `workDir`, cwd paths are not checked offline (the engine still rejects unsafe cwds at run time, but you do not get an offline diagnostic). Returns an array of error message strings empty means valid.
780
+ Validates a resolved pipeline config without executing it. Checks DAG structure (cycles, missing dependencies). When `workDir` is supplied, also validates that every track / task `cwd` resolves inside it (no `..` traversal, no absolute paths escaping the root); without `workDir`, cwd paths are not checked offline (the engine still rejects unsafe cwds at run time, but you do not get an offline diagnostic). Returns an array of error message strings - empty means valid.
787
781
 
788
782
  Use `validateRaw` for editing raw configs in a UI; pass `workDir` to `validateConfig` after `resolveConfig` for a final pre-run check that also covers cwd safety.
789
783
 
790
784
  ### Bindings API
791
785
 
792
- Pure helpers backing typed task bindings and internal prompt-contract inference. Safe to use in editors, simulators, and custom drivers no I/O, no side effects. Imported from `@tagma/sdk/dataflow`:
786
+ Pure helpers backing typed task bindings and internal prompt-contract inference. Safe to use in editors, simulators, and custom drivers - no I/O, no side effects. Imported from `@tagma/sdk/dataflow`:
793
787
 
794
788
  | Function | Description |
795
789
  | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -802,15 +796,15 @@ Pure helpers backing typed task bindings and internal prompt-contract inference.
802
796
 
803
797
  Prompt-document helpers (`prependContext`, `renderInputsBlock`, `renderOutputSchemaBlock`) live in `@tagma/core` and are not re-exported through any `@tagma/sdk` subpath. Custom drivers / engines that need them should `import { prependContext, renderInputsBlock, renderOutputSchemaBlock } from '@tagma/core'` directly.
804
798
 
805
- Custom drivers that wrap the prompt in their own envelope can read `DriverContext.inputs` (resolved + coerced map keyed by port name) and call `substituteInputs` themselves the engine has already substituted into `task.prompt` upstream, so most drivers can ignore this.
799
+ Custom drivers that wrap the prompt in their own envelope can read `DriverContext.inputs` (resolved + coerced map keyed by port name) and call `substituteInputs` themselves - the engine has already substituted into `task.prompt` upstream, so most drivers can ignore this.
806
800
 
807
801
  ### `validateRaw(config: RawPipelineConfig, knownTypes?: KnownPluginTypes): ValidationError[]`
808
802
 
809
- Validates a raw pipeline config without resolving inheritance or executing anything. Returns a flat list of `{ path, message, severity? }` objects empty array means valid. `severity` is `'error'` (default, fatal) or `'warning'` (soft hint; non-blocking).
803
+ Validates a raw pipeline config without resolving inheritance or executing anything. Returns a flat list of `{ path, message, severity? }` objects - empty array means valid. `severity` is `'error'` (default, fatal) or `'warning'` (soft hint; non-blocking).
810
804
 
811
- Checks: required fields, `prompt`/`command` exclusivity, duplicate task IDs within a track, `depends_on`/`continue_from` reference integrity (including ambiguous bare refs that exist in multiple tracks use `trackId.taskId` to disambiguate), circular dependency detection, binding shape (name format, valid `type`, duplicate names, `enum` requires non-empty `enum` array), `{{inputs.<name>}}` references resolving to a declared or inferred input binding, and `permissions` shape (must be an object with boolean `read`/`write`/`execute`). Tolerant of half-built configs non-array `tracks` or `tasks` produce a structured error instead of throwing.
805
+ Checks: required fields, `prompt`/`command` exclusivity, duplicate task IDs within a track, `depends_on`/`continue_from` reference integrity (including ambiguous bare refs that exist in multiple tracks - use `trackId.taskId` to disambiguate), circular dependency detection, binding shape (name format, valid `type`, duplicate names, `enum` requires non-empty `enum` array), `{{inputs.<name>}}` references resolving to a declared or inferred input binding, and `permissions` shape (must be an object with boolean `read`/`write`/`execute`). Tolerant of half-built configs - non-array `tracks` or `tasks` produce a structured error instead of throwing.
812
806
 
813
- Plugin-type checks are opt-in via `knownTypes`: when provided, references to trigger/completion/middleware/driver types that are neither built-in nor in the supplied set produce a **warning** (`severity: 'warning'`) so editors can light up uninstalled plugins without blocking save / run. Omit `knownTypes` for offline / pre-load validation no plugin warnings are emitted in that case.
807
+ Plugin-type checks are opt-in via `knownTypes`: when provided, references to trigger/completion/middleware/driver types that are neither built-in nor in the supplied set produce a **warning** (`severity: 'warning'`) so editors can light up uninstalled plugins without blocking save / run. Omit `knownTypes` for offline / pre-load validation - no plugin warnings are emitted in that case.
814
808
 
815
809
  Plugin **schemas** elevate the check from "type exists" to "type exists AND every config field matches the declared schema". Supply `knownTypes.schemas` (a `{ triggers, completions, middlewares }` map of `Record<typeName, PluginSchema | undefined>`) and `validateRaw` runs the same per-field guard core preflight runs at engine startup: a `timeout: "garbage"` on a `manual` trigger is reported at edit time, an out-of-enum `kind: "symlink"` on `file_exists` lights up before save, etc. Schema errors are returned as plain `error` (not `warning`) so editors block save on them just like other structural errors. Hosts collect schemas from the registry via `registry.getHandler(category, type).schema`.
816
810
 
@@ -833,7 +827,7 @@ errors.forEach((e) => highlightNode(e.path, e.message, e.severity ?? 'error'));
833
827
 
834
828
  ### `compileYamlContent(content: string, opts?: CompileYamlOptions): YamlCompileResult`
835
829
 
836
- One-shot YAML diagnostics for editor compile flows. Distinguishes **YAML syntax errors** (`parseOk: false`, `validation.errors` empty, `summary` starts with `"YAML parse error:"`) from **schema / structure errors** (`parseOk: true`, errors land in `validation.errors`). Half-built configs missing top-level `pipeline`, non-object `pipeline`, non-array `tracks` / `tasks`, malformed `permissions` surface as ordinary validation errors rather than parse failures or `"Validation crashed"` messages, so the editor never crashes on in-progress YAML.
830
+ One-shot YAML -> diagnostics for editor compile flows. Distinguishes **YAML syntax errors** (`parseOk: false`, `validation.errors` empty, `summary` starts with `"YAML parse error:"`) from **schema / structure errors** (`parseOk: true`, errors land in `validation.errors`). Half-built configs - missing top-level `pipeline`, non-object `pipeline`, non-array `tracks` / `tasks`, malformed `permissions` - surface as ordinary validation errors rather than parse failures or `"Validation crashed"` messages, so the editor never crashes on in-progress YAML.
837
831
 
838
832
  ```ts
839
833
  const result = compileYamlContent(yaml, {
@@ -854,27 +848,27 @@ if (!result.parseOk) {
854
848
  }
855
849
  ```
856
850
 
857
- `opts.knownTypes` is forwarded to `validateRaw` (see above) pass it when the host has loaded its plugin registry so unregistered plugin types light up as warnings; omit it for offline validation.
851
+ `opts.knownTypes` is forwarded to `validateRaw` (see above) - pass it when the host has loaded its plugin registry so unregistered plugin types light up as warnings; omit it for offline validation.
858
852
 
859
853
  `YamlCompileResult` shape: `{ timestamp, sourceName, success, parseOk, validation: { errors, warnings }, summary }`. `success` is `true` only when there are zero errors (warnings don't count). `validation.errors` and `validation.warnings` carry `{ path, message }` projections of the underlying `ValidationError` list.
860
854
 
861
855
  ### `buildRawDag(config: RawPipelineConfig): RawDag`
862
856
 
863
- Extracts the topology of a raw (unresolved) pipeline config as a graph no `workDir` or plugin registration required. Intended for the visual editor to render the flow graph during editing.
857
+ Extracts the topology of a raw (unresolved) pipeline config as a graph - no `workDir` or plugin registration required. Intended for the visual editor to render the flow graph during editing.
864
858
 
865
859
  Returns `{ nodes: ReadonlyMap<taskId, RawDagNode>, edges: { from, to }[] }` where each edge represents a dependency (from must complete before to). Unresolvable refs are silently skipped.
866
860
 
867
861
  ```ts
868
862
  const { nodes, edges } = buildRawDag(draftConfig);
869
- // nodes keyed by "trackId.taskId"
870
- // edges [{ from: "track.taskA", to: "track.taskB" }, ...]
863
+ // nodes - keyed by "trackId.taskId"
864
+ // edges - [{ from: "track.taskA", to: "track.taskB" }, ...]
871
865
  ```
872
866
 
873
867
  Use `buildDag` instead when you have a fully resolved `PipelineConfig` and need topological sort order.
874
868
 
875
869
  ### `Logger`
876
870
 
877
- Dual-channel logger console + file. Creates a per-run log file at `<workDir>/.tagma/logs/<runId>/pipeline.log`. `Logger` itself is exported from `@tagma/core` (not re-exported through `@tagma/sdk`); the Bun runtime's `logStore` provides the filesystem backing.
871
+ Dual-channel logger - console + file. Creates a per-run log file at `<workDir>/.tagma/logs/<runId>/pipeline.log`. `Logger` itself is exported from `@tagma/core` (not re-exported through `@tagma/sdk`); the Bun runtime's `logStore` provides the filesystem backing.
878
872
 
879
873
  ```ts
880
874
  import { bunRuntime } from '@tagma/sdk';
@@ -885,8 +879,8 @@ logger.info('[track]', 'message'); // console + file
885
879
  logger.warn('[track]', 'message'); // console + file
886
880
  logger.error('[track]', 'message'); // console + file
887
881
  logger.debug('[track]', 'message'); // file only
888
- logger.section('Title'); // file only visual separator
889
- logger.quiet(bulkText); // file only bulk payload
882
+ logger.section('Title'); // file only - visual separator
883
+ logger.quiet(bulkText); // file only - bulk payload
890
884
  logger.path; // log file path
891
885
  logger.dir; // run artifact directory
892
886
  logger.close(); // close the persistent file handle (called automatically when Tagma.run completes)
@@ -908,7 +902,7 @@ const logger = new Logger(workDir, runId, bunRuntime().logStore, (record: LogRec
908
902
  ```
909
903
 
910
904
  `section` and `quiet` carry no prefix, so pass an explicit `taskId` when the
911
- line logically belongs to a task the extractor cannot infer one otherwise:
905
+ line logically belongs to a task - the extractor cannot infer one otherwise:
912
906
 
913
907
  ```ts
914
908
  logger.section(`Task ${taskId}`, taskId);
@@ -921,7 +915,7 @@ Returns the last `n` non-empty lines of `text`, joined with newlines. Imported f
921
915
 
922
916
  ### `clip(text: string, maxBytes?: number): string`
923
917
 
924
- Truncates `text` to at most `maxBytes` UTF-8 bytes (default 16 KB), appending a `…[truncated N bytes]` marker when truncation occurs. Multi-byte characters (CJK, emoji) are counted correctly. Imported from `@tagma/core` (not re-exported through `@tagma/sdk`).
918
+ Truncates `text` to at most `maxBytes` UTF-8 bytes (default 16 KB), appending a `...truncated N bytes]` marker when truncation occurs. Multi-byte characters (CJK, emoji) are counted correctly. Imported from `@tagma/core` (not re-exported through `@tagma/sdk`).
925
919
 
926
920
  ### Utilities
927
921
 
@@ -929,7 +923,7 @@ Imported from `@tagma/sdk/utils`:
929
923
 
930
924
  | Function | Description |
931
925
  | ------------------------------------- | --------------------------------------------------------- |
932
- | `parseDuration(input)` | Parses `"30s"`, `"5m"`, `"2h"` milliseconds |
926
+ | `parseDuration(input)` | Parses `"30s"`, `"5m"`, `"2h"` -> milliseconds |
933
927
  | `validatePath(filePath, projectRoot)` | Resolves path, throws if it escapes project root |
934
928
  | `generateRunId()` | Generates a unique run ID (`run_<ts>_<seq>_<rand>`) |
935
929
  | `nowISO()` | Returns `new Date().toISOString()` |
@@ -1,51 +1,4 @@
1
1
  import type { PluginRegistry } from '@tagma/core';
2
- /**
3
- * Safe-mode built-ins: plugins that do not execute arbitrary code or shell
4
- * commands. These are registered with `{ safeMode: true }` and are available
5
- * under `mode: 'safe'` pipelines without explicit allowlist entries.
6
- */
7
- export declare const SafeBuiltinTagmaPlugin: {
8
- name: string;
9
- capabilities: {
10
- drivers: {
11
- opencode: import("@tagma/types").DriverPlugin;
12
- };
13
- triggers: {
14
- directory: import("@tagma/types").TriggerPlugin;
15
- file: import("@tagma/types").TriggerPlugin;
16
- manual: import("@tagma/types").TriggerPlugin;
17
- };
18
- completions: {
19
- exit_code: import("@tagma/types").CompletionPlugin;
20
- file_exists: import("@tagma/types").CompletionPlugin;
21
- };
22
- middlewares: {
23
- static_context: import("@tagma/types").MiddlewarePlugin;
24
- };
25
- };
26
- };
27
- /**
28
- * Unsafe built-ins: plugins that execute arbitrary shell commands and must
29
- * NOT be in the safe-mode allowlist. These require explicit caller opt-in
30
- * via `safeModeAllowlist` or `mode: 'trusted'`.
31
- *
32
- * `output_check` pipes task output into a user-specified shell command,
33
- * which is a direct command-execution vector. Including it in safe mode
34
- * would bypass the safe-mode intent that blocks command execution.
35
- */
36
- export declare const UnsafeBuiltinTagmaPlugin: {
37
- name: string;
38
- capabilities: {
39
- completions: {
40
- output_check: import("@tagma/types").CompletionPlugin;
41
- };
42
- };
43
- };
44
- /**
45
- * Combined built-in plugin bundle for backward compatibility. Includes both
46
- * safe and unsafe plugins. Use `bootstrapBuiltins()` to register with
47
- * proper safe-mode scoping.
48
- */
49
2
  export declare const BuiltinTagmaPlugin: {
50
3
  name: string;
51
4
  capabilities: {
@@ -58,9 +11,9 @@ export declare const BuiltinTagmaPlugin: {
58
11
  manual: import("@tagma/types").TriggerPlugin;
59
12
  };
60
13
  completions: {
61
- output_check: import("@tagma/types").CompletionPlugin;
62
14
  exit_code: import("@tagma/types").CompletionPlugin;
63
15
  file_exists: import("@tagma/types").CompletionPlugin;
16
+ output_check: import("@tagma/types").CompletionPlugin;
64
17
  };
65
18
  middlewares: {
66
19
  static_context: import("@tagma/types").MiddlewarePlugin;
@@ -72,17 +25,6 @@ export declare const BuiltinTagmaPlugin: {
72
25
  * PluginRegistry per workspace or SDK instance and call this once per
73
26
  * instance so each workspace sees the same built-ins without sharing
74
27
  * registration state.
75
- *
76
- * Built-in handlers are stateless module singletons — registering the same
77
- * handler object into N registries is cheap and safe; no cloning is needed.
78
- *
79
- * Safe built-ins register with `{ safeMode: true }` so they are automatically
80
- * available under `mode: 'safe'` pipelines without explicit allowlist entries.
81
- * Unsafe built-ins (output_check, which executes arbitrary shell commands)
82
- * register WITHOUT safeMode, requiring explicit caller opt-in.
83
- *
84
- * The registry's `getSafeModeDefaults()` surfaces these to the engine's 3-way
85
- * safe-mode merge (hardcoded defaults ∪ registry-declared ∪ caller-supplied).
86
28
  */
87
29
  export declare function bootstrapBuiltins(target: PluginRegistry): void;
88
30
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuBlD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;CAmBZ,CAAC;AAExB;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB;;;;;;;CAOd,CAAC;AAExB;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;CAWR,CAAC;AAExB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAG9D"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAuBlD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;CAoBR,CAAC;AAExB;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAE9D"}