@deepseek-ai/dsh-tool-cordis 0.2.2-alpha.2 → 0.2.2-alpha.3

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 (2) hide show
  1. package/lib/types/api-catalog.js +287 -115
  2. package/package.json +17 -17
@@ -922,15 +922,15 @@ export const SERVICE_API = [
922
922
  returns: 'Optional native PNG icons keyed by executable path; applications without paths are skipped.',
923
923
  },
924
924
  {
925
- signature: '@Remote async requestPermission(permission: CuaSystemPermission): Promise<CuaSystemPermissionState>',
926
- description: 'Request a system privilege explicitly selected by the user.',
927
- parameters: [{ name: 'permission', description: 'macOS privilege to request.' }],
928
- returns: 'Preflight state after requesting; a false value never implies consent.',
925
+ signature: '@Remote async requestPermission(permission: CuaSystemPermission, locale: string): Promise<CuaSystemPermissionState>',
926
+ description: 'Request the selected system privilege through the native provider.',
927
+ parameters: [{ name: 'permission', description: 'macOS privilege to request.' }, { name: 'locale', description: 'Current Client language for provider-owned permission UI.' }],
928
+ returns: 'Current permission observations; requesting does not establish consent.',
929
929
  },
930
930
  {
931
- signature: '@Remote async openSettings(permission: CuaSystemPermission): Promise<void>',
931
+ signature: '@Remote async openSettings(permission: CuaSystemPermission, locale: string): Promise<void>',
932
932
  description: 'Open the macOS privacy pane selected by the user.',
933
- parameters: [{ name: 'permission', description: 'Corresponding system privilege.' }],
933
+ parameters: [{ name: 'permission', description: 'Corresponding system privilege.' }, { name: 'locale', description: 'Current Client language for provider-owned recovery instructions.' }],
934
934
  returns: 'Completion after macOS accepted the open request.',
935
935
  },
