@deepseek-ai/dsh-tool-cordis 0.2.1-alpha.2 → 0.2.1-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.
@@ -135,7 +135,7 @@ export const SERVICE_API = [
135
135
  },
136
136
  {
137
137
  signature: '@Remote(\'select\') async select(agent: Agent, agentPreset: string): Promise<string>',
138
- description: 'Select a preset before a session starts its first turn.',
138
+ description: 'Select a preset before a session starts its first turn. A Session whose log records the preset and whose Agent runs its current revision keeps its composition; nothing is logged or announced.',
139
139
  parameters: [{ name: 'agent', description: 'Target Agent.' }, { name: 'agentPreset', description: 'Requested identity.' }],
140
140
  returns: 'Committed preset identity.',
141
141
  },
@@ -686,8 +686,8 @@ export const SERVICE_API = [
686
686
  parameters: [],
687
687
  },
688
688
  {
689
- signature: 'readonly operator: PeerScope',
690
- description: 'The operator Peer every admitted request speaks for; its scope lives as long as Connection.',
689
+ signature: 'readonly browserPeer: PeerScope',
690
+ description: 'The owner Peer every authenticated browser connection shares.',
691
691
  parameters: [],
692
692
  },
693
693
  {
@@ -709,9 +709,21 @@ export const SERVICE_API = [
709
709
  },
710
710
  {
711
711
  signature: 'admit(request: ConnectionTrustRequest): PeerAdmission',
712
- description: 'Admit one request: it passes requestRejection and speaks for the operator, or it is refused with that status.',
712
+ description: 'Admit an HTTP request against its signed browser or API credential and live Peer.',
713
713
  parameters: [{ name: 'request', description: 'request headers from the HTTP or upgrade request.' }],
714
- returns: 'the operator Peer, or the rejection status.',
714
+ returns: 'the credential\'s Peer, or the rejection status.',
715
+ },
716
+ {
717
+ signature: 'createPeer(options: { readonly principal: Principal; readonly interactions?: \'answer\' | \'none\' }): PeerScope',
718
+ description: 'Create an independent in-process Peer, disposed with the Context that read `ctx.connection`.',
719
+ parameters: [{ name: 'options', description: 'fixed principal and optional interaction participation (default `answer`).' }],
720
+ returns: 'a new Peer distinct from every other Peer.',
721
+ },
722
+ {
723
+ signature: 'admitConnection(request: ConnectionTrustRequest): ConnectionAdmission',
724
+ description: 'Claim a physical socket for an API Peer; browser sockets share their owner Peer.',
725
+ parameters: [{ name: 'request', description: 'authenticated upgrade request headers.' }],
726
+ returns: 'the Peer and idempotent release, or 409 for duplicate API ownership. The carrier releases on socket termination or failed upgrade; release removes API admission synchronously without cancelling independent HTTP calls.',
715
727
  },
716
728
  {
717
729
  signature: 'authorizeIndex(request: ConnectionIndexRequest, response: ConnectionIndexResponse): boolean',
@@ -749,7 +761,7 @@ export const SERVICE_API = [
749
761
  {
750
762
  key: 'credentials',
751
763
  summary: 'Abstract credential service over two key spaces that answer two questions.',
752
- description: 'Abstract credential service over two key spaces that answer two questions.\n\nA CredentialRef answers "what is behind this environment-variable name", layered over the process environment, the provider-managed store, and `.env` files. One seam-wide rule binds that half: an empty stored value is absent everywhere — `resolve` skips it, `describe` reports it unconfigured — so a blank never masquerades as a configured secret.\n\nA CredentialKey answers "what credential does this plugin hold for this id". Nothing can layer here — an authorization grant has no environment to be read from — so presence of the record is the whole fact, and modifyRecord is the only write path because a correct write depends on the current value (a token refresh is read-decide-replace under one lock).',
764
+ description: 'Abstract credential service over two key spaces that answer two questions.\n\nA CredentialRef answers "what is behind this environment-variable name": the provider-managed store first, then ambient fallbacks such as the process environment and `.env` files. One seam-wide rule binds that half: an empty stored value is absent everywhere — `resolve` skips it, `describe` reports it unconfigured — so a blank never masquerades as a configured secret.\n\nA CredentialKey answers "what credential does this plugin hold for this id". Nothing can layer here — an authorization grant has no environment to be read from — so presence of the record is the whole fact, and modifyRecord is the only write path because a correct write depends on the current value (a token refresh is read-decide-replace under one lock).',
753
765
  methods: [
754
766
  {
755
767
  signature: 'abstract resolve(ref: CredentialRef): Promise<ResolvedCredential | undefined>',
@@ -765,12 +777,12 @@ export const SERVICE_API = [
765
777
  },
766
778
  {
767
779
  signature: 'abstract set(ref: CredentialRef, value: string): Promise<void>',
768
- description: 'Durably store one value in the provider-managed writable source. Rejects while a read-only source shadows the reference — the write would appear to succeed while resolution keeps returning the shadowing value — and rejects an empty value (use unset).',
780
+ description: 'Durably store one value in the provider-managed writable source. The stored value takes precedence over ambient fallbacks, and empty values are rejected (use unset).',
769
781
  parameters: [{ name: 'ref', description: 'the reference to store.' }, { name: 'value', description: 'the non-empty secret value.' }],
770
782
  },
771
783
  {
772
784
  signature: 'abstract unset(ref: CredentialRef): Promise<void>',
773
- description: 'Remove one reference from the provider-managed writable source; removing an absent reference is a no-op. Rejects while a read-only source shadows the reference, like set.',
785
+ description: 'Remove one reference from the provider-managed writable source; removing an absent reference is a no-op. Ambient fallback layers may become effective again after removal.',
774
786
  parameters: [{ name: 'ref', description: 'the reference to remove.' }],
775
787
  },
776
788
  {
@@ -843,7 +855,7 @@ export const SERVICE_API = [
843
855
  },
844
856
  {
845
857
  signature: 'abstract getProfile(client: AccountClientMetadata): Promise<AccountDetails[\'profile\'] | null>',
846
- description: 'Query Platform profile independently of wallet balances. A ready result whose stable profile ID first becomes available or changes notifies watch consumers, so identity consumers re-read getPlatformSession; repeated IDs stay silent.',
858
+ description: 'Query Platform profile independently of wallet balances. A ready result whose stable profile ID first becomes available or changes notifies identity-enabled watch consumers, so they re-read getPlatformSession; repeated IDs stay silent.',
847
859
  parameters: [{ name: 'client', description: 'identity of the requesting UI for this call.' }],
848
860
  returns: 'profile outcome, or null if signed out or the grant changed during the query.',
849
861
  },
@@ -884,9 +896,9 @@ export const SERVICE_API = [
884
896
  returns: 'the signed-out state after local removal; remote failures never restore the grant.',
885
897
  },
886
898
  {
887
- signature: 'abstract watch(signal: AbortSignal): AsyncIterable<AccountView>',
899
+ signature: 'abstract watch(signal: AbortSignal, includeIdentityChanges?: boolean): AsyncIterable<AccountView>',
888
900
  description: 'Subscribe to snapshots including a complete initial state.',
889
- parameters: [{ name: 'signal', description: 'subscription lifetime; ending it never cancels login.' }],
901
+ parameters: [{ name: 'signal', description: 'subscription lifetime; ending it never cancels login.' }, { name: 'includeIdentityChanges', description: 'also notify when cached Platform identity changes; defaults to false.' }],
890
902
  returns: 'complete snapshots as account state changes.',
891
903
  },
892
904
  {
@@ -1227,6 +1239,13 @@ export const SERVICE_API = [
1227
1239
  parameters: [{ name: 'url', description: 'Module URL.' }],
1228
1240
  returns: 'Linked module URLs, or an empty list for an uncached module.',
1229
1241
  },
1242
+ {
1243
+ signature: 'async reconcileProfile(requiredIds: readonly string[] = []): Promise<ProfileReconciliation>',
1244
+ description: 'Recompose the profile from its manifest and patch files, replacing running plugins whose loaded files below the profile directory or its linked package targets changed on disk, and publishing its runtime resolution. Changed modules are evicted and the Loader entries running them stop; app-boot\'s recomposeProfile then publishes the resolution, applies the generation, starts the stopped entries with the current files and configuration, imports entries whose import failed again, and judges activation. Afterwards the modules below the mappings the recomposition dropped are evicted, so a removed or deselected package is imported afresh when it returns. Callers run inside runExclusive.',
1245
+ parameters: [{ name: 'requiredIds', description: 'Entry ids whose inactive state is reported as a failure even when it predates this call.' }],
1246
+ returns: 'Inactive-entry diagnostics, the changed modules that load after a restart, and a profile-wide restart reason.',
1247
+ throws: ['The patch read, publication, preparation, apply, or activation failure of the recomposition, including a replacement plugin that fails to load or start, whose previous code no longer runs.'],
1248
+ },
1230
1249
  ],
1231
1250
  },
1232
1251
  {
@@ -1285,7 +1304,7 @@ export const SERVICE_API = [
1285
1304
  signature: 'abstract start(spec: JobSpec): JobId',
1286
1305
  description: 'Preflight access, validation, owner cleanup, and implementation-owned admission before starting and atomically registering work. Any preflight rejection leaves no job id or execution resource. A throwing starter leaves nothing registered; after it returns, registration cannot fail.',
1287
1306
  parameters: [{ name: 'spec', description: 'job identity, owner, output sources, and synchronous starter.' }],
1288
- returns: 'the registry-issued `<kind>-N` id.',
1307
+ returns: 'the registry-issued `<kind>-<short-uuid>` id.',
1289
1308
  },
1290
1309
  {
1291
1310
  signature: 'abstract list(caller?: SessionId): JobView[]',
@@ -1396,6 +1415,12 @@ export const SERVICE_API = [
1396
1415
  parameters: [{ name: 'provider', description: 'provider route named by a request header.' }, { name: 'model', description: 'exact model id named by the same header.' }],
1397
1416
  returns: 'the owning adapter\'s image pricing for the route, when declared.',
1398
1417
  },
1418
+ {
1419
+ signature: 'imageRequestTarget(provider: string, model: string, image: ImageAttachmentRef): ImageRequestTarget',
1420
+ description: 'Resolve the image projection for an exact registered model route.',
1421
+ parameters: [{ name: 'provider', description: 'registered provider route.' }, { name: 'model', description: 'exact model id.' }, { name: 'image', description: 'normalized image reference.' }],
1422
+ returns: 'dimensions and byte target used by the adapter\'s request serializer.',
1423
+ },
1399
1424
  {
1400
1425
  signature: 'fileRequestText(ref: FileAttachmentRef): string',
1401
1426
  description: 'Resolve the exact text one durable file occurrence contributes to every provider request in the current execution environment.',
@@ -1764,7 +1789,7 @@ export const SERVICE_API = [
1764
1789
  {
1765
1790
  key: 'ptcRuntime',
1766
1791
  summary: 'Registers one `ctx.ptcRuntime` implementation.',
1767
- description: 'Registers one `ctx.ptcRuntime` implementation. Program, budget, abort, and substrate failures resolve in PtcRunResult; only Service Definition contract misuse rejects. Implementations bridge structured-cloneable bindings, materialize each declared namespace rejection class, treat programs as hostile peers, isolate runs from one another, and terminate and await in-flight runs during disposal.',
1792
+ description: 'Registers one `ctx.ptcRuntime` implementation. Program, budget, abort, and substrate failures resolve in PtcRunResult; only Service Definition contract misuse rejects. Implementations bridge structured-cloneable bindings, materialize each declared namespace rejection class, treat programs as hostile peers, isolate distinct state owners, and terminate and await in-flight runs during disposal.',
1768
1793
  methods: [
1769
1794
  {
1770
1795
  signature: 'abstract readonly language: string',
@@ -1776,6 +1801,13 @@ export const SERVICE_API = [
1776
1801
  description: 'The execution substrate, as a lowercase identifier. Informational, not gating — a descriptor so deployments and diagnostics can tell backends apart, not a security claim. Well-known values: `\'worker-thread\'`, `\'process\'`, `\'container\'`.',
1777
1802
  parameters: [],
1778
1803
  },
1804
+ {
1805
+ signature: 'release(owner: object): Promise<void>',
1806
+ description: 'Release an owner\'s retained environment and await its execution resources. Stateless providers have no retained resources to release.',
1807
+ parameters: [{ name: 'owner', description: 'The exact object supplied as the request\'s state owner.' }],
1808
+ returns: 'Completion after all owned execution resources have been released.',
1809
+ throws: ['When managed resource cleanup fails.'],
1810
+ },
1779
1811
  {
1780
1812
  signature: 'abstract resolve(request: PtcRunRequest): PtcRunSpec',
1781
1813
  description: 'Resolve supported options and provider defaults before execution.',
@@ -1791,6 +1823,49 @@ export const SERVICE_API = [
1791
1823
  },
1792
1824
  ],
1793
1825
  },
1826
+ {
1827
+ key: 'remoteAccess',
1828
+ summary: 'Registry of access policies, the Gateway\'s access decisions, list filtering, and the per-Peer access snapshot.',
1829
+ description: 'Registry of access policies, the Gateway\'s access decisions, list filtering, and the per-Peer access snapshot. Every composition that mounts the Gateway mounts this service too.',
1830
+ methods: [
1831
+ {
1832
+ signature: 'registerPolicy<K extends Exclude<keyof PrincipalMap, \'owner\'>>(kind: K, policy: RemoteAccessPolicy<PrincipalMap[K]>): () => void',
1833
+ description: 'Register the policy of one non-owner principal kind in the caller\'s fiber; open snapshots are recomputed on registration and removal.',
1834
+ parameters: [{ name: 'kind', description: 'the principal kind the policy serves; never `owner`.' }, { name: 'policy', description: 'business-owned bindings and refusal reasons for principals of `kind`.' }],
1835
+ returns: 'disposer removing this policy.',
1836
+ throws: ['Error when `kind` already has a policy.'],
1837
+ },
1838
+ {
1839
+ signature: 'invalidate(principal?: Principal): void',
1840
+ description: 'Report that the bindings or condition answers for `principal` may have changed. Business packages call this on every grant, revocation, mode change, and expiry; open snapshots re-push, and the next failure of each policy is logged again.',
1841
+ parameters: [{ name: 'principal', description: 'affected principal; omitted for every principal.' }],
1842
+ },
1843
+ {
1844
+ signature: 'decide(request: RemoteAccessRequest<Principal>): RemoteAccessDecision',
1845
+ description: 'Gateway-only: decide one request whose resources the Gateway resolved. The owner is allowed, and so is `remoteAccess/follow`: every Peer reads its own snapshot. Otherwise the action is allowed only when, on every listed resource, some binding of the principal\'s policy names that resource, has a role listing the action, and has no condition or a condition that allows. `bindings()` is called once per decision.',
1846
+ parameters: [{ name: 'request', description: 'the caller or recipient, the action, the resources it touches, and a call\'s arguments.' }],
1847
+ returns: '`allow`; or `deny` with `no-allow` when the principal kind has no policy, the first refusing condition\'s reason on the first resource no binding allows, else `explain()`\'s reason, else `no-allow`; `policy-failed` when `bindings()`, a condition, or `explain()` throws, logged once per policy until the next `invalidate()`. The Gateway throws `remote-access/denied` for a denied call and drops a denied event.',
1848
+ },
1849
+ {
1850
+ signature: 'allows(resource: RemoteAccessResource): boolean',
1851
+ description: 'Filter items inside a Remote method. The invocation is read from the Context that accessed this service, so call it as `this.ctx.remoteAccess.allows(resource)` from the Remote method. Each check reads the policy\'s bindings again, so a long-running stream sees binding changes from the next check on.',
1852
+ parameters: [{ name: 'resource', description: 'resource of one result item.' }],
1853
+ returns: 'true for the owner and outside a Remote call; otherwise whether the invocation\'s endpoint action is allowed on `resource` without call arguments, false when the policy is absent or fails.',
1854
+ },
1855
+ {
1856
+ signature: 'snapshotFor(principal: Principal): RemoteAccessBaseline',
1857
+ description: 'The baseline a page opens with before its snapshot stream connects. A business package rendering a non-owner page assigns this value to REMOTE_ACCESS_SNAPSHOT_KEY after every index injection row, replacing the owner baseline the webServer index carries.',
1858
+ parameters: [{ name: 'principal', description: 'the page\'s caller identity.' }],
1859
+ returns: 'the owner baseline for the owner; otherwise the principal\'s current grants.',
1860
+ },
1861
+ {
1862
+ signature: '@Remote({ mode: \'stream\' }) async *follow(signal: AbortSignal): AsyncIterable<RemoteAccessFrame>',
1863
+ description: 'Stream the calling Peer\'s access snapshot: one baseline, then `upsert` and `remove` frames after each `invalidate()` and each policy registration or removal that changes a grant. The owner receives only `{ owner: true }`. The generation ends when `signal` aborts or this service unloads, so a reloaded service starts every reader from a fresh baseline.',
1864
+ parameters: [{ name: 'signal', description: 'generation cancellation.' }],
1865
+ returns: 'the access frames of one generation.',
1866
+ },
1867
+ ],
1868
+ },
1794
1869
  {
1795
1870
  key: 'sandbox',
1796
1871
  summary: 'Abstract process-sandbox service.',
@@ -1901,16 +1976,16 @@ export const SERVICE_API = [
1901
1976
  returns: 'visible Session summaries ordered by activity.',
1902
1977
  },
1903
1978
  {
1904
- signature: '@Remote(\'search\') search(request: SessionSearchRequest, signal: AbortSignal): Promise<SessionSearchValue>',
1905
- description: 'Search visible Session content without resuming an Agent.',
1979
+ signature: '@Remote(\'search\') async search(request: SessionSearchRequest, signal: AbortSignal): Promise<SessionSearchValue>',
1980
+ description: 'Search visible Session content without resuming an Agent. A non-owner receives only the hits whose Session `allows()` admits; `hasMore` describes the bounded result before that filtering.',
1906
1981
  parameters: [{ name: 'request', description: 'literal message-content query.' }, { name: 'signal', description: 'cancellation for list and search reads.' }],
1907
1982
  returns: 'authorized bounded Session search results.',
1908
1983
  },
1909
1984
  {
1910
1985
  signature: '@Remote(\'create\') create(request: SessionCreateRequest): Promise<SessionCreateValue>',
1911
- description: 'Create or idempotently adopt one ordinary Session.',
1912
- parameters: [{ name: 'request', description: 'requested identity, location, and Agent preset.' }],
1913
- returns: 'the Session identity and resolved preset when configured.',
1986
+ description: 'Create one ordinary Session for a new conversation, reusing the named blank Session while it is reusable.',
1987
+ parameters: [{ name: 'request', description: 'optional blank Session to reuse, location, and Agent preset.' }],
1988
+ returns: 'the created or reused Session identity and its preset when configured.',
1914
1989
  },
1915
1990
  {
1916
1991
  signature: '@Remote(\'selectModel\') selectModel(request: SessionSelectModelRequest): Promise<SessionSelectModelValue>',
@@ -1969,7 +2044,7 @@ export const SERVICE_API = [
1969
2044
  returns: 'the new Session identity.',
1970
2045
  },
1971
2046
  {
1972
- signature: '@Remote(\'prompt\') prompt(request: SessionPromptRequest, signal: AbortSignal): Promise<SessionPromptValue>',
2047
+ signature: '@Remote(\'prompt\') async prompt(request: SessionPromptRequest, signal: AbortSignal): Promise<SessionPromptValue>',
1973
2048
  description: 'Admit one prompt after explicitly resuming its Session.',
1974
2049
  parameters: [{ name: 'request', description: 'Session identity, prompt content, source metadata, and delivery mode.' }, { name: 'signal', description: 'caller cancellation before prompt admission begins.' }],
1975
2050
  returns: 'acknowledgement that the Agent accepted the prompt.',
@@ -1993,13 +2068,13 @@ export const SERVICE_API = [
1993
2068
  returns: 'acknowledgement that cancellation was requested.',
1994
2069
  },
1995
2070
  {
1996
- signature: '@Remote(\'page\') page(request: SessionPageRequest, signal: AbortSignal): Promise<SessionPage>',
2071
+ signature: '@Remote({ name: \'page\', resources: { session: addressedSession } }) page(request: SessionPageRequest, signal: AbortSignal): Promise<SessionPage>',
1997
2072
  description: 'Read one cold-safe, message-aligned Session history page.',
1998
2073
  parameters: [{ name: 'request', description: 'durable address, backward cursor, and page budget.' }, { name: 'signal', description: 'cancellation for persistence reads.' }],
1999
2074
  returns: 'one chronological page.',
2000
2075
  },
2001
2076
  {
2002
- signature: '@Remote({ mode: \'stream\' }) follow(request: SessionFollowRequest, signal: AbortSignal): AsyncIterable<SessionFollowFrame>',
2077
+ signature: '@Remote({ mode: \'stream\', resources: { session: addressedSession } }) follow(request: SessionFollowRequest, signal: AbortSignal): AsyncIterable<SessionFollowFrame>',
2003
2078
  description: 'Follow one Session log from its opening or resume cursor.',
2004
2079
  parameters: [{ name: 'request', description: 'durable address and last committed sequence already held by the caller.' }, { name: 'signal', description: 'cancellation owned by the Remote stream carrier.' }],
2005
2080
  returns: 'a complete opening snapshot followed by gap-free durable event frames and optional cursorless assistant-stream frames.',
@@ -2011,7 +2086,7 @@ export const SERVICE_API = [
2011
2086
  returns: 'a sequenced baseline, cached hints when migration is deferred, or null when absent.',
2012
2087
  },
2013
2088
  {
2014
- signature: '@Remote({ mode: \'stream\' }) control(signal: AbortSignal): AsyncIterable<SessionControlFrame>',
2089
+ signature: '@Remote({ mode: \'stream\' }) async *control(signal: AbortSignal): AsyncIterable<SessionControlFrame>',
2015
2090
  description: 'Stream a complete live-control baseline followed by replacement frames.',
2016
2091
  parameters: [{ name: 'signal', description: 'cancellation owned by the Remote stream carrier.' }],
2017
2092
  returns: 'one complete baseline followed by live replacement frames.',
@@ -3069,22 +3144,10 @@ export const SERVICE_API = [
3069
3144
  returns: 'a hold acknowledgement followed by an open lifetime stream.',
3070
3145
  },
3071
3146
  {
3072
- signature: '@Remote({ mode: \'stream\' }) follow(agent: Agent, id: WebTerminalId, attachmentId: TerminalAttachmentId, signal: AbortSignal): AsyncIterable<TerminalFrame>',
3073
- description: 'Attach to a terminal without binding its process lifetime to the transport.',
3074
- parameters: [{ name: 'agent', description: 'Session owner supplied by the Gateway.' }, { name: 'id', description: 'terminal identity.' }, { name: 'attachmentId', description: 'new exclusive input attachment.' }, { name: 'signal', description: 'physical stream cancellation.' }],
3075
- returns: 'screen recovery followed by output and metadata changes.',
3076
- },
3077
- {
3078
- signature: '@Remote async write(agent: Agent, id: WebTerminalId, attachmentId: TerminalAttachmentId, data: string): Promise<void>',
3079
- description: 'Deliver raw input, including Tab completion and control characters.',
3080
- parameters: [{ name: 'agent', description: 'Session owner supplied by the Gateway.' }, { name: 'id', description: 'terminal identity.' }, { name: 'attachmentId', description: 'current writable attachment.' }, { name: 'data', description: 'input bytes represented as UTF-8 text.' }],
3081
- returns: 'after provider input acceptance.',
3082
- },
3083
- {
3084
- signature: '@Remote async resize(agent: Agent, id: WebTerminalId, attachmentId: TerminalAttachmentId, cols: number, rows: number): Promise<void>',
3085
- description: 'Update the dimensions of the PTY and recovery screen.',
3086
- parameters: [{ name: 'agent', description: 'Session owner supplied by the Gateway.' }, { name: 'id', description: 'terminal identity.' }, { name: 'attachmentId', description: 'current writable attachment.' }, { name: 'cols', description: 'column count.' }, { name: 'rows', description: 'row count.' }],
3087
- returns: 'after the resize completes.',
3147
+ signature: '@Remote({ mode: \'stream\' }) attach(agent: Agent, id: WebTerminalId, signal: AbortSignal): RemoteStream<TerminalFrame, TerminalInput>',
3148
+ description: 'Attach terminal input and output to one physical Remote stream.',
3149
+ parameters: [{ name: 'agent', description: 'Session owner supplied by the Gateway.' }, { name: 'id', description: 'terminal identity.' }, { name: 'signal', description: 'attachment cancellation; the process remains alive and input is never replayed.' }],
3150
+ returns: 'screen recovery, output, writable state and provider-acceptance acknowledgements.',
3088
3151
  },
3089
3152
  {
3090
3153
  signature: '@Remote rename(agent: Agent, id: WebTerminalId, title: string): void',
@@ -3389,9 +3452,9 @@ export const SERVICE_API = [
3389
3452
  },
3390
3453
  {
3391
3454
  signature: 'hasLiveClient(): boolean',
3392
- description: 'Check for an active Client event stream.',
3455
+ description: 'Check for an active owner Client event stream, the only kind that can answer forwarded waterfalls.',
3393
3456
  parameters: [],
3394
- returns: 'whether a stream is open and has not been cancelled.',
3457
+ returns: 'whether an owner stream is open and has not been cancelled.',
3395
3458
  },
3396
3459
  {
3397
3460
  signature: 'registerRemoteEvents( source: TypertRemoteEventSource, host: RemoteEventHostInfo, ): () => Promise<void>',
@@ -3479,6 +3542,19 @@ export const SERVICE_API = [
3479
3542
  },
3480
3543
  ],
3481
3544
  },
3545
+ {
3546
+ key: 'webApp',
3547
+ summary: 'The Web GUI this process serves, provided by the `web-runtime` row.',
3548
+ description: 'The Web GUI this process serves, provided by the `web-runtime` row.',
3549
+ methods: [
3550
+ {
3551
+ signature: 'getAdvertisedUrl(): string',
3552
+ description: 'The URL this GUI advertises, also used for `DSH_WEB_URL` and the startup URL line.',
3553
+ parameters: [],
3554
+ returns: 'the configured `publicUrl`, otherwise the listener origin.',
3555
+ },
3556
+ ],
3557
+ },
3482
3558
  {
3483
3559
  key: 'webhookRuntime',
3484
3560
  summary: 'Fire-and-forget rule runtime.',
@@ -3503,6 +3579,13 @@ export const SERVICE_API = [
3503
3579
  summary: 'The browser HTTP carrier service.',
3504
3580
  description: 'The browser HTTP carrier service. Activation loads any configured TLS material, then listens immediately; a material or listen failure rejects initialization, and the boot process reports the failed fiber. Route registration order does not affect requests because configured named routes must be distinct, and the fallback handler answers anything not yet claimed during startup with 404 until its owner registers.',
3505
3581
  methods: [
3582
+ {
3583
+ signature: 'getOrigin(): string',
3584
+ description: 'The root URL local clients use to reach the bound listener: the protocol, the bindUrlHost form of the bind address, and the listening port.',
3585
+ parameters: [],
3586
+ returns: 'the origin, for example `http://127.0.0.1:3080`.',
3587
+ throws: ['before `listen` binds a port, or when the bind address has no URL form.'],
3588
+ },
3506
3589
  {
3507
3590
  signature: 'register(route: WebRoute): () => void',
3508
3591
  description: 'Register a named route. Duplicate (kind, path) throws — route patterns are a composition-level contract, so a collision is a misconfiguration.',
@@ -3678,8 +3761,8 @@ export const SERVICE_API = [
3678
3761
  returns: 'the complete resulting pin set, most recently pinned first.',
3679
3762
  },
3680
3763
  {
3681
- signature: '@Remote({ mode: \'stream\' }) follow(signal: AbortSignal): AsyncIterable<WorkspaceFollowFrame>',
3682
- description: 'Stream a complete Workspace baseline followed by ordered increments.',
3764
+ signature: '@Remote({ mode: \'stream\' }) async *follow(signal: AbortSignal): AsyncIterable<WorkspaceFollowFrame>',
3765
+ description: 'Stream a complete Workspace baseline followed by ordered increments. A non-owner receives only the Workspaces and Sessions `allows()` admits. When a delivered Workspace is no longer admitted at its next change or the next order change, the stream sends a `replace` frame with the complete filtered state instead of a `remove`, because a Client never resurrects a removed Workspace; a `remove` frame reports a deletion and reaches only a Client that received that Workspace.',
3683
3766
  parameters: [{ name: 'signal', description: 'generation cancellation.' }],
3684
3767
  returns: 'baseline followed by ordered Workspace increments.',
3685
3768
  },
@@ -4797,7 +4880,7 @@ export const TYPE_API = [
4797
4880
  },
4798
4881
  {
4799
4882
  name: 'ChangeResult',
4800
- declaration: 'export interface ChangeResult {\n changed: boolean;\n application: \'applied\' | \'restart-required\' | \'overridden\' | \'failed\' | \'cancelled\';\n stage: \'install\' | \'enable\' | \'remove\';\n target: string;\n enabled?: boolean;\n error?: ManagementError;\n warnings?: string[];\n packageResult?: PackageResult;\n bundle?: string;\n version?: string;\n pendingBuilds?: string[];\n approvedBuilds?: string[];\n registries?: Registry[];\n failedAt?: \'registry\' | \'spec-host\';\n}',
4883
+ declaration: 'export interface ChangeResult {\n changed: boolean;\n application: \'applied\' | \'restart-required\' | \'overridden\' | \'failed\' | \'cancelled\';\n restartReason?: RestartReason;\n stage: \'install\' | \'enable\' | \'remove\';\n target: string;\n enabled?: boolean;\n error?: ManagementError;\n warnings?: string[];\n packageResult?: PackageResult;\n bundle?: string;\n version?: string;\n pendingBuilds?: string[];\n approvedBuilds?: string[];\n registries?: Registry[];\n failedAt?: \'registry\' | \'spec-host\';\n}',
4801
4884
  },
4802
4885
  {
4803
4886
  name: 'ClientArtifactBaseline',
@@ -4899,9 +4982,13 @@ export const TYPE_API = [
4899
4982
  name: 'ConfinedSandboxMode',
4900
4983
  declaration: 'export type ConfinedSandboxMode = Exclude<SandboxMode, \'danger-full-access\'>;',
4901
4984
  },
4985
+ {
4986
+ name: 'ConnectionAdmission',
4987
+ declaration: 'export type ConnectionAdmission = {\n readonly peer: PeerScope;\n readonly release: () => Promise<void>;\n} | {\n readonly rejection: 401 | 403 | 409;\n};',
4988
+ },
4902
4989
  {
4903
4990
  name: 'ConnectionFetchHandler',
4904
- declaration: 'export interface ConnectionFetchHandler {\n requestBodyMode(request: {\n readonly method: string;\n readonly url: URL;\n }): ConnectionRequestBodyMode;\n fetch(request: Request): Promise<Response>;\n}',
4991
+ declaration: 'export interface ConnectionFetchHandler {\n requestBodyMode(request: {\n readonly method: string;\n readonly url: URL;\n }): ConnectionRequestBodyMode;\n fetch(request: Request, peer: PeerScope): Promise<Response>;\n}',
4905
4992
  },
4906
4993
  {
4907
4994
  name: 'ConnectionFetchMethod',
@@ -5541,11 +5628,11 @@ export const TYPE_API = [
5541
5628
  },
5542
5629
  {
5543
5630
  name: 'InvocationDescriptor',
5544
- 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 sourceLocation?: InvocationSourceLocation;\n}',
5631
+ 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}',
5545
5632
  },
5546
5633
  {
5547
5634
  name: 'InvocationParameterDescriptor',
5548
- declaration: 'export interface InvocationParameterDescriptor {\n readonly name: string;\n readonly wire: string;\n readonly source: \'json\' | \'lookup\';\n readonly lookup?: string;\n readonly codec: TypertCodec;\n readonly acceptsUndefined?: true;\n}',
5635
+ declaration: 'export interface InvocationParameterDescriptor {\n readonly name: string;\n readonly description?: string;\n readonly wire: string;\n readonly source: \'json\' | \'lookup\';\n readonly lookup?: string;\n readonly codec: TypertCodec;\n readonly acceptsUndefined?: true;\n}',
5549
5636
  },
5550
5637
  {
5551
5638
  name: 'InvocationSourceLocation',
@@ -5553,7 +5640,7 @@ export const TYPE_API = [
5553
5640
  },
5554
5641
  {
5555
5642
  name: 'InvokeRemoteRequest',
5556
- declaration: 'export interface InvokeRemoteRequest {\n readonly namespace: string;\n readonly method: string;\n readonly args: Readonly<Record<string, unknown>>;\n readonly uplink?: AsyncIterable<unknown>;\n readonly peer?: PeerScope;\n readonly signal?: AbortSignal;\n}',
5643
+ declaration: 'export interface InvokeRemoteRequest {\n readonly namespace: string;\n readonly method: string;\n readonly args: Readonly<Record<string, unknown>>;\n readonly uplink?: AsyncIterable<unknown>;\n readonly uplinkWindow?: RemoteUplinkWindow | undefined;\n readonly peer: PeerScope;\n readonly signal?: AbortSignal;\n}',
5557
5644
  },
5558
5645
  {
5559
5646
  name: 'JobAppendOptions',
@@ -5653,12 +5740,16 @@ export const TYPE_API = [
5653
5740
  },
5654
5741
  {
5655
5742
  name: 'JobSpec',
5656
- declaration: 'export interface JobSpec {\n kind: JobKind;\n label: string;\n owner?: SessionId;\n outputLimitBytes?: number;\n output?: readonly JobOutputSource[];\n run(job: JobHandle): JobHooks;\n}',
5743
+ declaration: 'export interface JobSpec {\n kind: JobKind;\n label: string;\n owner?: SessionId;\n toolCall?: JobToolCall;\n outputLimitBytes?: number;\n output?: readonly JobOutputSource[];\n run(job: JobHandle): JobHooks;\n}',
5657
5744
  },
5658
5745
  {
5659
5746
  name: 'JobStatus',
5660
5747
  declaration: 'export type JobStatus = \'running\' | \'stopping\' | \'completed\' | \'killed\' | \'failed\';',
5661
5748
  },
5749
+ {
5750
+ name: 'JobToolCall',
5751
+ declaration: 'export interface JobToolCall {\n readonly callId: SessionEventMap[\'tool/call\'][\'callId\'];\n readonly rootCallId: SessionEventMap[\'tool/call\'][\'callId\'];\n}',
5752
+ },
5662
5753
  {
5663
5754
  name: 'JobView',
5664
5755
  declaration: 'export interface JobView {\n readonly id: JobId;\n readonly kind: string;\n readonly label: string;\n readonly owner?: SessionId;\n readonly outputLimitBytes?: number;\n readonly status: JobStatus;\n readonly progress?: string;\n readonly detail?: string;\n readonly startedAt: number;\n readonly finishedAt?: number;\n readonly output: {\n readonly total: number;\n readonly earliest: number;\n readonly spillPaths?: readonly string[];\n };\n}',
@@ -5697,7 +5788,7 @@ export const TYPE_API = [
5697
5788
  },
5698
5789
  {
5699
5790
  name: 'LlmAdapter',
5700
- declaration: 'export abstract class LlmAdapter {\n providerInfo(provider: string): LlmProviderInfo;\n providerRetryPolicy(_provider: string): ResolvedRetryPolicy | undefined;\n imageRequestPricing(_provider: string, _model: string): LlmImageRequestPricing | undefined;\n listModels(_provider: string): Promise<readonly LlmModelInfo[]>;\n resolveModel(provider: string, model: string, _signal?: AbortSignal): Promise<LlmResolvedModelInfo>;\n async prepareCall(provider: string, model: string, signal?: AbortSignal): Promise<PreparedAdapterCall>;\n abstract stream(options: GenerateOptions): AsyncIterable<StreamChunk>;\n}',
5791
+ declaration: 'export abstract class LlmAdapter {\n providerInfo(provider: string): LlmProviderInfo;\n providerRetryPolicy(_provider: string): ResolvedRetryPolicy | undefined;\n imageRequestPricing(_provider: string, _model: string): LlmImageRequestPricing | undefined;\n imageRequestTarget(_provider: string, _model: string, image: ImageAttachmentRef): ImageRequestTarget;\n listModels(_provider: string): Promise<readonly LlmModelInfo[]>;\n resolveModel(provider: string, model: string, _signal?: AbortSignal): Promise<LlmResolvedModelInfo>;\n async prepareCall(provider: string, model: string, signal?: AbortSignal): Promise<PreparedAdapterCall>;\n abstract stream(options: GenerateOptions): AsyncIterable<StreamChunk>;\n}',
5701
5792
  },
5702
5793
  {
5703
5794
  name: 'LlmAttemptId',
@@ -5717,7 +5808,7 @@ export const TYPE_API = [
5717
5808
  },
5718
5809
  {
5719
5810
  name: 'LlmConfigurableProvider',
5720
- declaration: 'export interface LlmConfigurableProvider {\n provider: string;\n displayName: string;\n settingsNs: string;\n settingsPath: readonly string[];\n declared?: boolean;\n error?: string;\n}',
5811
+ declaration: 'export interface LlmConfigurableProvider {\n provider: string;\n displayName: string;\n settingsNs: string;\n settingsPath: readonly string[];\n declared?: boolean;\n defaultBaseURL?: string;\n baseURLEnv?: readonly string[];\n nativeAuth?: LlmNativeAuth;\n error?: string;\n}',
5721
5812
  },
5722
5813
  {
5723
5814
  name: 'LlmDiscoveredModel',
@@ -5751,6 +5842,10 @@ export const TYPE_API = [
5751
5842
  name: 'LlmModelReasoningInfo',
5752
5843
  declaration: 'export interface LlmModelReasoningInfo {\n efforts: readonly LlmReasoningEffortInfo[];\n defaultEffort?: ReasoningEffortId;\n}',
5753
5844
  },
5845
+ {
5846
+ name: 'LlmNativeAuth',
5847
+ declaration: 'export interface LlmNativeAuth {\n env: readonly string[];\n oauth: boolean;\n}',
5848
+ },
5754
5849
  {
5755
5850
  name: 'LlmProviderInfo',
5756
5851
  declaration: 'export interface LlmProviderInfo {\n id: string;\n name: string;\n}',
@@ -5765,7 +5860,7 @@ export const TYPE_API = [
5765
5860
  },
5766
5861
  {
5767
5862
  name: 'LlmRuntime',
5768
- declaration: 'export class LlmRuntime extends TypertRemoteService {\n constructor(ctx: Context);\n registerAdapter(providers: string[], adapter: LlmAdapter): AdapterRegistrationHandle;\n @Remote\n listProviders(): LlmProviderInfo[];\n registerConfigurableProviders(entries: readonly LlmConfigurableProvider[]): DirectoryRegistrationHandle;\n @Remote\n listConfigurableProviders(): LlmConfigurableProvider[];\n registerModelDiscovery(settingsNs: string, discover: (request: LlmModelDiscoveryRequest, signal?: AbortSignal) => Promise<readonly LlmDiscoveredModel[]>): () => void;\n async discoverModels(settingsNs: string, request: LlmModelDiscoveryRequest, signal?: AbortSignal): Promise<LlmDiscoveredModel[]>;\n @Remote(\'discoverModels\')\n async remoteDiscoverModels(settingsNs: string, request: LlmModelDiscoveryRequest, signal: AbortSignal): Promise<LlmDiscoveredModel[]>;\n providerRetryPolicy(provider: string): ResolvedRetryPolicy;\n imageRequestPricing(provider: string, model: string): LlmImageRequestPricing | undefined;\n fileRequestText(ref: FileAttachmentRef): string;\n async listModels(provider: string): Promise<LlmModelInfo[]>;\n async resolveModelInfo(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;\n async resolveCallConfig(config: LlmCallConfig, signal?: AbortSignal): Promise<LlmCallConfig>;\n async prepareCall(config: LlmCallConfig, signal?: AbortSignal, configure?: ConfigureCall): Promise<PreparedLlmCall>;\n strea /* …truncated — full shape in source */',
5863
+ declaration: 'export class LlmRuntime extends TypertRemoteService {\n constructor(ctx: Context);\n registerAdapter(providers: string[], adapter: LlmAdapter): AdapterRegistrationHandle;\n @Remote\n listProviders(): LlmProviderInfo[];\n registerConfigurableProviders(entries: readonly LlmConfigurableProvider[]): DirectoryRegistrationHandle;\n @Remote\n listConfigurableProviders(): LlmConfigurableProvider[];\n registerModelDiscovery(settingsNs: string, discover: (request: LlmModelDiscoveryRequest, signal?: AbortSignal) => Promise<readonly LlmDiscoveredModel[]>): () => void;\n async discoverModels(settingsNs: string, request: LlmModelDiscoveryRequest, signal?: AbortSignal): Promise<LlmDiscoveredModel[]>;\n @Remote(\'discoverModels\')\n async remoteDiscoverModels(settingsNs: string, request: LlmModelDiscoveryRequest, signal: AbortSignal): Promise<LlmDiscoveredModel[]>;\n providerRetryPolicy(provider: string): ResolvedRetryPolicy;\n imageRequestPricing(provider: string, model: string): LlmImageRequestPricing | undefined;\n imageRequestTarget(provider: string, model: string, image: ImageAttachmentRef): ImageRequestTarget;\n fileRequestText(ref: FileAttachmentRef): string;\n async listModels(provider: string): Promise<LlmModelInfo[]>;\n async resolveModelInfo(provider: string, model: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;\n async resolveCallConfig(config: LlmCallConfig, signal?: AbortSignal): Promise<LlmCallConfig>;\n async prepareCall(conf /* …truncated — full shape in source */',
5769
5864
  },
5770
5865
  {
5771
5866
  name: 'LocalAtInput',
@@ -5821,7 +5916,7 @@ export const TYPE_API = [
5821
5916
  },
5822
5917
  {
5823
5918
  name: 'ManagementError',
5824
- declaration: 'export interface ManagementError {\n code: ReadOnlyReason | \'unknown-plugin\' | \'invalid-spec\' | \'ambiguous-install\' | \'not-bundle\' | \'not-removable\' | \'stop-profile\' | \'bundle-in-use\' | \'stale-approval\' | \'incompatible-version\' | \'operation-error\';\n diagnostic?: string;\n incompatible?: IncompatiblePlugin[];\n}',
5919
+ declaration: 'export interface ManagementError {\n code: ReadOnlyReason | \'unknown-plugin\' | \'invalid-spec\' | \'already-installed\' | \'ambiguous-install\' | \'not-bundle\' | \'not-removable\' | \'stop-profile\' | \'bundle-in-use\' | \'stale-approval\' | \'incompatible-version\' | \'operation-error\';\n diagnostic?: string;\n incompatible?: IncompatiblePlugin[];\n}',
5825
5920
  },
5826
5921
  {
5827
5922
  name: 'ManualCompactAgentContext',
@@ -6085,7 +6180,11 @@ export const TYPE_API = [
6085
6180
  },
6086
6181
  {
6087
6182
  name: 'PeerScope',
6088
- declaration: 'export interface PeerScope {\n readonly id: PeerId;\n readonly ctx: Context;\n dispose(): Promise<void>;\n}',
6183
+ declaration: 'export interface PeerScope {\n readonly id: PeerId;\n readonly ctx: Context;\n readonly principal: Principal;\n readonly signal: AbortSignal;\n readonly interactions: \'answer\' | \'none\';\n dispose(): Promise<void>;\n}',
6184
+ },
6185
+ {
6186
+ name: 'PendingModule',
6187
+ declaration: 'export interface PendingModule {\n url: string;\n reason: \'host-module\' | \'unmanaged-plugin\' | \'module-comparison\';\n}',
6089
6188
  },
6090
6189
  {
6091
6190
  name: 'PermissionCatalog',
@@ -6207,6 +6306,14 @@ export const TYPE_API = [
6207
6306
  name: 'PreToolDecision',
6208
6307
  declaration: 'export type PreToolDecision = {\n kind: \'allow\';\n} | {\n kind: \'deny\';\n reason: string;\n info?: ToolErrorInfo;\n} | {\n kind: \'cancel\';\n} | {\n kind: \'ask\';\n reason?: string;\n displayReason?: {\n readonly en: string;\n readonly [locale: string]: string;\n };\n};',
6209
6308
  },
6309
+ {
6310
+ name: 'Principal',
6311
+ declaration: 'export type Principal = PrincipalMap[keyof PrincipalMap];',
6312
+ },
6313
+ {
6314
+ name: 'PrincipalMap',
6315
+ declaration: 'export interface PrincipalMap {\n owner: {\n readonly kind: \'owner\';\n };\n}',
6316
+ },
6210
6317
  {
6211
6318
  name: 'ProductEvent',
6212
6319
  declaration: 'export type ProductEvent = {\n [K in keyof ProductEventMap]: {\n eventName: K;\n attributes: ProductEventMap[K];\n timestamp: number;\n };\n}[keyof ProductEventMap];',
@@ -6223,6 +6330,10 @@ export const TYPE_API = [
6223
6330
  name: 'ProfilePnpmInvocation',
6224
6331
  declaration: 'export interface ProfilePnpmInvocation {\n readonly command: string;\n readonly args: readonly string[];\n readonly env: Readonly<Record<string, string>>;\n}',
6225
6332
  },
6333
+ {
6334
+ name: 'ProfileReconciliation',
6335
+ declaration: 'export interface ProfileReconciliation {\n warnings: string[];\n pending: PendingModule[];\n restartReason?: \'module-comparison\' | \'package-moved\';\n}',
6336
+ },
6226
6337
  {
6227
6338
  name: 'ProjectionChangeListener',
6228
6339
  declaration: 'export type ProjectionChangeListener = (session: Session, key: Extract<keyof SessionProjectionMap, string>, value: unknown, seq: SessionSeq) => void;',
@@ -6321,7 +6432,7 @@ export const TYPE_API = [
6321
6432
  },
6322
6433
  {
6323
6434
  name: 'PtcRunRequest',
6324
- declaration: 'export interface PtcRunRequest {\n program: string;\n bindings: PtcBindingNamespace[];\n cwd?: string;\n timeoutMs?: number | null;\n sandboxPolicy?: SandboxExecutionPolicy;\n signal?: AbortSignal;\n}',
6435
+ declaration: 'export interface PtcRunRequest {\n program: string;\n stateOwner?: object;\n bindings: PtcBindingNamespace[];\n cwd?: string;\n timeoutMs?: number | null;\n sandboxPolicy?: SandboxExecutionPolicy;\n signal?: AbortSignal;\n}',
6325
6436
  },
6326
6437
  {
6327
6438
  name: 'PtcRunResult',
@@ -6375,6 +6486,62 @@ export const TYPE_API = [
6375
6486
  name: 'Reload',
6376
6487
  declaration: 'export interface Reload {\n filename: string;\n modules: ReloadModules;\n runtime?: Plugin.Runtime | undefined;\n}',
6377
6488
  },
6489
+ {
6490
+ name: 'RemoteAccessAction',
6491
+ declaration: 'export type RemoteAccessAction = RemoteAccessEndpoint | `event:${string}`;',
6492
+ },
6493
+ {
6494
+ name: 'RemoteAccessBaseline',
6495
+ declaration: 'export type RemoteAccessBaseline = Extract<RemoteAccessFrame, {\n type: \'baseline\';\n}>;',
6496
+ },
6497
+ {
6498
+ name: 'RemoteAccessBinding',
6499
+ declaration: 'export type RemoteAccessBinding = {\n [K in RemoteAccessResourceKind]: {\n readonly role: RemoteAccessRole<K>;\n readonly resource: RemoteAccessResourceOf<K>;\n readonly condition?: RemoteAccessCondition<K>;\n };\n}[RemoteAccessResourceKind];',
6500
+ },
6501
+ {
6502
+ name: 'RemoteAccessCondition',
6503
+ declaration: 'export type RemoteAccessCondition<K extends RemoteAccessResourceKind> = (request: {\n readonly action: RemoteAccessAction;\n readonly resource: RemoteAccessResourceOf<K>;\n readonly args?: Readonly<Record<string, unknown>>;\n}) => RemoteAccessDecision;',
6504
+ },
6505
+ {
6506
+ name: 'RemoteAccessDecision',
6507
+ declaration: 'export type RemoteAccessDecision = {\n readonly kind: \'allow\';\n} | {\n readonly kind: \'deny\';\n readonly reason: string;\n};',
6508
+ },
6509
+ {
6510
+ name: 'RemoteAccessEndpoint',
6511
+ declaration: 'export type RemoteAccessEndpoint = `${string}/${string}`;',
6512
+ },
6513
+ {
6514
+ name: 'RemoteAccessFrame',
6515
+ declaration: 'export type RemoteAccessFrame = {\n readonly type: \'baseline\';\n readonly owner: true;\n} | {\n readonly type: \'baseline\';\n readonly owner: false;\n readonly grants: readonly RemoteAccessGrant[];\n} | {\n readonly type: \'upsert\';\n readonly grant: RemoteAccessGrant;\n} | {\n readonly type: \'remove\';\n readonly resource: RemoteAccessResource;\n};',
6516
+ },
6517
+ {
6518
+ name: 'RemoteAccessGrant',
6519
+ declaration: 'export interface RemoteAccessGrant {\n readonly resource: RemoteAccessResource;\n readonly actions: readonly string[];\n}',
6520
+ },
6521
+ {
6522
+ name: 'RemoteAccessPolicy',
6523
+ declaration: 'export interface RemoteAccessPolicy<P extends Principal> {\n bindings(principal: P): readonly RemoteAccessBinding[];\n explain?(request: RemoteAccessRequest<P>): string | undefined;\n}',
6524
+ },
6525
+ {
6526
+ name: 'RemoteAccessRequest',
6527
+ declaration: 'export interface RemoteAccessRequest<P extends Principal> {\n readonly principal: P;\n readonly action: RemoteAccessAction;\n readonly resources: readonly RemoteAccessResource[];\n readonly args?: Readonly<Record<string, unknown>>;\n}',
6528
+ },
6529
+ {
6530
+ name: 'RemoteAccessResource',
6531
+ declaration: 'export type RemoteAccessResource = {\n readonly kind: \'global\';\n} | {\n [Kind in TypertResourceKind]: {\n readonly kind: Kind;\n readonly id: TypertResourceId<TypertResourceMap[Kind]>;\n };\n}[TypertResourceKind];',
6532
+ },
6533
+ {
6534
+ name: 'RemoteAccessResourceKind',
6535
+ declaration: 'export type RemoteAccessResourceKind = \'global\' | TypertResourceKind;',
6536
+ },
6537
+ {
6538
+ name: 'RemoteAccessResourceOf',
6539
+ declaration: 'export type RemoteAccessResourceOf<K extends RemoteAccessResourceKind> = Extract<RemoteAccessResource, {\n readonly kind: K;\n}>;',
6540
+ },
6541
+ {
6542
+ name: 'RemoteAccessRole',
6543
+ declaration: 'export interface RemoteAccessRole<K extends RemoteAccessResourceKind> {\n readonly name: string;\n readonly resource: K;\n readonly actions: readonly RemoteAccessAction[];\n}',
6544
+ },
6378
6545
  {
6379
6546
  name: 'RemoteError',
6380
6547
  declaration: 'export class RemoteError<Code extends RemoteErrorCode = RemoteErrorCode> extends Error {\n readonly isDSHRemoteError: true;\n constructor(readonly code: Code, message: string, readonly details: RemoteErrorDetailsMap[Code], options?: ErrorOptions);\n}',
@@ -6391,6 +6558,14 @@ export const TYPE_API = [
6391
6558
  name: 'RemoteEventHostInfo',
6392
6559
  declaration: 'export interface RemoteEventHostInfo {\n readonly home: string;\n}',
6393
6560
  },
6561
+ {
6562
+ name: 'RemoteStream',
6563
+ declaration: 'export type RemoteStream<Out, In = never> = AsyncIterable<Out> & {\n readonly [STREAM_UPLINK]?: In;\n};',
6564
+ },
6565
+ {
6566
+ name: 'RemoteUplinkWindow',
6567
+ declaration: 'export interface RemoteUplinkWindow {\n readonly maxBytes: number;\n readonly frameOverheadBytes: number;\n}',
6568
+ },
6394
6569
  {
6395
6570
  name: 'RenderedDocumentBytes',
6396
6571
  declaration: 'export interface RenderedDocumentBytes extends WorkspaceFileBytes {\n readonly missingFonts: string[];\n readonly generation: OfficeToPdfGeneration;\n}',
@@ -6451,6 +6626,10 @@ export const TYPE_API = [
6451
6626
  name: 'ResolvedSubagentStartRequest',
6452
6627
  declaration: 'export interface ResolvedSubagentStartRequest extends SubagentStartRequest {\n readonly cwd: string;\n}',
6453
6628
  },
6629
+ {
6630
+ name: 'RestartReason',
6631
+ declaration: 'export type RestartReason = \'no-hmr\' | \'package-moved\' | \'host-module\' | \'unmanaged-plugin\' | \'module-comparison\';',
6632
+ },
6454
6633
  {
6455
6634
  name: 'RestoredSessionOptions',
6456
6635
  declaration: 'export interface RestoredSessionOptions {\n readonly seed: SessionEvent[];\n readonly meta: SessionHeader;\n readonly inheritedEventCount: SessionLogOffset;\n readonly eventState: SessionSeedEventState;\n}',
@@ -7461,7 +7640,7 @@ export const TYPE_API = [
7461
7640
  },
7462
7641
  {
7463
7642
  name: 'SubagentCapabilities',
7464
- declaration: 'export interface SubagentCapabilities {\n readonly agentOptions: boolean;\n readonly outputSchema: boolean;\n readonly depthLimit: boolean;\n readonly toolFilter: boolean;\n readonly persona: boolean;\n}',
7643
+ declaration: 'export interface SubagentCapabilities {\n readonly agentOptions: boolean;\n readonly agentPreset: boolean;\n readonly outputSchema: boolean;\n readonly depthLimit: boolean;\n}',
7465
7644
  },
7466
7645
  {
7467
7646
  name: 'SubagentCatalogEntry',
@@ -7537,7 +7716,7 @@ export const TYPE_API = [
7537
7716
  },
7538
7717
  {
7539
7718
  name: 'SubagentStartRequest',
7540
- declaration: 'export interface SubagentStartRequest {\n readonly cwd?: 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 readonly toolFilter?: ToolRestriction;\n readonly persona?: string;\n}',
7719
+ 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}',
7541
7720
  },
7542
7721
  {
7543
7722
  name: 'SubagentStopReason',
@@ -7687,10 +7866,6 @@ export const TYPE_API = [
7687
7866
  name: 'TeamWaitResult',
7688
7867
  declaration: 'export interface TeamWaitResult {\n readonly timedOut: boolean;\n}',
7689
7868
  },
7690
- {
7691
- name: 'TerminalAttachmentId',
7692
- declaration: 'export type TerminalAttachmentId = Branded<\'TerminalAttachmentId\'>;',
7693
- },
7694
7869
  {
7695
7870
  name: 'TerminalBackend',
7696
7871
  declaration: 'export interface TerminalBackend {\n readonly type: string;\n spawn(spec: TerminalBackendSpawnSpec): Promise<TerminalBackendSession>;\n}',
@@ -7713,11 +7888,15 @@ export const TYPE_API = [
7713
7888
  },
7714
7889
  {
7715
7890
  name: 'TerminalEnvironment',
7716
- declaration: 'export interface TerminalEnvironment {\n readonly cwd: string;\n readonly maxInputBytes: number;\n readonly maxCols: number;\n readonly maxRows: number;\n readonly scrollback: number;\n}',
7891
+ declaration: 'export interface TerminalEnvironment {\n readonly cwd: string;\n readonly maxInputBytes: number;\n readonly maxBufferedBytes: number;\n readonly maxCols: number;\n readonly maxRows: number;\n readonly scrollback: number;\n}',
7717
7892
  },
7718
7893
  {
7719
7894
  name: 'TerminalFrame',
7720
- declaration: 'export type TerminalFrame = {\n readonly type: \'snapshot\';\n readonly sequence: number;\n readonly screen: string;\n readonly info: WebTerminalInfo;\n} | {\n readonly type: \'output\';\n readonly sequence: number;\n readonly data: string;\n} | {\n readonly type: \'state\';\n readonly info: WebTerminalInfo;\n};',
7895
+ declaration: 'export type TerminalFrame = {\n readonly type: \'snapshot\';\n readonly sequence: number;\n readonly screen: string;\n readonly info: WebTerminalInfo;\n readonly writable: boolean;\n readonly inputWindow?: RemoteUplinkWindow;\n} | {\n readonly type: \'output\';\n readonly sequence: number;\n readonly data: string;\n} | {\n readonly type: \'state\';\n readonly info: WebTerminalInfo;\n readonly writable: boolean;\n} | {\n readonly type: \'ack\';\n readonly sequence: number;\n readonly refusal?: \'read-only\' | \'not-running\';\n};',
7896
+ },
7897
+ {
7898
+ name: 'TerminalInput',
7899
+ declaration: 'export type TerminalInput = {\n readonly type: \'write\';\n readonly sequence: number;\n readonly data: string;\n} | {\n readonly type: \'resize\';\n readonly sequence: number;\n readonly cols: number;\n readonly rows: number;\n};',
7721
7900
  },
7722
7901
  {
7723
7902
  name: 'TerminalReadRequest',
@@ -8025,7 +8204,7 @@ export const TYPE_API = [
8025
8204
  },
8026
8205
  {
8027
8206
  name: 'TypertCodec',
8028
- declaration: 'export type TypertCodec = {\n readonly mode: \'strict\';\n readonly typeSymbol: string;\n readonly create: () => TypertSchema;\n readonly decode?: (value: unknown) => unknown;\n readonly encode?: (value: unknown, writeBytes: (bytes: Uint8Array, path: readonly (string | number)[]) => null) => unknown;\n} | {\n readonly mode: \'src-json\';\n};',
8207
+ declaration: 'export type TypertCodec<Value = unknown> = TypertRemoteValue<Value> & {\n readonly mode: \'strict\';\n readonly typeSymbol: string;\n readonly decode?: ((value: unknown) => unknown) | undefined;\n readonly encode?: ((value: unknown, writeBytes: (bytes: Uint8Array, path: readonly (string | number)[]) => null) => unknown) | undefined;\n} | {\n readonly mode: \'src-json\';\n};',
8029
8208
  },
8030
8209
  {
8031
8210
  name: 'TypertContribution',
@@ -8053,7 +8232,7 @@ export const TYPE_API = [
8053
8232
  },
8054
8233
  {
8055
8234
  name: 'TypertGatewayWireStream',
8056
- declaration: 'export interface TypertGatewayWireStream {\n readonly open: (endpoint: string, payload: unknown, uplink: AsyncIterable<unknown>, peer: PeerScope | undefined, signal: AbortSignal) => Promise<AsyncIterable<unknown>>;\n readonly failure: (error: unknown) => {\n readonly code: string;\n readonly message: string;\n readonly details: object;\n };\n}',
8235
+ declaration: 'export interface TypertGatewayWireStream {\n readonly open: (endpoint: string, payload: unknown, uplink: AsyncIterable<unknown>, peer: PeerScope, signal: AbortSignal) => Promise<AsyncIterable<unknown>>;\n readonly failure: (error: unknown) => {\n readonly code: string;\n readonly message: string;\n readonly details: object;\n };\n}',
8057
8236
  },
8058
8237
  {
8059
8238
  name: 'TypertMemberModel',
@@ -8085,7 +8264,7 @@ export const TYPE_API = [
8085
8264
  },
8086
8265
  {
8087
8266
  name: 'TypertRemoteEventFrame',
8088
- declaration: 'export interface TypertRemoteEventFrame {\n readonly event: string;\n readonly args: readonly unknown[];\n}',
8267
+ declaration: 'export interface TypertRemoteEventFrame {\n readonly event: string;\n readonly args: readonly unknown[];\n readonly resources?: Readonly<Record<string, TypertResourceReader>>;\n}',
8089
8268
  },
8090
8269
  {
8091
8270
  name: 'TypertRemoteEventInvocation',
@@ -8103,6 +8282,30 @@ export const TYPE_API = [
8103
8282
  name: 'TypertRemoteService',
8104
8283
  declaration: 'export abstract class TypertRemoteService<out T = never> extends Service<T> {\n readonly typertRemote: TypertGatewayBinding<this>;\n}',
8105
8284
  },
8285
+ {
8286
+ name: 'TypertRemoteValue',
8287
+ declaration: 'export interface TypertRemoteValue<Value = unknown> {\n readonly create: () => TypertSchema<Value>;\n readonly description?: string | undefined;\n readonly jsonSchema?: Readonly<Record<string, unknown>> | undefined;\n readonly jsonSchemaError?: string | undefined;\n}',
8288
+ },
8289
+ {
8290
+ name: 'TypertResource',
8291
+ declaration: 'export interface TypertResource<Id> {\n readonly [RESOURCE_ID]: Id;\n}',
8292
+ },
8293
+ {
8294
+ name: 'TypertResourceId',
8295
+ declaration: 'export type TypertResourceId<Resource> = Resource extends TypertResource<infer Id> ? Id : never;',
8296
+ },
8297
+ {
8298
+ name: 'TypertResourceKind',
8299
+ declaration: 'export type TypertResourceKind = Extract<keyof TypertResourceMap, string>;',
8300
+ },
8301
+ {
8302
+ name: 'TypertResourceMap',
8303
+ declaration: 'export interface TypertResourceMap {\n}',
8304
+ },
8305
+ {
8306
+ name: 'TypertResourceReader',
8307
+ declaration: 'export type TypertResourceReader = {\n read(...args: readonly unknown[]): unknown;\n}[\'read\'];',
8308
+ },
8106
8309
  {
8107
8310
  name: 'TypertSchema',
8108
8311
  declaration: 'export interface TypertSchema<Output = unknown> {\n parse(value: unknown): Output;\n}',
@@ -8273,7 +8476,7 @@ export const TYPE_API = [
8273
8476
  },
8274
8477
  {
8275
8478
  name: 'WebTerminalInfo',
8276
- declaration: 'export interface WebTerminalInfo {\n readonly id: WebTerminalId;\n readonly title: string;\n readonly shell: TerminalShell;\n readonly cwd: string;\n readonly cols: number;\n readonly rows: number;\n readonly state: \'running\' | \'exited\' | \'failed\';\n readonly exitCode: number | null;\n readonly error?: string;\n readonly controllerId?: TerminalAttachmentId;\n}',
8479
+ declaration: 'export interface WebTerminalInfo {\n readonly id: WebTerminalId;\n readonly title: string;\n readonly shell: TerminalShell;\n readonly cwd: string;\n readonly cols: number;\n readonly rows: number;\n readonly state: \'running\' | \'exited\' | \'failed\';\n readonly exitCode: number | null;\n readonly error?: string;\n}',
8277
8480
  },
8278
8481
  {
8279
8482
  name: 'WebUpgradeRoute',
@@ -8433,7 +8636,7 @@ export const TYPE_API = [
8433
8636
  },
8434
8637
  {
8435
8638
  name: 'WorkspaceFollowIncrement',
8436
- declaration: 'export type WorkspaceFollowIncrement = {\n readonly type: \'upsert\';\n readonly workspace: WorkspaceView;\n} | {\n readonly type: \'remove\';\n readonly workspaceId: WorkspaceId;\n} | {\n readonly type: \'order\';\n readonly workspaceIds: readonly WorkspaceId[];\n} | {\n readonly type: \'archived\';\n readonly archivedSessionIds: readonly SessionId[];\n} | {\n readonly type: \'pinned\';\n readonly pinnedSessionIds: readonly SessionId[];\n};',
8639
+ declaration: 'export type WorkspaceFollowIncrement = {\n readonly type: \'replace\';\n readonly value: WorkspaceBaseline;\n} | {\n readonly type: \'upsert\';\n readonly workspace: WorkspaceView;\n} | {\n readonly type: \'remove\';\n readonly workspaceId: WorkspaceId;\n} | {\n readonly type: \'order\';\n readonly workspaceIds: readonly WorkspaceId[];\n} | {\n readonly type: \'archived\';\n readonly archivedSessionIds: readonly SessionId[];\n} | {\n readonly type: \'pinned\';\n readonly pinnedSessionIds: readonly SessionId[];\n};',
8437
8640
  },
8438
8641
  {
8439
8642
  name: 'WorkspaceInsertBeforeRequest',
package/locale/en.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "meta": {
3
+ "title": "tool-cordis"
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "meta": {
3
+ "title": "tool-cordis/host"
4
+ }
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "meta": {
3
+ "title": "插件 API 检查服务"
4
+ }
5
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "插件 API 查询工具",
4
+ "description": "让 AI 在开发插件前查询服务端和浏览器端的可用 API。"
5
+ }
6
+ }
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.1-alpha.2",
4
+ "version": "0.2.1-alpha.3",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -23,31 +23,35 @@
23
23
  "default": "./lib/types/host.js"
24
24
  },
25
25
  "./src/*": "./src/*",
26
- "./package.json": "./package.json"
26
+ "./package.json": "./package.json",
27
+ "./host/locale/*.json": "./locale/host/*.json",
28
+ "./locale/*.json": "./locale/*.json"
27
29
  },
28
30
  "files": [
31
+ "locale/*.json",
32
+ "locale/host/*.json",
29
33
  "lib/index.js",
30
34
  "lib/types/**/*.js",
31
35
  "lib/types/**/*.d.ts"
32
36
  ],
33
37
  "license": "MIT",
34
38
  "peerDependencies": {
35
- "@deepseek-ai/cordis": "~4.0.5-alpha.1",
36
- "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.1",
37
- "@deepseek-ai/dsh-agent": "0.2.1-alpha.2",
38
- "@deepseek-ai/dsh-app-boot": "0.2.1-alpha.2",
39
- "@deepseek-ai/dsh-cordis-host-runner": "0.2.1-alpha.2",
40
- "@deepseek-ai/dsh-tools": "0.2.1-alpha.2"
39
+ "@deepseek-ai/cordis": "~4.0.5-alpha.2",
40
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.2",
41
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.3",
42
+ "@deepseek-ai/dsh-app-boot": "0.2.1-alpha.3",
43
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.1-alpha.3",
44
+ "@deepseek-ai/dsh-tools": "0.2.1-alpha.3"
41
45
  },
42
46
  "devDependencies": {
43
- "@deepseek-ai/cordis": "~4.0.5-alpha.1",
44
- "@deepseek-ai/cordis-plugin-group": "~1.0.5-alpha.1",
45
- "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.1",
46
- "@deepseek-ai/dsh-agent": "0.2.1-alpha.2",
47
- "@deepseek-ai/dsh-app-boot": "0.2.1-alpha.2",
48
- "@deepseek-ai/dsh-cordis-host-runner": "0.2.1-alpha.2",
49
- "@deepseek-ai/dsh-system-prompt": "0.2.1-alpha.2",
50
- "@deepseek-ai/dsh-tools": "0.2.1-alpha.2",
51
- "@deepseek-ai/schemastery": "~3.18.5-alpha.1"
47
+ "@deepseek-ai/cordis": "~4.0.5-alpha.2",
48
+ "@deepseek-ai/cordis-plugin-group": "~1.0.5-alpha.2",
49
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.6-alpha.2",
50
+ "@deepseek-ai/dsh-agent": "0.2.1-alpha.3",
51
+ "@deepseek-ai/dsh-app-boot": "0.2.1-alpha.3",
52
+ "@deepseek-ai/dsh-cordis-host-runner": "0.2.1-alpha.3",
53
+ "@deepseek-ai/dsh-system-prompt": "0.2.1-alpha.3",
54
+ "@deepseek-ai/dsh-tools": "0.2.1-alpha.3",
55
+ "@deepseek-ai/schemastery": "~3.18.5-alpha.2"
52
56
  }
53
57
  }