codai-sdk 0.71.0 → 0.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -7865,7 +7865,7 @@ type paths$1 = {
7865
7865
  readonly put?: never;
7866
7866
  /**
7867
7867
  * Resolve values for a local broker
7868
- * @description For codai brokers only (`x-codai-agent: codaid…` or `desktop…`): the cloud fallback of `codaid vault run` when the vault is not unlocked on the machine. Each handle gets an env-mode policy decision; t3/t4 answer 202 with approval ids, items that are not cloud-usable answer 409 `not_cloud_usable`. The broker injects values into a child process and redacts its output; they never reach a model.
7868
+ * @description For codai brokers only (`x-codai-agent: codaid…` or `desktop…`): the cloud fallback of `codaid vault run` when the vault is not unlocked on the machine. Every call carries a `proof`: a fresh challenge from `POST /v1/vault/resolve/challenge` signed by one of your enrolled device keys, checked before any policy decision. Each handle gets an env-mode policy decision; t3/t4 answer 202 with approval ids, items that are not cloud-usable answer 409 `not_cloud_usable`. The broker injects values into a child process and redacts its output; they never reach a model. Errors: 400 `proof_required`, `invalid_challenge` (unknown, used or expired); 403 `invalid_device_proof` (device not yours, revoked, or bad signature), `broker_only`, `vault_denied`.
7869
7869
  */
7870
7870
  readonly post: operations$1['vaultResolve'];
7871
7871
  readonly delete?: never;
@@ -7874,6 +7874,26 @@ type paths$1 = {
7874
7874
  readonly patch?: never;
7875
7875
  readonly trace?: never;
7876
7876
  };
7877
+ readonly '/v1/vault/resolve/challenge': {
7878
+ readonly parameters: {
7879
+ readonly query?: never;
7880
+ readonly header?: never;
7881
+ readonly path?: never;
7882
+ readonly cookie?: never;
7883
+ };
7884
+ readonly get?: never;
7885
+ readonly put?: never;
7886
+ /**
7887
+ * Get a resolve challenge
7888
+ * @description For codai brokers only (`x-codai-agent: codaid…` or `desktop…`; others get 403 `broker_only`). Single-use nonce valid for 120 seconds; the broker signs it with its enrolled device key into the `proof` of the next `POST /v1/vault/resolve`.
7889
+ */
7890
+ readonly post: operations$1['createVaultResolveChallenge'];
7891
+ readonly delete?: never;
7892
+ readonly options?: never;
7893
+ readonly head?: never;
7894
+ readonly patch?: never;
7895
+ readonly trace?: never;
7896
+ };
7877
7897
  readonly '/v1/vault/rules': {
7878
7898
  readonly parameters: {
7879
7899
  readonly query?: never;
@@ -18660,7 +18680,7 @@ type components$1 = {
18660
18680
  readonly nonce: string;
18661
18681
  };
18662
18682
  readonly VaultDeviceEnroll: {
18663
- /** @description Required for `android_keystore` (certificate chain, leaf first, attestation challenge = nonce bytes). Optional for `windows_hello`: a TPM attestation gives `tpm`, none gives `hello-unattested`. */
18683
+ /** @description Required for `android_keystore` (certificate chain, leaf first, attestation challenge = nonce bytes). Optional for `windows_hello`: a TPM attestation gives `tpm`, none gives `hello-unattested`. Must be absent for `cli_ed25519` (surface `cli`, stored as `software`). */
18664
18684
  readonly attestation?: {
18665
18685
  readonly android_chain: readonly string[];
18666
18686
  } | {
@@ -18670,36 +18690,39 @@ type components$1 = {
18670
18690
  };
18671
18691
  };
18672
18692
  readonly device_id: string;
18673
- /** @description The device key over the same message (ECDSA P-256 DER on Android, RSASSA-PKCS1-v1_5 SHA-256 for Windows Hello), base64url. */
18693
+ /** @description The device key over the same message (ECDSA P-256 DER on Android, RSASSA-PKCS1-v1_5 SHA-256 for Windows Hello, raw 64-byte Ed25519 for `cli_ed25519`), base64url. */
18674
18694
  readonly device_signature: string;
18675
18695
  /** @enum {string} */
18676
- readonly kind: 'android_keystore' | 'windows_hello';
18696
+ readonly kind: 'android_keystore' | 'windows_hello' | 'cli_ed25519';
18677
18697
  readonly name: string;
18678
18698
  /** @description Nonce from `POST /v1/vault/devices/challenge`. */
18679
18699
  readonly nonce: string;
18680
18700
  /** @description SubjectPublicKeyInfo DER of the device key, base64url. */
18681
18701
  readonly public_key: string;
18682
18702
  /** @enum {string} */
18683
- readonly surface: 'phone' | 'wear' | 'desktop';
18703
+ readonly surface: 'phone' | 'wear' | 'desktop' | 'cli';
18684
18704
  /** @description Ed25519 signature of your vault key over `codai-vault/device-enroll/v1|<device_id>|<kind>|<spki_sha256>|<nonce>`. */
18685
18705
  readonly vault_signature: string;
18686
18706
  };
18687
18707
  readonly VaultDeviceKey: {
18688
18708
  /**
18689
- * @description What the gateway verified at enrolment: Google key attestation (StrongBox or TEE), a TPM attestation of the Windows Hello key, or an unattested Windows Hello key.
18709
+ * @description What the gateway verified at enrolment: Google key attestation (StrongBox or TEE), a TPM attestation of the Windows Hello key, an unattested Windows Hello key, or `software` for a `cli_ed25519` key (no hardware proof).
18690
18710
  * @enum {string}
18691
18711
  */
18692
- readonly attestation: 'android-strongbox' | 'android-tee' | 'tpm' | 'hello-unattested';
18712
+ readonly attestation: 'android-strongbox' | 'android-tee' | 'tpm' | 'hello-unattested' | 'software';
18693
18713
  /** @description Attestation details (security level, OS patch level, verified boot state…). No secrets. */
18694
18714
  readonly attestation_info: {
18695
18715
  readonly [key: string]: unknown;
18696
18716
  };
18697
18717
  /** Format: date-time */
18698
18718
  readonly created_at: string;
18699
- /** @description Device id (`android-…`, `wear-…` or `desktop-…`), chosen by the client. */
18719
+ /** @description Device id (`android-…`, `wear-…`, `desktop-…` or `cli-…`), chosen by the client. */
18700
18720
  readonly id: string;
18701
- /** @enum {string} */
18702
- readonly kind: 'android_keystore' | 'windows_hello';
18721
+ /**
18722
+ * @description `cli_ed25519` is the software key of `codaid`: it proves `POST /v1/vault/resolve` requests only and can never decide approvals or unlock the vault.
18723
+ * @enum {string}
18724
+ */
18725
+ readonly kind: 'android_keystore' | 'windows_hello' | 'cli_ed25519';
18703
18726
  /** Format: date-time */
18704
18727
  readonly last_used_at: string | null;
18705
18728
  readonly name: string;
@@ -18708,7 +18731,7 @@ type components$1 = {
18708
18731
  /** Format: date-time */
18709
18732
  readonly revoked_at: string | null;
18710
18733
  /** @enum {string} */
18711
- readonly surface: 'phone' | 'wear' | 'desktop';
18734
+ readonly surface: 'phone' | 'wear' | 'desktop' | 'cli';
18712
18735
  };
18713
18736
  readonly VaultGuards: {
18714
18737
  /** @description Agent requests for one item within `burst_window_s` that count as a burst (`anomaly:burst`); 0 = off. */
@@ -18762,6 +18785,23 @@ type components$1 = {
18762
18785
  /** Format: date-time */
18763
18786
  readonly locked_at: string;
18764
18787
  };
18788
+ readonly VaultResolveChallenge: {
18789
+ /** @description 32 random bytes, base64url. Single use; sign it into the next `POST /v1/vault/resolve` proof. */
18790
+ readonly challenge: string;
18791
+ /**
18792
+ * Format: date-time
18793
+ * @description 120 seconds after issue.
18794
+ */
18795
+ readonly expires_at: string;
18796
+ };
18797
+ readonly VaultResolveProof: {
18798
+ /** @description Challenge from `POST /v1/vault/resolve/challenge`. */
18799
+ readonly challenge: string;
18800
+ /** @description An enrolled, unrevoked device key of the caller (desktop: `windows_hello`; codaid: `cli_ed25519`). */
18801
+ readonly device_id: string;
18802
+ /** @description Device-key signature, base64url, over `codai-vault/resolve/v1|<challenge>|<device_id>|<digest>` where `digest` = base64url_nopad(SHA-256(UTF-8(handles joined by `\n` + `\n\n` + action))), with `handles` and `action` exactly as sent. */
18803
+ readonly signature: string;
18804
+ };
18765
18805
  readonly VaultUnlockChallenge: {
18766
18806
  /** @description 32 random bytes, base64url. Single use. */
18767
18807
  readonly challenge: string;
@@ -35087,6 +35127,7 @@ interface operations$1 {
35087
35127
  readonly action: string;
35088
35128
  readonly chain?: readonly string[];
35089
35129
  readonly handles: readonly string[];
35130
+ readonly proof: components$1['schemas']['VaultResolveProof'];
35090
35131
  /** @enum {string} */
35091
35132
  readonly provenance?: 'user' | 'agent' | 'untrusted';
35092
35133
  readonly purpose?: string;
@@ -35119,7 +35160,7 @@ interface operations$1 {
35119
35160
  };
35120
35161
  readonly 400: components$1['responses']['BadRequest'];
35121
35162
  readonly 401: components$1['responses']['Unauthorized'];
35122
- /** @description Not a broker, or denied by policy. */
35163
+ /** @description `invalid_device_proof`, `broker_only` (not a broker) or `vault_denied` (denied by policy). */
35123
35164
  readonly 403: {
35124
35165
  headers: {
35125
35166
  readonly [name: string]: unknown;
@@ -35155,6 +35196,39 @@ interface operations$1 {
35155
35196
  };
35156
35197
  };
35157
35198
  };
35199
+ readonly createVaultResolveChallenge: {
35200
+ readonly parameters: {
35201
+ readonly query?: never;
35202
+ readonly header?: never;
35203
+ readonly path?: never;
35204
+ readonly cookie?: never;
35205
+ };
35206
+ readonly requestBody?: never;
35207
+ readonly responses: {
35208
+ /** @description OK. */
35209
+ readonly 200: {
35210
+ headers: {
35211
+ readonly [name: string]: unknown;
35212
+ };
35213
+ content: {
35214
+ readonly 'application/json': components$1['schemas']['VaultResolveChallenge'];
35215
+ };
35216
+ };
35217
+ readonly 400: components$1['responses']['BadRequest'];
35218
+ readonly 401: components$1['responses']['Unauthorized'];
35219
+ /** @description `broker_only`: not a codai broker. */
35220
+ readonly 403: {
35221
+ headers: {
35222
+ readonly [name: string]: unknown;
35223
+ };
35224
+ content: {
35225
+ readonly 'application/json': {
35226
+ readonly [key: string]: unknown;
35227
+ };
35228
+ };
35229
+ };
35230
+ };
35231
+ };
35158
35232
  readonly listVaultRules: {
35159
35233
  readonly parameters: {
35160
35234
  readonly query?: never;
@@ -38396,7 +38470,10 @@ export type VaultDeviceEnroll = Mutable<Schema<'VaultDeviceEnroll'>>;
38396
38470
  export type VaultDeviceAttestation = VaultDeviceKey['attestation'];
38397
38471
  export type VaultUseRequest = Mutable<Body<'vaultUse'>>;
38398
38472
  export type VaultHttpRequest = Mutable<Body<'vaultHttp'>>;
38473
+ /** Requires `proof`: a fresh {@link Vault.resolveChallenge} signed over {@link vaultResolveMessage} by an enrolled device key. */
38399
38474
  export type VaultResolveRequest = Mutable<Body<'vaultResolve'>>;
38475
+ export type VaultResolveProof = Mutable<Schema<'VaultResolveProof'>>;
38476
+ export type VaultResolveChallenge = Schema<'VaultResolveChallenge'>;
38400
38477
  export type VaultTier = VaultAccount['default_tier'];
38401
38478
  /** Anomaly guards (V-32): new host, burst, allowed hours. An anomaly forces t4. */
38402
38479
  export type VaultGuards = Schema<'VaultGuards'>;
@@ -38412,6 +38489,14 @@ export type VaultItemLimitsInput = Mutable<Body<'setVaultItemLimits'>>;
38412
38489
  export type VaultVia = 'hub' | 'desktop' | 'phone' | 'wear' | 'extension';
38413
38490
  /** The UTF-8 message an unlock proof covers: `codai-vault/unlock/v1|<challenge>|<device_id or "passkey">`. */
38414
38491
  export declare function vaultUnlockMessage(challenge: string, deviceIdOrPasskey: string): string;
38492
+ /**
38493
+ * The UTF-8 message a resolve proof covers: `codai-vault/resolve/v1|<challenge>|<device_id>|<digest>`, where `digest` =
38494
+ * base64url_nopad(SHA-256(handles.join("\n") + "\n\n" + action)) with handles and action exactly as sent.
38495
+ * Compute `digest` with your platform's SHA-256 (the SDK stays crypto-free).
38496
+ */
38497
+ export declare function vaultResolveMessage(challenge: string, deviceId: string, digest: string): string;
38498
+ /** The exact UTF-8 text whose SHA-256 (base64url, no padding) is the resolve proof `digest`. */
38499
+ export declare function vaultResolveDigestInput(handles: readonly string[], action: string): string;
38415
38500
  /** Loose JSON object answers (lists, acks) as documented in the OpenAPI spec. */
38416
38501
  export type VaultObject = Record<string, unknown>;
38417
38502
  type CallOpts$21 = {
@@ -38512,7 +38597,12 @@ export declare class Vault {
38512
38597
  use(body: VaultUseRequest, opts?: CallOpts$21): Promise<VaultUseDecision>;
38513
38598
  /** `POST /v1/vault/http` — brokered HTTPS call with `{{vault:<slug>}}` handles; 202 = approval required. */
38514
38599
  httpCall(body: VaultHttpRequest, opts?: CallOpts$21): Promise<VaultObject>;
38515
- /** `POST /v1/vault/resolve` — codai local brokers only (cloud fallback of `codaid vault run`); 202 = approval. */
38600
+ /** `POST /v1/vault/resolve/challenge` — codai local brokers only; single-use resolve challenge, valid 120 s. */
38601
+ resolveChallenge(opts?: CallOpts$21): Promise<VaultResolveChallenge>;
38602
+ /**
38603
+ * `POST /v1/vault/resolve` — codai local brokers only (cloud fallback of `codaid vault run`); 202 = approval.
38604
+ * `body.proof` is required: 400 `proof_required` / `invalid_challenge`, 403 `invalid_device_proof`.
38605
+ */
38516
38606
  resolve(body: VaultResolveRequest, opts?: CallOpts$21): Promise<VaultObject>;
38517
38607
  }
38518
38608
  /** `share_token`, `surface`, `category`, `explanation`, `reporter_name`, `reporter_email`, `good_faith: true`. */
package/dist/index.js CHANGED
@@ -3523,6 +3523,18 @@ var Voices = class {
3523
3523
  function vaultUnlockMessage(challenge, deviceIdOrPasskey) {
3524
3524
  return `codai-vault/unlock/v1|${challenge}|${deviceIdOrPasskey}`;
3525
3525
  }
3526
+ /**
3527
+ * The UTF-8 message a resolve proof covers: `codai-vault/resolve/v1|<challenge>|<device_id>|<digest>`, where `digest` =
3528
+ * base64url_nopad(SHA-256(handles.join("\n") + "\n\n" + action)) with handles and action exactly as sent.
3529
+ * Compute `digest` with your platform's SHA-256 (the SDK stays crypto-free).
3530
+ */
3531
+ function vaultResolveMessage(challenge, deviceId, digest) {
3532
+ return `codai-vault/resolve/v1|${challenge}|${deviceId}|${digest}`;
3533
+ }
3534
+ /** The exact UTF-8 text whose SHA-256 (base64url, no padding) is the resolve proof `digest`. */
3535
+ function vaultResolveDigestInput(handles, action) {
3536
+ return `${handles.join("\n")}\n\n${action}`;
3537
+ }
3526
3538
  const seg = (base, id, suffix = "") => `${base}/${encodeURIComponent(id)}${suffix}`;
3527
3539
  /** `/v1/vault/devices/*` — hardware-backed device approval keys (public keys only; revocation is instant). */
3528
3540
  var VaultDevices = class {
@@ -3743,7 +3755,14 @@ var Vault = class {
3743
3755
  httpCall(body, opts = {}) {
3744
3756
  return this.send("POST", "/v1/vault/http", opts, body);
3745
3757
  }
3746
- /** `POST /v1/vault/resolve` — codai local brokers only (cloud fallback of `codaid vault run`); 202 = approval. */
3758
+ /** `POST /v1/vault/resolve/challenge` — codai local brokers only; single-use resolve challenge, valid 120 s. */
3759
+ resolveChallenge(opts = {}) {
3760
+ return this.send("POST", "/v1/vault/resolve/challenge", opts, {});
3761
+ }
3762
+ /**
3763
+ * `POST /v1/vault/resolve` — codai local brokers only (cloud fallback of `codaid vault run`); 202 = approval.
3764
+ * `body.proof` is required: 400 `proof_required` / `invalid_challenge`, 403 `invalid_device_proof`.
3765
+ */
3747
3766
  resolve(body, opts = {}) {
3748
3767
  return this.send("POST", "/v1/vault/resolve", opts, body);
3749
3768
  }
@@ -6896,6 +6915,7 @@ const OPERATION_METHODS = {
6896
6915
  vaultUse: "vault.use",
6897
6916
  vaultHttp: "vault.httpCall",
6898
6917
  vaultResolve: "vault.resolve",
6918
+ createVaultResolveChallenge: "vault.resolveChallenge",
6899
6919
  createStudioAbuseReport: "abuseReports.create",
6900
6920
  checkProvenance: "provenance.check",
6901
6921
  createStudioBatch: "batches.create",
@@ -7727,5 +7747,5 @@ function allKeys(obj) {
7727
7747
  return [...keys];
7728
7748
  }
7729
7749
 
7730
- export { AbuseReports, Account, AgentRuns, Agents, Assets, Audio, Batches, Billing, BrandKits, Cards, Chat, ChatCompletions, Codai, Codai as default, CodaiApps, CodaiError, Creatives, Devices, Documents, Embeddings, EnvironmentFiles, EnvironmentJobs, EnvironmentMembers, EnvironmentPorts, EnvironmentSecrets, EnvironmentTasks, Environments, Exports, Feedback, Health, Heartbeats, Hosts, HttpClient, Images, JAM_CLOSE_CODES, JAM_SCALES, JAM_SUBPROTOCOL, Jam, JamSession, Keys, Lists, LyricsResource, MediaOps, Memory, Messages, Models, Music, MusicRoom, Notifications, OPERATION_METHODS, OrgMembers, Orgs, OsGate, PROVENANCE_MAX_BYTES, PhoneModels, Productions, Projects, Prompts, Provenance, RESOLVE_ATTESTATION_PAYLOAD_TYPE, RESOLVE_OPERATION_METHODS, RESOLVE_TERMINAL_STATUSES, Realtime, RealtimeSession, Receipts, Referrals, Renders, Research, Resolve, ResolveError, ResolveInsufficientFundsError, Responses, STREAMING_OPERATIONS, SandboxFiles, Sandboxes, ScheduleExecutor, SchedulerHosts, Schedules, SessionControls, SessionEvents, SessionLease, SessionShares, Sessions, Settings, Sfx, Shares, SystemOne, TUS_CHUNK_BYTES, Tasks, Templates, Tokens, Tools, Transcripts, Triggers, Usage, Vault, VaultDevices, Verify, Videos, VoiceRevocations, Voices, extensionHeaders, frameJson, isAssetDto, isMediaOpJob, isMediaOpJobFinished, isMusicRoomFinished, isPagedBuild, isProductionFinished, isResearchFinished, jamUrl, mergeToolCall, readSse, realtimeUrl, resolveAttestationStatement, settingsConflictCurrent, shareTokenFrom, uploadIdFromLocation, vaultUnlockMessage, verifyAttestationWithKeys, verifyResolveWebhook };
7750
+ export { AbuseReports, Account, AgentRuns, Agents, Assets, Audio, Batches, Billing, BrandKits, Cards, Chat, ChatCompletions, Codai, Codai as default, CodaiApps, CodaiError, Creatives, Devices, Documents, Embeddings, EnvironmentFiles, EnvironmentJobs, EnvironmentMembers, EnvironmentPorts, EnvironmentSecrets, EnvironmentTasks, Environments, Exports, Feedback, Health, Heartbeats, Hosts, HttpClient, Images, JAM_CLOSE_CODES, JAM_SCALES, JAM_SUBPROTOCOL, Jam, JamSession, Keys, Lists, LyricsResource, MediaOps, Memory, Messages, Models, Music, MusicRoom, Notifications, OPERATION_METHODS, OrgMembers, Orgs, OsGate, PROVENANCE_MAX_BYTES, PhoneModels, Productions, Projects, Prompts, Provenance, RESOLVE_ATTESTATION_PAYLOAD_TYPE, RESOLVE_OPERATION_METHODS, RESOLVE_TERMINAL_STATUSES, Realtime, RealtimeSession, Receipts, Referrals, Renders, Research, Resolve, ResolveError, ResolveInsufficientFundsError, Responses, STREAMING_OPERATIONS, SandboxFiles, Sandboxes, ScheduleExecutor, SchedulerHosts, Schedules, SessionControls, SessionEvents, SessionLease, SessionShares, Sessions, Settings, Sfx, Shares, SystemOne, TUS_CHUNK_BYTES, Tasks, Templates, Tokens, Tools, Transcripts, Triggers, Usage, Vault, VaultDevices, Verify, Videos, VoiceRevocations, Voices, extensionHeaders, frameJson, isAssetDto, isMediaOpJob, isMediaOpJobFinished, isMusicRoomFinished, isPagedBuild, isProductionFinished, isResearchFinished, jamUrl, mergeToolCall, readSse, realtimeUrl, resolveAttestationStatement, settingsConflictCurrent, shareTokenFrom, uploadIdFromLocation, vaultResolveDigestInput, vaultResolveMessage, vaultUnlockMessage, verifyAttestationWithKeys, verifyResolveWebhook };
7731
7751
  //# sourceMappingURL=index.js.map