936
936
  {
@@ -1209,6 +1209,13 @@ export const SERVICE_API = [
1209
1209
  returns: 'undefined once the host merged it, or why it did not.',
1210
1210
  throws: ['when no provider serves the change request\'s forge, or with `signal.reason` when it aborts.'],
1211
1211
  },
1212
+ {
1213
+ signature: 'async fetchChecks(ref: ChangeRequestRef, signal: AbortSignal): Promise<ChangeRequestSnapshot | ForgeFailure>',
1214
+ description: 'Read complete check details independently of periodic polling.',
1215
+ parameters: [{ name: 'ref', description: 'change request served by a registered provider.' }, { name: 'signal', description: 'cancellation of the detail view.' }],
1216
+ returns: 'a complete snapshot or the provider\'s failure; unsupported providers return unavailable.',
1217
+ throws: ['on cancellation, provider disposal, or expiry of this read\'s own `fetchTimeoutMs` deadline.'],
1218
+ },
1212
1219
  {
1213
1220
  signature: 'async diff(ref: ChangeRequestRef, signal: AbortSignal): Promise<string | ForgeFailure>',
1214
1221
  description: 'Read the changes of a change request as its host computes them.',
@@ -1216,6 +1223,12 @@ export const SERVICE_API = [
1216
1223
  returns: 'one unified patch with `a/` and `b/` path prefixes, or why the host did not provide it.',
1217
1224
  throws: ['when no provider serves the change request\'s forge, or with `signal.reason` when it aborts.'],
1218
1225
  },
1226
+ {
1227
+ signature: 'async submitReview(ref: ChangeRequestRef, request: ForgeReviewRequest, signal: AbortSignal): Promise<ForgeReviewResult>',
1228
+ description: 'Publish one comment or a completed review, then refresh the watched status.',
1229
+ parameters: [{ name: 'ref', description: 'change request served by a registered provider.' }, { name: 'request', description: 'explicitly selected commit, comments, and review decision.' }, { name: 'signal', description: 'request cancellation.' }],
1230
+ returns: 'a publication URL or a failure, including an unknown write outcome.',
1231
+ },
1219
1232
  {
1220
1233
  signature: 'async fileText(ref: ChangeRequestRef, commit: string, path: string, signal: AbortSignal): Promise<string | ForgeFailure>',
1221
1234
  description: 'Read the text of one file at a commit of a change request\'s repository.',
@@ -1252,7 +1265,7 @@ export const SERVICE_API = [
1252
1265
  {
1253
1266
  key: 'forgePanel',
1254
1267
  summary: 'Serves the forge panel.',
1255
- description: 'Serves the forge panel. Following a Session inspects the checkout of its current directory read-only in the Session\'s execution world, recognizes the code host of the upstream remote or `origin`, probes sign-in for that host, and polls the Session\'s bound change requests through `ctx.forge` until the last follower of that Session leaves. A worktree request makes the panel create a branch and checkout through an optional `ctx.worktrees` and enter it while the Session\'s first message waits in the inbox, or at the first step proposal of a message no wait took. After a failed or stopped attempt the message keeps waiting for another attempt or for the request to be withdrawn. A message also waits while the worktree the Session works in is gone, until that worktree is checked out again or left for the source checkout. Changes to a Session\'s checkout run as Agent maintenance, so a message that arrives meanwhile waits for them.',
1268
+ description: 'Serves the forge panel. Following a Session inspects the checkout of its current directory using the Session\'s permissions and execution world, recognizes the code host of the upstream remote or `origin`, probes sign-in for that host, and polls the Session\'s bound change requests through `ctx.forge` until the last follower of that Session leaves. A worktree request makes the panel create a branch and checkout through an optional `ctx.worktrees` and enter it while the Session\'s first message waits in the inbox, or at the first step proposal of a message no wait took. After a failed or stopped attempt the message keeps waiting for another attempt or for the request to be withdrawn. A message also waits while the worktree the Session works in is gone, until that worktree is checked out again or left for the source checkout. Changes to a Session\'s checkout run as Agent maintenance, so a message that arrives meanwhile waits for them.',
1256
1269
  methods: [
1257
1270
  {
1258
1271
  signature: '@Remote({ mode: \'stream\' }) async *follow(session: Session, signal: AbortSignal): AsyncIterable<ForgePanelState>',
@@ -1293,10 +1306,10 @@ export const SERVICE_API = [
1293
1306
  },
1294
1307
  {
1295
1308
  signature: '@Remote async localDiff(session: Session, scope: ForgeLocalScope, signal: AbortSignal): Promise<ForgeLocalDiff>',
1296
- description: 'Read the changes one scope covers in the checkout of the Session\'s current directory, with Git confined to the Session\'s read-only sandbox.',
1309
+ description: 'Read the changes one scope covers in the checkout of the Session\'s current directory, with Git using the Session\'s sandbox policy.',
1297
1310
  parameters: [{ name: 'session', description: 'Session whose checkout is read.' }, { name: 'scope', description: 'which changes to read.' }, { name: 'signal', description: 'request cancellation.' }],
1298
1311
  returns: 'the files, the base of the `branch` scope, and the untracked files left out.',
1299
- throws: ['`forgePanel/not-a-checkout` outside a checkout; `forgePanel/no-fork-point` for the `branch` scope of a checkout without one; `forgePanel/diff-too-large` over `maxDiffBytes`; the Git error when Git fails.'],
1312
+ throws: ['`forgePanel/not-a-checkout` outside a checkout; `forgePanel/no-fork-point` for the `branch` scope of a checkout without one; `forgePanel/filter-config-failed` when filter configuration cannot be read completely, before any comparison; `forgePanel/diff-too-large` over `maxDiffBytes`; the Git error when Git fails.'],
1300
1313
  },
1301
1314
  {
1302
1315
  signature: '@Remote async localText(session: Session, scope: ForgeLocalScope, path: string, signal: AbortSignal): Promise<string>',
@@ -1305,6 +1318,13 @@ export const SERVICE_API = [
1305
1318
  returns: 'the text.',
1306
1319
  throws: ['`forgePanel/not-a-checkout` outside a checkout; `forgePanel/diff-too-large` over `maxDiffBytes`; an error for a path outside the checkout, binary content, or a failed read.'],
1307
1320
  },
1321
+ {
1322
+ signature: '@Remote async changeRequestChecks(session: Session, url: string, headSha: string, signal: AbortSignal): Promise<ChangeRequestSnapshot>',
1323
+ description: 'Load complete checks for the change request whose list the user opened.',
1324
+ parameters: [{ name: 'session', description: 'Session retaining the visible binding.' }, { name: 'url', description: 'binding URL.' }, { name: 'headSha', description: 'commit displayed by the card; a different head rejects the result.' }, { name: 'signal', description: 'cancellation when the list closes.' }],
1325
+ returns: 'the complete snapshot at the displayed head.',
1326
+ throws: ['`forgePanel/not-bound` for an invisible binding, `forgePanel/stale-head` for a moved head, or `forgePanel/checks-failed` when the provider cannot complete the read.'],
1327
+ },
1308
1328
  {
1309
1329
  signature: '@Remote async changeRequestDiff(session: Session, url: string, signal: AbortSignal): Promise<ForgeChangeRequestDiff>',
1310
1330
  description: 'Read the changes of a change request of a Session as its code host computes them, at the head commit of its latest status. A patch already read at the same head commit and base branch is reused from memory, for any Session, until `maxCachedDiffBytes` evicts it.',
@@ -1319,6 +1339,12 @@ export const SERVICE_API = [
1319
1339
  returns: 'the text.',
1320
1340
  throws: ['`forgePanel/not-bound` unless the URL is a visible binding of the Session that a provider serves; `forgePanel/diff-too-large` when the host or its provider refuses the file over a size limit; `forgePanel/diff-failed` when the host does not provide the file otherwise.'],
1321
1341
  },
1342
+ {
1343
+ signature: '@Remote async submitReview(session: Session, url: string, request: ForgeReviewRequest, signal: AbortSignal): Promise<ForgeReviewResult>',
1344
+ description: 'Publish a line comment or completed review for a visible Session binding.',
1345
+ parameters: [{ name: 'session', description: 'Session retaining the change request.' }, { name: 'url', description: 'visible binding URL.' }, { name: 'request', description: 'reviewed head, ranges, plain text, and explicit review decision.' }, { name: 'signal', description: 'request cancellation.' }],
1346
+ returns: 'confirmed publication or a typed failure; unknown outcomes require reconciliation on the host.',
1347
+ },
1322
1348
  {
1323
1349
  signature: '@Remote async markReady(session: Session, url: string, signal: AbortSignal): Promise<void>',
1324
1350
  description: 'Mark a draft change request of a Session ready for review; the change request is polled again once the host answers.',
@@ -1407,7 +1433,7 @@ export const SERVICE_API = [
1407
1433
  {
1408
1434
  key: 'fs',
1409
1435
  summary: 'Abstract filesystem provider.',
1410
- description: 'Abstract filesystem provider. Targets must preserve identity across aliases; reads expose regular UTF-8 text or typed errors, listings are stable and content-free, and mutations are atomic. Optional guards add stale protection without changing the unguarded provider contract.',
1436
+ description: 'Abstract filesystem provider. Targets must preserve identity across aliases; reads expose regular UTF-8 text or typed errors, listings are stable and content-free, and single-file publication is atomic. Moves can retain their source after publishing the destination. Optional guards add stale protection without changing the unguarded provider contract.',
1411
1437
  methods: [
1412
1438
  {
1413
1439
  signature: 'watch(target: FsTarget, changed: (error?: Error) => void, signal: AbortSignal): Promise<() => Promise<void>>',
@@ -1500,6 +1526,24 @@ export const SERVICE_API = [
1500
1526
  parameters: [{ name: 'target', description: 'the resolved target to edit.' }, { name: 'edit', description: 'the literal search/replace request.' }, { name: 'expected', description: 'the version guard; omit for an unconditional edit.' }, { name: 'signal', description: 'aborts before atomic publication takes effect.' }, { name: 'sandboxPolicy', description: 'the per-call mode and workspace root this edit runs under; a sandboxing backend fences the edit by it, the bare backend ignores it. Omit to leave the backend its own default.' }],
1501
1527
  returns: 'the outcome, including the version the edit produced.',
1502
1528
  },
1529
+ {
1530
+ signature: 'abstract patchText( target: FsTarget, hunks: readonly PatchHunk[], expected?: { version: FsVersion }, signal?: AbortSignal, sandboxPolicy?: SandboxExecutionPolicy, ): Promise<FsEditOutcome>',
1531
+ description: 'Atomically apply parsed hunks to the LF-normalized text and restore the stored line-ending style. A missing or stale target reports `FS_STALE_VERSION`; an unmatched hunk reports `FS_PATCH_MISMATCH`.',
1532
+ parameters: [{ name: 'target', description: 'the resolved regular file to patch.' }, { name: 'hunks', description: 'ordered hunks from `parsePatch`.' }, { name: 'expected', description: 'the version guard; omit for an unconditional patch.' }, { name: 'signal', description: 'aborts before atomic publication takes effect.' }, { name: 'sandboxPolicy', description: 'the per-call mode and workspace root this patch runs under; a sandboxing backend fences the patch by it, the bare backend ignores it. Omit to leave the backend its own default.' }],
1533
+ returns: 'the outcome, including the version the patch produced.',
1534
+ },
1535
+ {
1536
+ signature: 'abstract deleteFile( target: FsTarget, expected?: { version: FsVersion }, signal?: AbortSignal, sandboxPolicy?: SandboxExecutionPolicy, ): Promise<FsDeleteOutcome>',
1537
+ description: 'Remove a regular file. A missing or stale target reports `FS_STALE_VERSION`; a directory or other non-file reports `FS_NOT_REGULAR_FILE`. Resolution has already followed symlinks, so the target is the real file.',
1538
+ parameters: [{ name: 'target', description: 'the resolved file to remove.' }, { name: 'expected', description: 'the version guard; omit for an unconditional removal.' }, { name: 'signal', description: 'aborts before removal.' }, { name: 'sandboxPolicy', description: 'the per-call mode and workspace root this removal runs under; a sandboxing backend fences it, the bare backend ignores it. Omit to leave the backend its own default.' }],
1539
+ returns: 'the bounded LF-normalized removed text, or null when no basis is available.',
1540
+ },
1541
+ {
1542
+ signature: 'abstract moveFile( source: FsTarget, destination: FsTarget, options: { hunks?: readonly PatchHunk[] expectedSource?: { version: FsVersion } expectedDestination?: FsWriteIntent }, signal?: AbortSignal, sandboxPolicy?: SandboxExecutionPolicy, ): Promise<FsMoveOutcome>',
1543
+ description: 'Publish the source text, optionally patched, at the destination, then remove the source. Both targets stay locked in canonical order. Identical targets report `FS_SAME_TARGET`; the source guard follows `patchText` and the destination guard follows `writeText`. The two effects are separate: a published destination with a retained source is a final outcome reported through `sourceDeleted: false`.',
1544
+ parameters: [{ name: 'source', description: 'the resolved regular source; its line-ending style and mode carry over.' }, { name: 'destination', description: 'the resolved destination within the same provider.' }, { name: 'options', description: 'optional hunks and the source/destination guards; an omitted guard is unconditional.' }, { name: 'signal', description: 'checked before destination staging; the commit then completes both effects.' }, { name: 'sandboxPolicy', description: 'the per-call mode and workspace root both paths run under; a sandboxing backend fences them, the bare backend ignores it. Omit to leave the backend its own default.' }],
1545
+ returns: 'the bounded LF source basis, the destination outcome, and the source-removal status.',
1546
+ },
1503
1547
  ],
1504
1548
  },
1505
1549
  {
@@ -2184,7 +2228,7 @@ export const SERVICE_API = [
2184
2228
  },
2185
2229
  {
2186
2230
  signature: '@Remote installBundle(spec: string, options?: InstallBundleOptions): Promise<ChangeResult>',
2187
- description: 'Install a package using the same pnpm implementation as dsh plugin. GitHub repositories get a connection check bounded by githubConnectionTimeoutMs before pnpm starts; only network failures or timeouts stop installation, while pnpm owns authentication and transport fallback. An HTTP(S) Git URL on another host is installed over SSH instead when access probes bounded by gitTransportTimeoutMs find that only SSH can read it. A run that fails, is cancelled, or adds a package without a bundle patch restores `package.json` and `pnpm-lock.yaml` as they were; downloaded files can stay.',
2231
+ description: 'Install a package using the same pnpm implementation as dsh plugin. GitHub repositories get a connection check bounded by githubConnectionTimeoutMs before pnpm starts; only network failures or timeouts stop installation, and a stop streams the check\'s diagnostic as the installation\'s install-log run under its request id, while pnpm owns authentication and transport fallback. An HTTP(S) Git URL on another host is installed over SSH instead when access probes bounded by gitTransportTimeoutMs find that only SSH can read it. A run that fails, is cancelled, or adds a package without a bundle patch restores `package.json` and `pnpm-lock.yaml` as they were; downloaded files can stay.',
2188
2232
  parameters: [{ name: 'spec', description: 'One package spec, including local paths relative to the invocation directory.' }, { name: 'options', description: 'Whether to activate the installed bundle (defaults to true), the request id a cancellation names, the pending build scripts to allow, whether to save an exact dependency, and the registry asked first.' }],
2189
2233
  returns: 'Package-manager diagnostics, the registries asked, and the observed activation outcome.',
2190
2234
  },
@@ -2468,51 +2512,86 @@ export const SERVICE_API = [
2468
2512
  },
2469
2513
  {
2470
2514
  key: 'schedule',
2471
- summary: 'Shared management service; reads, deletion, and timing edits never activate a Session.',
2472
- description: 'Shared management service; reads, deletion, and timing edits never activate a Session.\n\n`sessionPersistence` is a load-order requirement rather than a directly called service: a delivery commits only when `ctx.sessions.flush()` reports that a `session/flush` listener participated, and the persistence backend providing this service is the plugin that registers that listener.',
2515
+ summary: 'Shared management service; reads and management writes never activate a Session, and only delivery creates or resumes one.',
2516
+ description: 'Shared management service; reads and management writes never activate a Session, and only delivery creates or resumes one.\n\n`sessionPersistence` supplies header-only target validation and the `session/flush` listener that acknowledges durable inbox delivery through `ctx.sessions.flush()`.',
2473
2517
  methods: [
2474
2518
  {
2475
- signature: 'async create(sessionId: SessionId, request: ScheduleCreateRequest, signal?: AbortSignal): Promise<ScheduleRecord>',
2476
- description: 'Create a reminder bound to the caller-selected Session without activating it.\n\nThe request must supply a title; a missing, blank-after-trim, or over-long title rejects with `invalid_prompt` instead of deriving one from the prompt. A Session a delegated child owns rejects with `subagent_session`, because delivery can never reach it: the child is one whose delegation depth is above zero. The record is built from the clock reading taken before the request joins the serialized queue, so a create that waits behind a longer operation keeps its request-time anchor and may already be due when the queue reaches it.',
2477
- parameters: [{ name: 'sessionId', description: 'Original Session receiving the reminder.' }, { name: 'request', description: 'Validated tool selector, required title, and reminder content.' }, { name: 'signal', description: 'Optional cancellation checked before persistence begins, including after FIFO waits.' }],
2478
- returns: 'The durably stored schedule. Cancellation does not roll back an in-flight write.',
2519
+ signature: '@Remote(\'deliveryLimits\') deliveryLimits(): { readonly newSessionIntervalSeconds: number }',
2520
+ description: 'Read effective delivery limits without loading or activating a task.',
2521
+ parameters: [],
2522
+ returns: 'The configured minimum spacing between deliveries that each create a Session, in seconds.',
2523
+ },
2524
+ {
2525
+ signature: '@Remote(\'create\') async remoteCreate(request: ScheduleCreateRequest, signal?: AbortSignal): Promise<ScheduleCatalogEntry>',
2526
+ description: 'Create one task with a Host-generated identity for a human Remote caller.',
2527
+ parameters: [{ name: 'request', description: 'Title, prompt, recurrence, and delivery destination.' }, { name: 'signal', description: 'Cancellation checked before the durable write begins, including after FIFO waits.' }],
2528
+ returns: 'The stored task. Cancellation does not roll back an in-flight write.',
2529
+ },
2530
+ {
2531
+ signature: 'async create( request: ScheduleCreateRequest, actorSessionId?: SessionId, signal?: AbortSignal, ): Promise<ScheduleCatalogEntry>',
2532
+ description: 'Create one task and record the acting Agent\'s Session as involved; the Remote form omits that Session.\n\nThe record is built from the clock reading taken before the request joins the serialized queue. A `session` target must exist and must not belong to a delegated child; a `new_once` target reserves its Session identity.',
2533
+ parameters: [{ name: 'request', description: 'Title, prompt, recurrence, and delivery destination.' }, { name: 'actorSessionId', description: 'Session of the acting Agent, or undefined for a human caller.' }, { name: 'signal', description: 'Cancellation checked before the durable write begins, including after FIFO waits.' }],
2534
+ returns: 'The stored task. Cancellation does not roll back an in-flight write.',
2535
+ },
2536
+ {
2537
+ signature: 'async list(request: ScheduleListRequest = {}): Promise<ScheduleListResult>',
2538
+ description: 'Read one page of Host tasks without activating target Sessions.',
2539
+ parameters: [{ name: 'request', description: 'Optional activity filter, page size, and offset.' }],
2540
+ returns: 'The requested page and total matching task count.',
2479
2541
  },
2480
2542
  {
2481
- signature: '@Remote(\'list\') async list(request: ScheduleListRequest): Promise<ScheduleRecord[]>',
2482
- description: 'Read the selected Session\'s active tasks without resuming its Agent.',
2483
- parameters: [{ name: 'request', description: 'Session whose task list is requested.' }],
2484
- returns: 'Persisted reminders in storage order.',
2543
+ signature: '@Remote(\'list\') async remoteList(request: ScheduleListRequest): Promise<ScheduleListResult>',
2544
+ description: 'Remote form of the shared Host-wide list.',
2545
+ parameters: [{ name: 'request', description: 'Optional activity filter, page size, and offset.' }],
2546
+ returns: 'The requested page and total matching task count.',
2485
2547
  },
2486
2548
  {
2487
2549
  signature: '@Remote(\'catalog\') async catalog(): Promise<ScheduleCatalogEntry[]>',
2488
- description: 'Read all active and inactive Host reminders with their original Session bindings. A deleted reminder has no row, so it is absent here. Does not activate Sessions or read Session history.',
2550
+ description: 'Read every Host task without a page bound or Session activation.',
2489
2551
  parameters: [],
2490
- returns: 'Reminders ordered by scheduledAt ascending, then lexicographically by id.',
2552
+ returns: 'All tasks, active first, with target and execution metadata.',
2491
2553
  },
2492
2554
  {
2493
- signature: '@Remote(\'history\') async history(request: ScheduleDeliveryHistoryRequest): Promise<ScheduleDeliveryHistoryResult>',
2494
- description: 'Read saved inbox deliveries without activating or reading the original Session. The task\'s own row supplies its binding, so its records stay readable through this lookup.',
2495
- parameters: [{ name: 'request', description: 'Session binding, task identity, explicit limit, and optional exclusive message cursor.' }],
2555
+ signature: '@Remote(\'view\') async view(request: ScheduleViewRequest): Promise<ScheduleViewResult>',
2556
+ description: 'Read one task without activating its target Sessions.',
2557
+ parameters: [{ name: 'request', description: 'Task identity.' }],
2558
+ returns: 'The task, or a non-mutating miss.',
2559
+ },
2560
+ {
2561
+ signature: 'async history(request: ScheduleDeliveryHistoryRequest): Promise<ScheduleDeliveryHistoryResult>',
2562
+ description: 'Read one page of saved deliveries without activating or reading a target Session.',
2563
+ parameters: [{ name: 'request', description: 'Task identity, explicit page size, and optional exclusive cursor.' }],
2564
+ returns: 'Newest-first saved deliveries, or a task/cursor lookup failure.',
2565
+ },
2566
+ {
2567
+ signature: '@Remote(\'history\') async remoteHistory(request: ScheduleDeliveryHistoryRequest): Promise<ScheduleDeliveryHistoryResult>',
2568
+ description: 'Remote form of the target-based ScheduleService.history; an invalid limit rejects with `schedule/input-invalid`.',
2569
+ parameters: [{ name: 'request', description: 'Task identity, explicit limit, and optional exclusive message cursor.' }],
2496
2570
  returns: 'Newest-first deliveries in append order, or a task/cursor lookup failure.',
2497
- throws: ['ScheduleInputError when limit is not a safe integer from 1 through 100.'],
2498
2571
  },
2499
2572
  {
2500
- signature: '@Remote(\'delete\') async delete(request: ScheduleDeleteRequest, signal?: AbortSignal): Promise<ScheduleDeleteResult>',
2501
- description: 'Delete one task belonging to the selected Session, leaving queued messages intact.\n\nThe row is removed: the task no longer schedules, leaves `list` and `catalog`, and its saved delivery records go with it. A task bound to a Session a delegated child owns stays deletable even though creation and timing edits refuse that binding, so a task stored before that rule existed remains removable.',
2502
- parameters: [{ name: 'request', description: 'Session and exact task identity.' }, { name: 'signal', description: 'Optional cancellation checked before persistence begins, including after FIFO waits.' }],
2503
- returns: 'Whether that Session owned a deleted task. Cancellation does not roll back an in-flight write.',
2573
+ signature: '@Remote(\'run\') async run(request: ScheduleRunRequest, signal?: AbortSignal): Promise<ScheduleRunResult>',
2574
+ description: 'Deliver one task now without consuming or moving its scheduled occurrence; an archived destination Session rejects with `schedule/target-archived`.',
2575
+ parameters: [{ name: 'request', description: 'Task identity.' }, { name: 'signal', description: 'Cancellation checked after entering the delivery transaction and before delivery.' }],
2576
+ returns: 'Task state after Session persistence acknowledged the delivery, `schedule_execution_pending` while another execution of the task is queued, running, or inside its delivery floor, or a non-mutating miss.',
2504
2577
  },
2505
2578
  {
2506
2579
  signature: '@Remote(\'deleteInactive\') async deleteInactive(): Promise<ScheduleDeleteInactiveResult>',
2507
- description: 'Delete every ended Host task, leaving active tasks armed.\n\nEnded tasks never schedule another delivery, so the removal changes no pending target and no timer is recomputed. Rows are enumerated and removed in one FIFO slot, so a delivery ordered behind this call ends its task after the enumeration rather than during it. The batch is one domain write: a normal failure rejects with every listed row still stored, while a backend `unknown-state` failure may have removed rows and quarantines the Host domain, so later schedule operations reject until the domain is reopened. Every rejection announces `schedule/changed` because it does not establish which rows landed, and clients then re-read the catalog.',
2580
+ description: 'Delete every ended Host task, leaving active tasks armed.\n\nEnded tasks never schedule another delivery, so the removal changes no pending target and no timer is recomputed. Rows are enumerated and removed in one FIFO slot, so a delivery ordered behind this call ends its task after the enumeration rather than during it. The batch is one domain write: a normal failure rejects with every listed row still stored, while a backend `unknown-state` failure may have removed rows and quarantines the Host domain, so later schedule operations reject until the domain is reopened. A successful nonempty batch emits `schedule/changed` without Agent notices. A rejected batch announces `schedule/changed` because it does not establish which rows landed, and clients then re-read the catalog.',
2508
2581
  parameters: [],
2509
2582
  returns: 'Count of removed rows; zero when the Host held no ended task.',
2510
2583
  },
2511
2584
  {
2512
- signature: '@Remote(\'update\') async update(request: ScheduleUpdateRequest, signal?: AbortSignal): Promise<ScheduleUpdateResult>',
2513
- description: 'Update the name, instruction, and timing of an active task within the original Session binding without activating the Session or changing saved deliveries.\n\nEach supplied field replaces its stored value; an omitted field keeps it. A name or instruction change alone does not reset the committed target. A Session a delegated child owns returns the non-mutating `subagent_session` result, so an edit cannot re-arm a task bound to a Session delivery can never reach, and the Web editor can explain the refusal through the ordinary result it already renders.',
2514
- parameters: [{ name: 'request', description: 'Task binding, complete observed record, and any combination of timing, name, and instruction.' }, { name: 'signal', description: 'Cancellation checked after domain readiness and FIFO waits, before persistence begins.' }],
2515
- returns: 'The committed record, unchanged record for a no-op, or a non-mutating input/lookup/conflict/refusal result. Storage and lifecycle failures reject; cancellation after a write starts does not roll it back.',
2585
+ signature: '@Remote(\'edit\') async remoteEdit(request: ScheduleEditRequest, signal?: AbortSignal): Promise<ScheduleEditResult>',
2586
+ description: 'Update or delete one task for a human Remote caller; an invalid patch rejects with `schedule/input-invalid`.',
2587
+ parameters: [{ name: 'request', description: 'Task identity and one update or delete operation.' }, { name: 'signal', description: 'Cancellation checked before the durable write begins, including after FIFO waits.' }],
2588
+ returns: 'The updated task, the deletion outcome, or a non-mutating miss or conflict.',
2589
+ },
2590
+ {
2591
+ signature: 'async edit( request: ScheduleEditRequest, actorSessionId?: SessionId, signal?: AbortSignal, ): Promise<ScheduleEditResult>',
2592
+ description: 'Update or delete one task and record the acting Agent\'s Session as involved; the Remote form omits that Session.\n\nAn update applies every patch field in one write and recomputes the next occurrence when the rule changes or the task resumes. A supplied `expectedUpdatedAt` that differs from the stored value returns `schedule_conflict`.',
2593
+ parameters: [{ name: 'request', description: 'Task identity and one update or delete operation.' }, { name: 'actorSessionId', description: 'Session of the acting Agent, or undefined for a human caller.' }, { name: 'signal', description: 'Cancellation checked before the durable write begins, including after FIFO waits.' }],
2594
+ returns: 'The updated task, the deletion outcome, or a non-mutating miss or conflict.',
2516
2595
  },
2517
2596
  ],
2518
2597
  },
@@ -2639,9 +2718,9 @@ export const SERVICE_API = [
2639
2718
  },
2640
2719
  {
2641
2720
  signature: '@Remote({ mode: \'stream\' }) observeProjections(request: SessionProjectionsRequest, signal: AbortSignal): AsyncIterable<SessionProjectionFrame>',
2642
- description: 'Subscribe to sparse Session projection changes.',
2721
+ description: 'Subscribe to Session projection changes.',
2643
2722
  parameters: [{ name: 'request', description: 'target Session.' }, { name: 'signal', description: 'subscription cancellation.' }],
2644
- returns: 'readiness and sparse projection changes.',
2723
+ returns: 'readiness followed by one projection change frame per committed event.',
2645
2724
  },
2646
2725
  {
2647
2726
  signature: '@Remote state(request: SessionStateRequest, signal: AbortSignal): Promise<SessionState>',
@@ -2707,6 +2786,19 @@ export const SERVICE_API = [
2707
2786
  },
2708
2787
  ],
2709
2788
  },
2789
+ {
2790
+ key: 'sessionLogDeepSeek',
2791
+ summary: 'Incremental Session-log contributor with caller-owned upload exclusions.',
2792
+ description: 'Incremental Session-log contributor with caller-owned upload exclusions.',
2793
+ methods: [
2794
+ {
2795
+ signature: 'registerExclusion(exclude: SessionLogUploadExclusion): () => Promise<void>',
2796
+ description: 'Exclude matching requests before reading or preparing their log contribution. Any matching rule suppresses both the field and its acceptance callback. With no matching rules, normal upload eligibility applies. A throwing rule fails this contribution; the request-extension registry omits it and reports the error.',
2797
+ parameters: [{ name: 'exclude', description: 'synchronous, side-effect-free predicate; `true` skips this upload.' }],
2798
+ returns: 'effect disposer that removes this registration when called or when the caller unloads.',
2799
+ },
2800
+ ],
2801
+ },
2710
2802
  {
2711
2803
  key: 'sessionPersistence',
2712
2804
  summary: 'Durable append-only session storage addressed through per-session handles.',
@@ -2792,7 +2884,7 @@ export const SERVICE_API = [
2792
2884
  {
2793
2885
  key: 'sessionProjections',
2794
2886
  summary: '`ctx.sessionProjections`: the projection unit table and its drive.',
2795
- description: '`ctx.sessionProjections`: the projection unit table and its drive. The service subscribes to `session/event` once; every committed event passes every registered unit\'s `apply` (eager drive). A changed state reference computes the next client view; the change feed is notified only when its raw result changes by `Object.is`. Cells build lazily — a unit registered after events flowed, or a session older than the registry, folds `init` over the in-memory log on first touch (event or read). Consumers declare `sessionProjections` as a required injection, await registration during activation, and retain its ready handle. Registrants sharing a key share one unit and are counted. The last release removes the unit from live drives, checkpoints, and client snapshots; retained handles still fold new events on demand using the original unit.',
2887
+ description: '`ctx.sessionProjections`: the projection unit table and its drive. The service subscribes to `session/event` once; every committed event passes every registered unit\'s `apply` (eager drive). A changed state reference computes the next client view; the change feed is notified only when its raw result changes by `Object.is`. Cells build lazily — a unit registered after events flowed, or a session older than the registry, folds `init` over the in-memory log on first touch (event or read). Consumers declare `sessionProjections` as a required injection, await registration during activation, and retain its ready handle. Registrants sharing a key share one unit and are counted. The last release removes the unit from live drives, restores, and client snapshots, while checkpoints keep each Session\'s last cell of it until the key registers again and the new unit refolds the log; retained handles still fold new events on demand using the original unit.',
2796
2888
  methods: [
2797
2889
  {
2798
2890
  signature: 'register<K extends keyof SessionProjectionMap, S>( definition: Omit<ProjectionDefinition<K, S>, \'wire\'> & { wire: NonNullable<ProjectionDefinition<K, S>[\'wire\']> }, ): Promise<ProjectionHandle<S>>',
@@ -2813,34 +2905,34 @@ export const SERVICE_API = [
2813
2905
  returns: 'the exact disposer that unsubscribes.',
2814
2906
  },
2815
2907
  {
2816
- signature: 'snapshot( session: Session, keys?: ProjectionKeySelection, ): ProjectionSnapshot',
2817
- description: 'One consistent cut over every registered client-visible unit for one session, read from the watermark cache (missing cells fold lazily over the in-memory log). Fully synchronous — every value and `asOfSeq` reflect the same log position. Each value passes its unit\'s `viewSchema` before leaving.',
2818
- parameters: [{ name: 'session', description: 'the session whose projection values are read.' }, { name: 'keys', description: 'optional client-visible outputs; state materialization remains complete.' }],
2819
- returns: 'the snapshot; `values` is empty when no selected client-visible unit is registered.',
2908
+ signature: 'onEventChanged(listener: ProjectionEventChangeListener): () => void',
2909
+ description: 'Subscribe to the event-level change feed. The registration is an effect on the calling context\'s fiber. The listener runs synchronously inside the committed event\'s `session/event` handling, once after every unit has been driven and after every onChanged call for that event. If a unit or an onChanged listener throws during that drive, the listener still receives the changes made before the throw.',
2910
+ parameters: [{ name: 'listener', description: 'called once per committed event that changed at least one client-visible unit\'s raw view by `Object.is`.' }],
2911
+ returns: 'the exact disposer that unsubscribes.',
2820
2912
  },
2821
2913
  {
2822
- signature: 'cachedSnapshot( session: Session, keys?: ProjectionKeySelection, ): ProjectionSnapshot | undefined',
2823
- description: 'Read only already-materialized client-visible cells without folding history. Values may trail the live Session and are therefore hints, not a complete baseline. Missing cells are omitted.',
2824
- parameters: [{ name: 'session', description: 'attached Session whose cached cells are inspected.' }, { name: 'keys', description: 'optional wire keys to view.' }],
2825
- returns: 'the lowest common cached cut, or `undefined` when no wire cell exists.',
2914
+ signature: 'snapshot( session: Session, keys?: ProjectionKeySelection, ): ProjectionSnapshot',
2915
+ description: 'One consistent cut over every registered client-visible unit for one session, read from the watermark cache (missing cells fold lazily over the in-memory log). Only the returned units are computed: other units, including Host-only units without `wire`, are neither folded nor advanced by this read. Fully synchronous — every value and `asOfSeq` reflect the same log position. Each value passes its unit\'s `viewSchema` before leaving.',
2916
+ parameters: [{ name: 'session', description: 'the session whose projection values are read.' }, { name: 'keys', description: 'optional client-visible outputs; only these units are computed.' }],
2917
+ returns: 'the snapshot; `values` is empty when no selected client-visible unit is registered.',
2826
2918
  },
2827
2919
  {
2828
2920
  signature: 'summaryKeys(): ReadonlySet<Extract<keyof SessionProjectionMap, string>>',
2829
- description: 'The keys a Session summary carries: every registered client-visible key whose unit does not declare `summary: false`. The returned set is stable — the same instance on every call — until a registration or its disposal changes the key table, so a consumer may hold it across rows. Callers pass it to a key-taking read face such as `cachedSnapshot(session, summaryKeys())` or `viewCheckpoint(rows, summaryKeys())`; those faces use the set as-is.',
2921
+ description: 'The keys a Session summary carries: every registered client-visible key whose unit does not declare `summary: false`. The returned set is stable — the same instance on every call — until a registration or its disposal changes the key table, so a consumer may hold it across rows. Callers pass it to a key-taking read face such as `snapshot(session, summaryKeys())` or `viewCheckpoint(rows, summaryKeys())`; those faces use the set as-is.',
2830
2922
  parameters: [],
2831
2923
  returns: 'the current summary key set; do not mutate it.',
2832
2924
  },
2833
2925
  {
2834
2926
  signature: 'checkpoint(session: Session): ProjectionCheckpoint',
2835
- description: 'State-level checkpoint of every persisted unit for one session, read from the watermark cache (missing cells fold lazily over the in-memory log). This is the write side of the persisted projection cache: the returned rows are the `(key → {ver, seq, val})` part of the durable `(sessionId, key, ver, seq, val)` rows. Every `val` is a DETACHED structured clone — never the live cell reference: the watermark cache is this registry\'s authoritative mutable state, and a caller reaching the live reference could corrupt every subsequent snapshot and frame through it (plain JSON by the unit contract, so the clone is total).',
2927
+ description: 'State-level checkpoint of every persisted unit for one session, read from the watermark cache (missing cells fold lazily over the in-memory log). This is the write side of the persisted projection cache: the returned rows are the `(key → {ver, seq, val})` part of the durable `(sessionId, key, ver, seq, val)` rows. Every `val` is a DETACHED structured clone — never the live cell reference: the watermark cache is this registry\'s authoritative mutable state, and a caller reaching the live reference could corrupt every subsequent snapshot and frame through it (plain JSON by the unit contract, so the clone is total). A released unit contributes the Session\'s last cell. The registry no longer advances that cell, while a retained handle read still advances it forward, so a writer running after a plugin unloads keeps that unit\'s latest state; a Session that has no cell of it gets no row. restore folds only live units, so its refreshed rows omit released units.',
2836
2928
  parameters: [{ name: 'session', description: 'the session whose unit states are checkpointed.' }],
2837
- returns: 'one row per registered key.',
2929
+ returns: 'one row per registered key, plus one per released key with a cell for this Session.',
2838
2930
  },
2839
2931
  {
2840
2932
  signature: 'restoreFloor(checkpoint: ProjectionCheckpoint): SessionLogOffset | undefined',
2841
2933
  description: 'The stored seq a restore tail read over `checkpoint` must start at: one event BELOW the lowest usable watermark (a row is usable when its `ver` matches the live unit\'s `stateVersion`; an absent or mismatched row pulls the floor to `0` — that key must refold the full log). The one-below anchor is load-bearing: the tail then proves how far the stored log still extends, so restore can detect a log that shrank below a row\'s watermark (crash-repair truncation) instead of serving the stale row as current — an empty tail read from the anchor yields an end below every watermark and the restore rejects for a full re-read.',
2842
2934
  parameters: [{ name: 'checkpoint', description: 'persisted rows for one session (possibly stale or empty).' }],
2843
- returns: 'the offset for the stored-log suffix read (`SessionHandle.read`), or `undefined` when no unit is registered (no read needed — {@link restore} would serve empty values regardless).',
2935
+ returns: 'the offset for the stored-log suffix read (`SessionHandle.read`), or `undefined` when no live unit is registered (released predecessors do not count; no read needed — {@link restore} would serve empty values regardless).',
2844
2936
  },
2845
2937
  {
2846
2938
  signature: 'viewCheckpoint( checkpoint: ProjectionCheckpoint, keys?: ProjectionKeySelection, ): Partial<SessionProjectionMap>',
@@ -2852,7 +2944,7 @@ export const SERVICE_API = [
2852
2944
  signature: 'restore( checkpoint: ProjectionCheckpoint, events: readonly SessionEvent[], baseSeq: SessionLogOffset, header: SessionHeader, inheritedEventCount: SessionLogOffset, ): { snapshot: ProjectionSnapshot; checkpoint: ProjectionCheckpoint }',
2853
2945
  description: 'Cold read: fold every persisted unit over a stored log suffix, seeding each from its checkpoint row when usable — the one read recipe (cached state + forward tail replay + `view`) applied without a live `Session`. Call with the stored events at or past `restoreFloor(checkpoint)` (a `SessionHandle.read` slice) and that same floor as `baseSeq`; the floor\'s one-below anchor makes the supplied end honest, so a shrunk log is detected here. A row is usable iff its `ver` matches the live unit\'s `stateVersion`, it does not predate `baseSeq` (`seq >= baseSeq - 1`), and it does not claim events past the supplied end (`seq <= endSeq`); an unusable row is discarded and its key refolds from `init` — which is only sound over the full log, so a discarded row with `baseSeq > 0` throws (the caller re-reads from seq 0, e.g. after a crash-repair truncation shrank the log below a row\'s watermark).',
2854
2946
  parameters: [{ name: 'checkpoint', description: 'persisted rows for one session (possibly stale or empty).' }, { name: 'events', description: 'the stored events with `seq >= baseSeq`, in seq order.' }, { name: 'baseSeq', description: 'the seq `events` starts at (its first event\'s seq when non-empty).' }, { name: 'header', description: 'immutable metadata for the Session being restored.' }, { name: 'inheritedEventCount', description: 'exact fork-inherited prefix length supplied to unit initialization.' }],
2855
- returns: 'the snapshot cut at the supplied log end (`asOfSeq` is the last supplied event\'s seq, `baseSeq - 1` for an empty tail) plus the refreshed checkpoint rows at that cut, ready for a durable write-back.',
2947
+ returns: 'the snapshot cut at the supplied log end (`asOfSeq` is the last supplied event\'s seq, `baseSeq - 1` for an empty tail) plus the refreshed checkpoint rows at that cut, ready for a durable write-back. The rows cover live units only: a released unit has no cell for a log folded without a live `Session`, so a write-back of them omits it.',
2856
2948
  },
2857
2949
  {
2858
2950
  signature: 'hydrate( session: Session, checkpoint: ProjectionCheckpoint, events: readonly SessionEvent[], baseSeq: SessionLogOffset, ): ProjectionSnapshot',
@@ -4834,6 +4926,14 @@ export const EVENT_API = [
4834
4926
  description: 'Announces a provider registration or withdrawal after the registry changes. Listener failures are logged without preventing other listeners from running.',
4835
4927
  parameters: [{ name: 'forge', description: 'family whose provider changed.' }],
4836
4928
  },
4929
+ {
4930
+ name: 'fs/delete-intent',
4931
+ mode: 'waterfall',
4932
+ signature: '\'fs/delete-intent\'(target: FsTarget, actor: object | undefined, next: () => { version: FsVersion } | undefined | Promise<{ version: FsVersion } | undefined>): Promise<{ version: FsVersion } | undefined>',
4933
+ summary: 'Single-slot decision for FileSystem.deleteFile; the first returned guard wins.',
4934
+ description: 'Single-slot decision for FileSystem.deleteFile; the first returned guard wins. Calling next() delegates to an unconditional deletion.',
4935
+ parameters: [{ name: 'target', description: 'the resolved source about to be removed.' }, { name: 'actor', description: 'the opaque tool-execution context used to select observed state.' }],
4936
+ },
4837
4937
  {
4838
4938
  name: 'fs/edit-intent',
4839
4939
  mode: 'waterfall',
@@ -4890,6 +4990,14 @@ export const EVENT_API = [
4890
4990
  description: 'Module replacements have finished loading.',
4891
4991
  parameters: [{ name: 'reloads', description: 'Replaced plugins and their module locations.' }],
4892
4992
  },
4993
+ {
4994
+ name: 'llm-pi-ai/request-headers',
4995
+ mode: 'waterfall',
4996
+ signature: '\'llm-pi-ai/request-headers\'(request: PiAiRequestHeaderContext, headers: Headers, next: () => Headers): Headers',
4997
+ summary: 'Prepare headers for one pi-ai inference call, excluding model discovery.',
4998
+ description: 'Prepare headers for one pi-ai inference call, excluding model discovery. Listeners run synchronously and must call next(); they may edit only the request-owned headers and must not retain them. Throws fail the call with REQUEST_HEADERS before inference I/O. Harness attribution wins afterward. Non-TypeError messages are user-visible and must exclude secrets. TypeError details and non-Error values are replaced with safe guidance.',
4999
+ parameters: [{ name: 'request', description: 'immutable routing metadata from the exact prepared call.' }, { name: 'headers', description: 'fresh profile headers, shared only within this dispatch.' }, { name: 'next', description: 'continue header preparation through the remaining listeners.' }],
5000
+ },
4893
5001
  {
4894
5002
  name: 'llm/adapters-updated',
4895
5003
  mode: 'emit',
@@ -4934,8 +5042,8 @@ export const EVENT_API = [
4934
5042
  name: 'plugin-manager/install-log',
4935
5043
  mode: 'emit',
4936
5044
  signature: '\'plugin-manager/install-log\'(chunk: PluginInstallLogChunk): void',
4937
- summary: 'One chunk of a pnpm run\'s output, streamed as the run produces it.',
4938
- description: 'One chunk of a pnpm run\'s output, streamed as the run produces it.',
5045
+ summary: 'One chunk of an installation run\'s output, streamed as the run produces it.',
5046
+ description: 'One chunk of an installation run\'s output, streamed as the run produces it.',
4939
5047
  parameters: [{ name: 'chunk', description: 'the chunk and the run it belongs to.' }],
4940
5048
  },
4941
5049
  {
@@ -6011,7 +6119,7 @@ export const TYPE_API = [
6011
6119
  },
6012
6120
  {
6013
6121
  name: 'DeepSeekLlmApiExtensionRequest',
6014
- declaration: 'export interface DeepSeekLlmApiExtensionRequest {\n readonly body: Readonly<Record<string, DeepSeekLlmApiJson>>;\n readonly sessionId?: string;\n readonly purpose?: \'compaction\' | \'session-title\';\n readonly signal: AbortSignal;\n}',
6122
+ declaration: 'export interface DeepSeekLlmApiExtensionRequest {\n readonly body: Readonly<Record<string, DeepSeekLlmApiJson>>;\n readonly sessionId?: string;\n readonly purpose?: string;\n readonly signal: AbortSignal;\n}',
6015
6123
  },
6016
6124
  {
6017
6125
  name: 'DeepSeekLlmApiJson',
@@ -6253,6 +6361,10 @@ export const TYPE_API = [
6253
6361
  name: 'ForgeFailure',
6254
6362
  declaration: 'export interface ForgeFailure {\n readonly code: \'not-found\' | \'unauthenticated\' | \'too-large\' | \'unavailable\';\n readonly message: string;\n}',
6255
6363
  },
6364
+ {
6365
+ name: 'ForgeLineComment',
6366
+ declaration: 'export interface ForgeLineComment {\n readonly path: string;\n readonly side: \'L\' | \'R\';\n readonly startLine: number;\n readonly endLine: number;\n readonly body: string;\n}',
6367
+ },
6256
6368
  {
6257
6369
  name: 'ForgeLocalChanges',
6258
6370
  declaration: 'export interface ForgeLocalChanges {\n readonly base: string;\n readonly files: readonly ForgeChangedFile[];\n}',
@@ -6283,7 +6395,7 @@ export const TYPE_API = [
6283
6395
  },
6284
6396
  {
6285
6397
  name: 'ForgeProvider',
6286
- declaration: 'export interface ForgeProvider {\n readonly forge: string;\n repositoryFromRemote(url: string): ForgeRepository | undefined;\n changeRequestFromUrl(url: string): ChangeRequestRef | undefined;\n changeRequestUrl(ref: ChangeRequestRef): string;\n fetch(refs: readonly ChangeRequestRef[], signal: AbortSignal): Promise<ReadonlyMap<ChangeRequestKey, ChangeRequestSnapshot | ForgeFailure>>;\n findByHead(repository: ForgeRepository, branch: string, signal: AbortSignal): Promise<readonly ChangeRequestRef[]>;\n readiness(host: string, signal: AbortSignal): Promise<ForgeReadiness>;\n markReady(ref: ChangeRequestRef, signal: AbortSignal): Promise<ForgeActionFailure | undefined>;\n merge(ref: ChangeRequestRef, request: MergeRequest, signal: AbortSignal): Promise<ForgeActionFailure | undefined>;\n diff(ref: ChangeRequestRef, signal: AbortSignal): Promise<string | ForgeFailure>;\n fileText(ref: ChangeRequestRef, commit: string, path: string, signal: AbortSignal): Promise<string | ForgeFailure>;\n fileUrl(ref: ChangeRequestRef, commit: string, path: string): string;\n}',
6398
+ declaration: 'export interface ForgeProvider {\n readonly forge: string;\n submitReview?(ref: ChangeRequestRef, request: ForgeReviewRequest, signal: AbortSignal): Promise<ForgeReviewResult>;\n repositoryFromRemote(url: string): ForgeRepository | undefined;\n changeRequestFromUrl(url: string): ChangeRequestRef | undefined;\n changeRequestUrl(ref: ChangeRequestRef): string;\n fetch(refs: readonly ChangeRequestRef[], signal: AbortSignal): Promise<ReadonlyMap<ChangeRequestKey, ChangeRequestSnapshot | ForgeFailure>>;\n fetchChecks?(ref: ChangeRequestRef, signal: AbortSignal): Promise<ChangeRequestSnapshot | ForgeFailure>;\n findByHead(repository: ForgeRepository, branch: string, signal: AbortSignal): Promise<readonly ChangeRequestRef[]>;\n readiness(host: string, signal: AbortSignal): Promise<ForgeReadiness>;\n markReady(ref: ChangeRequestRef, signal: AbortSignal): Promise<ForgeActionFailure | undefined>;\n merge(ref: ChangeRequestRef, request: MergeRequest, signal: AbortSignal): Promise<ForgeActionFailure | undefined>;\n diff(ref: ChangeRequestRef, signal: AbortSignal): Promise<string | ForgeFailure>;\n fileText(ref: ChangeRequestRef, commit: string, path: string, signal: AbortSignal): Promise<string | ForgeFailure>;\n fileUrl(ref: ChangeRequestRef, commit: string, path: string): string;\n}',
6287
6399
  },
6288
6400
  {
6289
6401
  name: 'ForgeReadiness',
@@ -6293,6 +6405,14 @@ export const TYPE_API = [
6293
6405
  name: 'ForgeRepository',
6294
6406
  declaration: 'export interface ForgeRepository {\n readonly forge: string;\n readonly host: string;\n readonly owner: string;\n readonly name: string;\n}',
6295
6407
  },
6408
+ {
6409
+ name: 'ForgeReviewRequest',
6410
+ declaration: 'export type ForgeReviewRequest = {\n readonly headSha: string;\n} & ({\n readonly kind: \'comment\';\n readonly comment: ForgeLineComment;\n} | {\n readonly kind: \'review\';\n readonly event: \'comment\' | \'approve\' | \'request-changes\';\n readonly body: string;\n readonly comments: readonly ForgeLineComment[];\n});',
6411
+ },
6412
+ {
6413
+ name: 'ForgeReviewResult',
6414
+ declaration: 'export type ForgeReviewResult = {\n readonly ok: true;\n readonly url: string;\n} | {\n readonly ok: false;\n readonly code: \'unsupported\' | \'stale\' | \'failed\' | \'unknown\';\n readonly message: string;\n};',
6415
+ },
6296
6416
  {
6297
6417
  name: 'ForgeSessionWorktree',
6298
6418
  declaration: 'export interface ForgeSessionWorktree {\n readonly path: string;\n readonly branch: string;\n readonly from: string | null;\n readonly baseCommit: string;\n readonly repositoryRoot: string;\n}',
@@ -6322,8 +6442,8 @@ export const TYPE_API = [
6322
6442
  declaration: 'export type ForgeWorktreeWaiting = \'creation\' | \'restoration\';',
6323
6443
  },
6324
6444
  {
6325
- name: 'FrequencyTooHighError',
6326
- declaration: 'export interface FrequencyTooHighError {\n readonly code: \'frequency_too_high\';\n readonly message: string;\n}',
6445
+ name: 'FsDeleteOutcome',
6446
+ declaration: 'export interface FsDeleteOutcome {\n before: string | null;\n}',
6327
6447
  },
6328
6448
  {
6329
6449
  name: 'FsDirEntry',
@@ -6337,10 +6457,22 @@ export const TYPE_API = [
6337
6457
  name: 'FsEditRequest',
6338
6458
  declaration: 'export interface FsEditRequest {\n oldString: string;\n newString: string;\n replaceAll: boolean;\n}',
6339
6459
  },
6460
+ {
6461
+ name: 'FsErrorCode',
6462
+ declaration: 'export type FsErrorCode = typeof FS_ERROR_CODES[number];',
6463
+ },
6340
6464
  {
6341
6465
  name: 'FsInfo',
6342
6466
  declaration: 'export interface FsInfo {\n version: FsVersion;\n type: \'file\' | \'directory\' | \'other\';\n size?: number;\n}',
6343
6467
  },
6468
+ {
6469
+ name: 'FsMoveOutcome',
6470
+ declaration: 'export type FsMoveOutcome = {\n sourceBefore: string | null;\n destination: FsWriteOutcome;\n sourceDeleted: true;\n} | {\n sourceBefore: string | null;\n destination: FsWriteOutcome;\n sourceDeleted: false;\n sourceFailure: FsMoveSourceFailure;\n};',
6471
+ },
6472
+ {
6473
+ name: 'FsMoveSourceFailure',
6474
+ declaration: 'export interface FsMoveSourceFailure {\n code: FsErrorCode;\n message: string;\n}',
6475
+ },
6344
6476
  {
6345
6477
  name: 'FsObservation',
6346
6478
  declaration: 'export type FsObservation = {\n readonly kind: \'present\';\n readonly version: FsVersion;\n} | {\n readonly kind: \'absent\';\n};',
@@ -6371,7 +6503,7 @@ export const TYPE_API = [
6371
6503
  },
6372
6504
  {
6373
6505
  name: 'GenerateOptions',
6374
- declaration: 'export interface GenerateOptions {\n provider: string;\n model: string;\n reasoningEffort?: ReasoningEffortId;\n messages: RequestMessage[];\n system?: string;\n tools?: ToolSchema[];\n toolHistory?: ToolHistory;\n temperature?: number;\n maxTokens?: number;\n stop?: string[];\n signal?: AbortSignal;\n sessionId?: Branded<\'SessionId\'>;\n purpose?: \'compaction\' | \'session-title\';\n}',
6506
+ declaration: 'export interface GenerateOptions<Purpose extends string = LlmRequestPurpose> {\n provider: string;\n model: string;\n reasoningEffort?: ReasoningEffortId;\n messages: RequestMessage[];\n system?: string;\n tools?: ToolSchema[];\n toolHistory?: ToolHistory;\n temperature?: number;\n maxTokens?: number;\n stop?: string[];\n signal?: AbortSignal;\n sessionId?: Branded<\'SessionId\'>;\n purpose?: Purpose;\n}',
6375
6507
  },
6376
6508
  {
6377
6509
  name: 'GenericCallView',
@@ -6525,26 +6657,6 @@ export const TYPE_API = [
6525
6657
  name: 'InstallSpecKind',
6526
6658
  declaration: 'export type InstallSpecKind = \'registry\' | \'path\' | \'git\' | \'tarball\';',
6527
6659
  },
6528
- {
6529
- name: 'InternalScheduleError',
6530
- declaration: 'export interface InternalScheduleError {\n readonly code: \'internal_error\';\n readonly message: string;\n}',
6531
- },
6532
- {
6533
- name: 'InvalidPromptError',
6534
- declaration: 'export interface InvalidPromptError {\n readonly code: \'invalid_prompt\';\n readonly message: string;\n}',
6535
- },
6536
- {
6537
- name: 'InvalidRuleError',
6538
- declaration: 'export interface InvalidRuleError {\n readonly code: \'invalid_rule\';\n readonly message: string;\n}',
6539
- },
6540
- {
6541
- name: 'InvalidSelectorError',
6542
- declaration: 'export interface InvalidSelectorError {\n readonly code: \'invalid_selector\';\n readonly message: string;\n}',
6543
- },
6544
- {
6545
- name: 'InvalidTimeZoneError',
6546
- declaration: 'export interface InvalidTimeZoneError {\n readonly code: \'invalid_time_zone\';\n readonly message: string;\n}',
6547
- },
6548
6660
  {
6549
6661
  name: 'InvocationDescriptor',
6550
6662
  declaration: 'export interface InvocationDescriptor {\n readonly id: string;\n readonly service: string;\n readonly namespace: string;\n readonly method: string;\n readonly implementation?: string;\n readonly mode?: \'stream\';\n readonly invocation: {\n readonly kind: \'direct\';\n } | {\n readonly kind: \'context\';\n readonly context: string;\n readonly wire: string;\n readonly codec: TypertCodec;\n };\n readonly scope?: {\n readonly context: string;\n readonly wire: string;\n };\n readonly parameters: readonly InvocationParameterDescriptor[];\n readonly uplink?: {\n readonly codec: TypertCodec;\n };\n readonly cancellation?: {\n readonly parameter: \'signal\';\n };\n readonly result: TypertCodec;\n readonly description?: string;\n readonly sourceLocation?: InvocationSourceLocation;\n}',
@@ -6785,6 +6897,14 @@ export const TYPE_API = [
6785
6897
  name: 'LlmReasoningEffortInfo',
6786
6898
  declaration: 'export interface LlmReasoningEffortInfo {\n id: ReasoningEffortId;\n name: string;\n description?: string;\n}',
6787
6899
  },
6900
+ {
6901
+ name: 'LlmRequestPurpose',
6902
+ declaration: 'export type LlmRequestPurpose = Extract<keyof LlmRequestPurposeMap, string>;',
6903
+ },
6904
+ {
6905
+ name: 'LlmRequestPurposeMap',
6906
+ declaration: 'export interface LlmRequestPurposeMap {\n}',
6907
+ },
6788
6908
  {
6789
6909
  name: 'LlmResolvedModelInfo',
6790
6910
  declaration: 'export interface LlmResolvedModelInfo extends LlmModelInfo {\n context?: LlmModelContext;\n defaultMaxTokens?: number;\n reasoning?: LlmModelReasoningInfo;\n systemPromptUpdate?: SystemPromptUpdate;\n toolUpdate?: ToolUpdate;\n}',
@@ -7113,10 +7233,6 @@ export const TYPE_API = [
7113
7233
  name: 'NativeFileApplication',
7114
7234
  declaration: 'export interface NativeFileApplication {\n readonly id: string;\n readonly name: string;\n readonly default: boolean;\n readonly icon: string | null;\n}',
7115
7235
  },
7116
- {
7117
- name: 'NotFutureError',
7118
- declaration: 'export interface NotFutureError {\n readonly code: \'not_future\';\n readonly message: string;\n}',
7119
- },
7120
7236
  {
7121
7237
  name: 'NpmFileSource',
7122
7238
  declaration: 'export type NpmFileSource = \'jsdelivr\' | \'unpkg\' | \'npmmirror\';',
@@ -7217,6 +7333,10 @@ export const TYPE_API = [
7217
7333
  name: 'PaneOpenResult',
7218
7334
  declaration: 'export interface PaneOpenResult {\n id: string;\n isPlaced: boolean;\n reason?: string;\n}',
7219
7335
  },
7336
+ {
7337
+ name: 'PatchHunk',
7338
+ declaration: 'export interface PatchHunk {\n lineNumber: number;\n context?: string;\n oldLines: string[];\n newLines: string[];\n isEndOfFile: boolean;\n}',
7339
+ },
7220
7340
  {
7221
7341
  name: 'PeerAdmission',
7222
7342
  declaration: 'export type PeerAdmission = {\n readonly peer: PeerScope;\n} | {\n readonly rejection: 401 | 403;\n};',
@@ -7241,6 +7361,10 @@ export const TYPE_API = [
7241
7361
  name: 'PermissionCatalog',
7242
7362
  declaration: 'export interface PermissionCatalog {\n options: PresetOption[];\n defaultOptions: PresetOption[];\n defaultPreset: string;\n}',
7243
7363
  },
7364
+ {
7365
+ name: 'PiAiRequestHeaderContext',
7366
+ declaration: 'export interface PiAiRequestHeaderContext extends Readonly<Pick<GenerateOptions<string>, \'provider\' | \'model\' | \'sessionId\' | \'purpose\'>> {\n readonly baseURL: string;\n}',
7367
+ },
7244
7368
  {
7245
7369
  name: 'PlatformSession',
7246
7370
  declaration: 'export interface PlatformSession {\n readonly origin: string;\n readonly token: string;\n readonly userId: AccountUserId | null;\n readonly embeddedPageDist?: string;\n readonly requestHeaders?: Readonly<Record<string, string>>;\n}',
@@ -7441,6 +7565,10 @@ export const TYPE_API = [
7441
7565
  name: 'ProjectionDefinition',
7442
7566
  declaration: 'export interface ProjectionDefinition<K extends string, S> {\n key: K;\n stateSchema: ZodType<S>;\n init(header: SessionHeader, inheritedEventCount: SessionLogOffset): NoInfer<S>;\n apply(state: NoInfer<S>, event: SessionEvent): NoInfer<S>;\n wire?: K extends keyof SessionProjectionMap ? {\n viewSchema: ZodType<SessionProjectionViewValue<SessionProjectionMap[K]>>;\n view(state: NoInfer<S>): SessionProjectionViewValue<SessionProjectionMap[K]>;\n summary?: boolean;\n } : never;\n stateVersion: number;\n}',
7443
7567
  },
7568
+ {
7569
+ name: 'ProjectionEventChangeListener',
7570
+ declaration: 'export type ProjectionEventChangeListener = (session: Session, changes: readonly {\n readonly key: Extract<keyof SessionProjectionMap, string>;\n readonly val: unknown;\n}[], seq: SessionSeq) => void;',
7571
+ },
7444
7572
  {
7445
7573
  name: 'ProjectionHandle',
7446
7574
  declaration: 'export interface ProjectionHandle<S> {\n stateOf(session: Session): S;\n readerFor(session: Session): () => S;\n dispose(): Promise<void>;\n}',
@@ -7579,7 +7707,7 @@ export const TYPE_API = [
7579
7707
  },
7580
7708
  {
7581
7709
  name: 'RecurringScheduleRecord',
7582
- declaration: 'export type RecurringScheduleRecord = EveryScheduleRecord | DailyScheduleRecord | WeeklyScheduleRecord | CronScheduleRecord;',
7710
+ declaration: 'export type RecurringScheduleRecord = EveryScheduleRecord | DailyScheduleRecord | WeeklyScheduleRecord | CronScheduleRecord | RRuleScheduleRecord;',
7583
7711
  },
7584
7712
  {
7585
7713
  name: 'RedactedSecret',
@@ -7781,6 +7909,10 @@ export const TYPE_API = [
7781
7909
  name: 'RpcId',
7782
7910
  declaration: 'export type RpcId = Branded<\'rpc-id\'>;',
7783
7911
  },
7912
+ {
7913
+ name: 'RRuleScheduleRecord',
7914
+ declaration: 'export interface RRuleScheduleRecord {\n readonly kind: \'rrule\';\n readonly id: ScheduleId;\n readonly title: string;\n readonly prompt: string;\n readonly rrule: string;\n readonly scheduledAt: string;\n}',
7915
+ },
7784
7916
  {
7785
7917
  name: 'RunnerFailureRule',
7786
7918
  declaration: 'export interface RunnerFailureRule {\n allowedExitCodes?: readonly number[];\n fatalSignatures: readonly string[];\n informationalLines?: readonly string[];\n}',
@@ -7823,75 +7955,115 @@ export const TYPE_API = [
7823
7955
  },
7824
7956
  {
7825
7957
  name: 'ScheduleCatalogEntry',
7826
- declaration: 'export type ScheduleCatalogEntry = ScheduleRecord & {\n readonly sessionId: SessionId;\n readonly status: \'active\' | \'inactive\';\n readonly lastDelivery?: ScheduleDeliveryReceipt;\n};',
7958
+ declaration: 'export type ScheduleCatalogEntry = ScheduleRecord & {\n readonly target: ScheduleTarget;\n readonly involvedSessionIds: SessionId[];\n readonly status: \'active\' | \'paused\' | \'ended\';\n readonly createdAt?: string;\n readonly updatedAt?: string;\n readonly executionActive?: true;\n readonly deliveryFloorEndsAt?: string;\n readonly lastDelivery?: ScheduleDeliveryReceipt;\n};',
7959
+ },
7960
+ {
7961
+ name: 'ScheduleConflictResult',
7962
+ declaration: 'export interface ScheduleConflictResult {\n readonly id: ScheduleId;\n readonly code: \'schedule_conflict\';\n}',
7827
7963
  },
7828
7964
  {
7829
7965
  name: 'ScheduleCreateRequest',
7830
- declaration: 'export interface ScheduleCreateRequest {\n prompt: string;\n title: string;\n after_seconds?: number;\n at?: AtInput;\n every_seconds?: number;\n daily?: DailyInput;\n weekly?: WeeklyInput;\n cron?: CronInput;\n}',
7966
+ declaration: 'export interface ScheduleCreateRequest {\n readonly title: string;\n readonly prompt: string;\n readonly timing: ScheduleTiming;\n readonly target?: ScheduleTargetRequest;\n}',
7831
7967
  },
7832
7968
  {
7833
7969
  name: 'ScheduleDeleteInactiveResult',
7834
7970
  declaration: 'export interface ScheduleDeleteInactiveResult {\n readonly deleted: number;\n}',
7835
7971
  },
7836
- {
7837
- name: 'ScheduleDeleteRequest',
7838
- declaration: 'export interface ScheduleDeleteRequest extends ScheduleListRequest {\n id: ScheduleId;\n}',
7839
- },
7840
7972
  {
7841
7973
  name: 'ScheduleDeleteResult',
7842
7974
  declaration: 'export type ScheduleDeleteResult = {\n readonly id: ScheduleId;\n readonly deleted: true;\n} | {\n readonly id: ScheduleId;\n readonly deleted: false;\n readonly code: \'schedule_not_found\';\n};',
7843
7975
  },
7976
+ {
7977
+ name: 'ScheduleDeliveryHistoryMiss',
7978
+ declaration: 'export interface ScheduleDeliveryHistoryMiss {\n readonly id: ScheduleId;\n readonly code: \'schedule_not_found\' | \'delivery_cursor_not_found\';\n}',
7979
+ },
7980
+ {
7981
+ name: 'ScheduleDeliveryHistoryPage',
7982
+ declaration: 'export interface ScheduleDeliveryHistoryPage {\n readonly id: ScheduleId;\n readonly records: ScheduleDeliveryRecord[];\n readonly earlierRecordsUnavailable: boolean;\n readonly earlierRecordsPruned: boolean;\n readonly retention: DeliveryRetentionBounds;\n readonly nextBefore?: MessageId;\n}',
7983
+ },
7844
7984
  {
7845
7985
  name: 'ScheduleDeliveryHistoryRequest',
7846
- declaration: 'export interface ScheduleDeliveryHistoryRequest extends ScheduleDeleteRequest {\n limit: number;\n before?: MessageId;\n}',
7986
+ declaration: 'export interface ScheduleDeliveryHistoryRequest {\n readonly id: ScheduleId;\n readonly limit: number;\n readonly before?: MessageId;\n}',
7847
7987
  },
7848
7988
  {
7849
7989
  name: 'ScheduleDeliveryHistoryResult',
7850
- declaration: 'export type ScheduleDeliveryHistoryResult = {\n readonly id: ScheduleId;\n readonly records: ScheduleDeliveryRecord[];\n readonly earlierRecordsUnavailable: boolean;\n readonly earlierRecordsPruned: boolean;\n readonly retention: DeliveryRetentionBounds;\n readonly nextBefore?: MessageId;\n} | {\n readonly id: ScheduleId;\n readonly code: \'schedule_not_found\' | \'delivery_cursor_not_found\';\n};',
7990
+ declaration: 'export type ScheduleDeliveryHistoryResult = ScheduleDeliveryHistoryPage | ScheduleDeliveryHistoryMiss;',
7851
7991
  },
7852
7992
  {
7853
7993
  name: 'ScheduleDeliveryReceipt',
7854
- declaration: 'export interface ScheduleDeliveryReceipt {\n readonly scheduledAt: string;\n readonly deliveredAt: string;\n readonly messageId: MessageId;\n}',
7994
+ declaration: 'export interface ScheduleDeliveryReceipt {\n readonly scheduledAt: string;\n readonly deliveredAt: string;\n readonly messageId: MessageId;\n readonly targetSessionId: SessionId;\n}',
7855
7995
  },
7856
7996
  {
7857
7997
  name: 'ScheduleDeliveryRecord',
7858
7998
  declaration: 'export interface ScheduleDeliveryRecord extends ScheduleDeliveryReceipt {\n readonly prompt?: string;\n}',
7859
7999
  },
8000
+ {
8001
+ name: 'ScheduleEditRequest',
8002
+ declaration: 'export type ScheduleEditRequest = {\n readonly id: ScheduleId;\n readonly action: \'update\';\n readonly patch: SchedulePatch;\n readonly expectedUpdatedAt?: string | null;\n} | {\n readonly id: ScheduleId;\n readonly action: \'delete\';\n readonly expectedUpdatedAt?: string | null;\n};',
8003
+ },
8004
+ {
8005
+ name: 'ScheduleEditResult',
8006
+ declaration: 'export type ScheduleEditResult = ScheduleCatalogEntry | Extract<ScheduleDeleteResult, {\n readonly deleted: true;\n}> | ScheduleNotFoundResult | ScheduleConflictResult;',
8007
+ },
8008
+ {
8009
+ name: 'ScheduleExecutionPendingResult',
8010
+ declaration: 'export interface ScheduleExecutionPendingResult {\n readonly id: ScheduleId;\n readonly code: \'schedule_execution_pending\';\n}',
8011
+ },
7860
8012
  {
7861
8013
  name: 'ScheduleId',
7862
8014
  declaration: 'export type ScheduleId = Branded<\'ScheduleId\'>;',
7863
8015
  },
7864
8016
  {
7865
8017
  name: 'ScheduleListRequest',
7866
- declaration: 'export interface ScheduleListRequest {\n sessionId: SessionId;\n}',
8018
+ declaration: 'export interface ScheduleListRequest {\n readonly active?: boolean;\n readonly limit?: number;\n readonly offset?: number;\n}',
8019
+ },
8020
+ {
8021
+ name: 'ScheduleListResult',
8022
+ declaration: 'export interface ScheduleListResult {\n readonly items: ScheduleCatalogEntry[];\n readonly shown: number;\n readonly total: number;\n readonly limit: number;\n readonly offset: number;\n}',
8023
+ },
8024
+ {
8025
+ name: 'ScheduleNotFoundResult',
8026
+ declaration: 'export interface ScheduleNotFoundResult {\n readonly id: ScheduleId;\n readonly code: \'schedule_not_found\';\n}',
8027
+ },
8028
+ {
8029
+ name: 'SchedulePatch',
8030
+ declaration: 'export interface SchedulePatch {\n readonly title?: string;\n readonly prompt?: string;\n readonly timing?: ScheduleTiming;\n readonly target?: ScheduleTargetRequest;\n readonly active?: boolean;\n}',
7867
8031
  },
7868
8032
  {
7869
8033
  name: 'ScheduleRecord',
7870
8034
  declaration: 'export type ScheduleRecord = OneShotScheduleRecord | RecurringScheduleRecord;',
7871
8035
  },
7872
8036
  {
7873
- name: 'ScheduleTimingChange',
7874
- declaration: 'export type ScheduleTimingChange = {\n readonly kind: \'at\';\n readonly at: AtInput;\n} | {\n readonly kind: \'every\';\n readonly every_seconds: number;\n} | {\n readonly kind: \'daily\';\n readonly daily: DailyInput;\n} | {\n readonly kind: \'weekly\';\n readonly weekly: WeeklyInput;\n} | {\n readonly kind: \'cron\';\n readonly cron: CronInput;\n};',
8037
+ name: 'ScheduleRunRequest',
8038
+ declaration: 'export interface ScheduleRunRequest {\n readonly id: ScheduleId;\n}',
8039
+ },
8040
+ {
8041
+ name: 'ScheduleRunResult',
8042
+ declaration: 'export type ScheduleRunResult = ScheduleCatalogEntry | ScheduleNotFoundResult | ScheduleExecutionPendingResult;',
7875
8043
  },
7876
8044
  {
7877
- name: 'ScheduleToolError',
7878
- declaration: 'export type ScheduleToolError = InvalidPromptError | InvalidSelectorError | InvalidRuleError | InvalidTimeZoneError | NotFutureError | TimeOutOfRangeError | FrequencyTooHighError | SubagentSessionError | InternalScheduleError;',
8045
+ name: 'ScheduleSessionCreateSpec',
8046
+ declaration: 'export interface ScheduleSessionCreateSpec {\n readonly cwd?: string;\n readonly agentPreset?: string;\n}',
7879
8047
  },
7880
8048
  {
7881
- name: 'ScheduleUpdateContent',
7882
- declaration: 'export interface ScheduleUpdateContent {\n readonly title?: string;\n readonly prompt?: string;\n}',
8049
+ name: 'ScheduleTarget',
8050
+ declaration: 'export type ScheduleTarget = {\n readonly kind: \'session\';\n readonly sessionId: SessionId;\n} | {\n readonly kind: \'new_once\';\n readonly sessionId: SessionId;\n readonly create: ScheduleSessionCreateSpec;\n} | {\n readonly kind: \'new\';\n readonly create: ScheduleSessionCreateSpec;\n};',
7883
8051
  },
7884
8052
  {
7885
- name: 'ScheduleUpdateMiss',
7886
- declaration: 'export interface ScheduleUpdateMiss {\n readonly id: ScheduleId;\n readonly updated: false;\n readonly code: \'schedule_not_found\' | \'schedule_ended\' | \'schedule_conflict\';\n}',
8053
+ name: 'ScheduleTargetRequest',
8054
+ declaration: 'export type ScheduleTargetRequest = {\n readonly kind: \'session\';\n readonly sessionId: SessionId;\n} | {\n readonly kind: \'new_once\';\n readonly create?: ScheduleSessionCreateSpec;\n} | {\n readonly kind: \'new\';\n readonly create?: ScheduleSessionCreateSpec;\n};',
7887
8055
  },
7888
8056
  {
7889
- name: 'ScheduleUpdateRequest',
7890
- declaration: 'export interface ScheduleUpdateRequest extends ScheduleDeleteRequest, ScheduleUpdateContent {\n readonly expected: ScheduleRecord;\n readonly change?: ScheduleTimingChange;\n}',
8057
+ name: 'ScheduleTiming',
8058
+ declaration: 'export type ScheduleTiming = {\n readonly kind: \'after\';\n readonly after_seconds: number;\n} | {\n readonly kind: \'at\';\n readonly at: AtInput;\n} | {\n readonly kind: \'every\';\n readonly every_seconds: number;\n} | {\n readonly kind: \'daily\';\n readonly daily: DailyInput;\n} | {\n readonly kind: \'weekly\';\n readonly weekly: WeeklyInput;\n} | {\n readonly kind: \'cron\';\n readonly cron: CronInput;\n} | {\n readonly kind: \'rrule\';\n readonly rrule: string;\n};',
7891
8059
  },
7892
8060
  {
7893
- name: 'ScheduleUpdateResult',
7894
- declaration: 'export type ScheduleUpdateResult = {\n readonly id: ScheduleId;\n readonly updated: boolean;\n readonly record: ScheduleRecord;\n} | ScheduleUpdateMiss | ScheduleToolError;',
8061
+ name: 'ScheduleViewRequest',
8062
+ declaration: 'export interface ScheduleViewRequest {\n readonly id: ScheduleId;\n}',
8063
+ },
8064
+ {
8065
+ name: 'ScheduleViewResult',
8066
+ declaration: 'export type ScheduleViewResult = ScheduleCatalogEntry | ScheduleNotFoundResult;',
7895
8067
  },
7896
8068
  {
7897
8069
  name: 'Scoped',
@@ -8229,6 +8401,14 @@ export const TYPE_API = [
8229
8401
  name: 'SessionLogSnapshot',
8230
8402
  declaration: 'export interface SessionLogSnapshot {\n session: SessionHeader;\n inheritedEventCount: SessionLogOffset;\n events: SessionEvent[];\n}',
8231
8403
  },
8404
+ {
8405
+ name: 'SessionLogUploadExclusion',
8406
+ declaration: 'export type SessionLogUploadExclusion = (request: SessionLogUploadRequest) => boolean;',
8407
+ },
8408
+ {
8409
+ name: 'SessionLogUploadRequest',
8410
+ declaration: 'export interface SessionLogUploadRequest {\n readonly sessionId: SessionId;\n readonly purpose?: string;\n}',
8411
+ },
8232
8412
  {
8233
8413
  name: 'SessionMessage',
8234
8414
  declaration: 'export interface SessionMessage {\n role: \'user\' | \'assistant\';\n text: string;\n toolUses: ToolUseSummary[];\n}',
@@ -8339,7 +8519,7 @@ export const TYPE_API = [
8339
8519
  },
8340
8520
  {
8341
8521
  name: 'SessionProjectionUpdate',
8342
- declaration: 'export interface SessionProjectionUpdate {\n readonly sessionId: SessionId;\n readonly key: string;\n readonly value: JsonValue;\n readonly seq: number;\n}',
8522
+ declaration: 'export interface SessionProjectionUpdate {\n readonly sessionId: SessionId;\n readonly seq: number;\n readonly changes: readonly {\n readonly key: string;\n readonly val: SessionProjectionValue;\n }[];\n}',
8343
8523
  },
8344
8524
  {
8345
8525
  name: 'SessionProjectionValue',
@@ -8973,10 +9153,6 @@ export const TYPE_API = [
8973
9153
  name: 'SubagentSendMessageOptions',
8974
9154
  declaration: 'export interface SubagentSendMessageOptions {\n readonly signal: AbortSignal;\n}',
8975
9155
  },
8976
- {
8977
- name: 'SubagentSessionError',
8978
- declaration: 'export interface SubagentSessionError {\n readonly code: \'subagent_session\';\n readonly message: string;\n}',
8979
- },
8980
9156
  {
8981
9157
  name: 'SubagentStartRequest',
8982
9158
  declaration: 'export interface SubagentStartRequest {\n readonly cwd?: string;\n readonly agentPreset?: string;\n readonly label?: string;\n readonly prompt: ContentBlock[];\n readonly parent: Agent;\n readonly signal: AbortSignal;\n readonly agentOptions?: AgentOptions;\n readonly outputSchema?: ObjectJsonSchema;\n readonly maxDepth?: number;\n}',
@@ -9245,10 +9421,6 @@ export const TYPE_API = [
9245
9421
  name: 'TimedUserQuestionResult',
9246
9422
  declaration: 'export type TimedUserQuestionResult = AskUserQuestionAnswer | {\n pending: true;\n callId: ToolCallId;\n};',
9247
9423
  },
9248
- {
9249
- name: 'TimeOutOfRangeError',
9250
- declaration: 'export interface TimeOutOfRangeError {\n readonly code: \'time_out_of_range\';\n readonly message: string;\n}',
9251
- },
9252
9424
  {
9253
9425
  name: 'ToastOptions',
9254
9426
  declaration: 'export interface ToastOptions {\n timeoutMs?: number;\n}',
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-tool-cordis",
3
3
  "description": "Read-only runtime API inspection for Harness plugin development",
4
- "version": "0.2.2-alpha.2",
4
+ "version": "0.2.2-alpha.3",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -36,23 +36,23 @@
36
36
  ],
37
37
  "license": "MIT",
38
38
  "peerDependencies": {
39
- "@deepseek-ai/cordis": "~4.0.6-alpha.1",
40
- "@deepseek-ai/cordis-plugin-loader": "~1.0.7-alpha.1",
41
- "@deepseek-ai/dsh-agent": "0.2.2-alpha.2",
42
- "@deepseek-ai/dsh-app-boot": "0.2.2-alpha.2",
43
- "@deepseek-ai/dsh-cordis-host-runner": "0.2.2-alpha.2",
44
- "@deepseek-ai/dsh-tools": "0.2.2-alpha.2"
39
+ "@deepseek-ai/cordis": "~4.0.6-alpha.2",
40
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.7-alpha.2",
41
+ "@deepseek-ai/dsh-agent": "0.2.2-alpha.3",
42
+ "@deepseek-ai/dsh-app-boot": "0.2.2-alpha.3",
43
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.2-alpha.3",
44
+ "@deepseek-ai/dsh-tools": "0.2.2-alpha.3"
45
45
  },
46
46
  "devDependencies": {
47
- "@deepseek-ai/cordis": "~4.0.6-alpha.1",
48
- "@deepseek-ai/cordis-plugin-group": "~1.0.6-alpha.1",
49
- "@deepseek-ai/cordis-plugin-loader": "~1.0.7-alpha.1",
50
- "@deepseek-ai/dsh-agent": "0.2.2-alpha.2",
51
- "@deepseek-ai/dsh-app-boot": "0.2.2-alpha.2",
52
- "@deepseek-ai/dsh-cordis-host-runner": "0.2.2-alpha.2",
53
- "@deepseek-ai/dsh-system-prompt": "0.2.2-alpha.2",
54
- "@deepseek-ai/dsh-tool-executor-native": "0.2.2-alpha.2",
55
- "@deepseek-ai/dsh-tools": "0.2.2-alpha.2",
56
- "@deepseek-ai/schemastery": "~3.18.6-alpha.1"
47
+ "@deepseek-ai/cordis": "~4.0.6-alpha.2",
48
+ "@deepseek-ai/cordis-plugin-group": "~1.0.6-alpha.2",
49
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.7-alpha.2",
50
+ "@deepseek-ai/dsh-agent": "0.2.2-alpha.3",
51
+ "@deepseek-ai/dsh-app-boot": "0.2.2-alpha.3",
52
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.2-alpha.3",
53
+ "@deepseek-ai/dsh-system-prompt": "0.2.2-alpha.3",
54
+ "@deepseek-ai/dsh-tool-executor-native": "0.2.2-alpha.3",
55
+ "@deepseek-ai/dsh-tools": "0.2.2-alpha.3",
56
+ "@deepseek-ai/schemastery": "~3.18.6-alpha.2"
57
57
  }
58
58
  }