@xenosystem/agent-interface-host 0.1.6 → 0.1.8

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 (78) hide show
  1. package/dist/acp/AcpAgentTurnExecutionAdapter.d.ts.map +1 -1
  2. package/dist/acp/AcpAgentTurnExecutionAdapter.js +11 -0
  3. package/dist/acp/AcpAgentTurnExecutionAdapter.js.map +1 -1
  4. package/dist/acp/AcpNativeProviderLauncherResolver.d.ts +26 -0
  5. package/dist/acp/AcpNativeProviderLauncherResolver.d.ts.map +1 -0
  6. package/dist/acp/AcpNativeProviderLauncherResolver.js +145 -0
  7. package/dist/acp/AcpNativeProviderLauncherResolver.js.map +1 -0
  8. package/dist/acp/AcpProcessSupervisor.d.ts.map +1 -1
  9. package/dist/acp/AcpProcessSupervisor.js +4 -1
  10. package/dist/acp/AcpProcessSupervisor.js.map +1 -1
  11. package/dist/acp/AcpProviderModelService.d.ts +1 -0
  12. package/dist/acp/AcpProviderModelService.d.ts.map +1 -1
  13. package/dist/acp/AcpProviderModelService.js +2 -2
  14. package/dist/acp/AcpProviderModelService.js.map +1 -1
  15. package/dist/acp/AcpSessionService.d.ts.map +1 -1
  16. package/dist/acp/AcpSessionService.js +40 -2
  17. package/dist/acp/AcpSessionService.js.map +1 -1
  18. package/dist/acp/acpTypes.d.ts +3 -0
  19. package/dist/acp/acpTypes.d.ts.map +1 -1
  20. package/dist/cloud/XenoCloudAgentTurnExecutionAdapter.d.ts.map +1 -1
  21. package/dist/cloud/XenoCloudAgentTurnExecutionAdapter.js +4 -0
  22. package/dist/cloud/XenoCloudAgentTurnExecutionAdapter.js.map +1 -1
  23. package/dist/index.d.ts +41 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +138 -10
  26. package/dist/index.js.map +1 -1
  27. package/dist/lease/ProcessLivenessProber.d.ts +30 -0
  28. package/dist/lease/ProcessLivenessProber.d.ts.map +1 -0
  29. package/dist/lease/ProcessLivenessProber.js +95 -0
  30. package/dist/lease/ProcessLivenessProber.js.map +1 -0
  31. package/dist/lease/ProviderWriterLeaseService.d.ts +43 -0
  32. package/dist/lease/ProviderWriterLeaseService.d.ts.map +1 -0
  33. package/dist/lease/ProviderWriterLeaseService.js +148 -0
  34. package/dist/lease/ProviderWriterLeaseService.js.map +1 -0
  35. package/dist/node.d.ts +8 -0
  36. package/dist/node.d.ts.map +1 -1
  37. package/dist/node.js +8 -0
  38. package/dist/node.js.map +1 -1
  39. package/dist/provider/ProviderLaneService.d.ts +71 -0
  40. package/dist/provider/ProviderLaneService.d.ts.map +1 -0
  41. package/dist/provider/ProviderLaneService.js +892 -0
  42. package/dist/provider/ProviderLaneService.js.map +1 -0
  43. package/dist/provider/ProviderTransitionOutboxDispatcher.d.ts +22 -0
  44. package/dist/provider/ProviderTransitionOutboxDispatcher.d.ts.map +1 -0
  45. package/dist/provider/ProviderTransitionOutboxDispatcher.js +60 -0
  46. package/dist/provider/ProviderTransitionOutboxDispatcher.js.map +1 -0
  47. package/dist/sdk/SdkNativeAgentTurnExecutionAdapter.d.ts +4 -1
  48. package/dist/sdk/SdkNativeAgentTurnExecutionAdapter.d.ts.map +1 -1
  49. package/dist/sdk/SdkNativeAgentTurnExecutionAdapter.js +37 -1
  50. package/dist/sdk/SdkNativeAgentTurnExecutionAdapter.js.map +1 -1
  51. package/dist/state/ProviderLaneSqliteStore.d.ts +64 -0
  52. package/dist/state/ProviderLaneSqliteStore.d.ts.map +1 -0
  53. package/dist/state/ProviderLaneSqliteStore.js +728 -0
  54. package/dist/state/ProviderLaneSqliteStore.js.map +1 -0
  55. package/dist/state/SqliteAgentStateRepository.d.ts +9 -0
  56. package/dist/state/SqliteAgentStateRepository.d.ts.map +1 -1
  57. package/dist/state/SqliteAgentStateRepository.js +171 -17
  58. package/dist/state/SqliteAgentStateRepository.js.map +1 -1
  59. package/dist/state/createAgentStateRepository.d.ts.map +1 -1
  60. package/dist/state/createAgentStateRepository.js +4 -2
  61. package/dist/state/createAgentStateRepository.js.map +1 -1
  62. package/dist/state/providerLaneSchema.d.ts +13 -0
  63. package/dist/state/providerLaneSchema.d.ts.map +1 -0
  64. package/dist/state/providerLaneSchema.js +129 -0
  65. package/dist/state/providerLaneSchema.js.map +1 -0
  66. package/dist/state/providerLaneTypes.d.ts +122 -0
  67. package/dist/state/providerLaneTypes.d.ts.map +1 -0
  68. package/dist/state/providerLaneTypes.js +28 -0
  69. package/dist/state/providerLaneTypes.js.map +1 -0
  70. package/dist/state/sdkProtectedStateCipher.d.ts +30 -0
  71. package/dist/state/sdkProtectedStateCipher.d.ts.map +1 -0
  72. package/dist/state/sdkProtectedStateCipher.js +50 -0
  73. package/dist/state/sdkProtectedStateCipher.js.map +1 -0
  74. package/dist/workspace/WorkspaceHostService.d.ts +31 -1
  75. package/dist/workspace/WorkspaceHostService.d.ts.map +1 -1
  76. package/dist/workspace/WorkspaceHostService.js +89 -12
  77. package/dist/workspace/WorkspaceHostService.js.map +1 -1
  78. package/package.json +7 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerLaneSchema.d.ts","sourceRoot":"","sources":["../../src/state/providerLaneSchema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAE3C,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG;QACpB,GAAG,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,UAAU,CAAC,GAAG,OAAO,CAAA;KACjF,CAAA;CACF;AAED,+DAA+D;AAC/D,eAAO,MAAM,wBAAwB,+nQAyGpC,CAAA;AAED,eAAO,MAAM,oBAAoB,6GAKvB,CAAA;AAEV,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAE5E;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAS/E"}
@@ -0,0 +1,129 @@
1
+ export const AGENT_STATE_SCHEMA_VERSION = 2;
2
+ /** One source for both fresh creation and v1 -> v2 upgrade. */
3
+ export const PROVIDER_LANE_SCHEMA_DDL = `
4
+ CREATE TABLE IF NOT EXISTS provider_lanes (
5
+ lane_id TEXT PRIMARY KEY NOT NULL CHECK(length(lane_id) BETWEEN 1 AND 240),
6
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
7
+ runtime_provider_id TEXT NOT NULL CHECK(length(runtime_provider_id) BETWEEN 1 AND 240),
8
+ provider_kind TEXT NOT NULL CHECK(length(provider_kind) BETWEEN 1 AND 120),
9
+ provider_display_name TEXT CHECK(provider_display_name IS NULL OR length(provider_display_name) <= 512),
10
+ native_provider_id TEXT CHECK(native_provider_id IS NULL OR length(native_provider_id) <= 240),
11
+ model_id TEXT CHECK(model_id IS NULL OR length(model_id) <= 240),
12
+ model_display_name TEXT CHECK(model_display_name IS NULL OR length(model_display_name) <= 512),
13
+ resume_compatibility_key TEXT NOT NULL CHECK(length(resume_compatibility_key) BETWEEN 1 AND 512),
14
+ workspace_epoch_id TEXT NOT NULL CHECK(length(workspace_epoch_id) BETWEEN 1 AND 240),
15
+ workspace_epoch_fingerprint TEXT NOT NULL CHECK(length(workspace_epoch_fingerprint) BETWEEN 1 AND 512),
16
+ workspace_epoch_wire_mode TEXT NOT NULL CHECK(workspace_epoch_wire_mode IN ('chat', 'development')),
17
+ workspace_epoch_kind TEXT NOT NULL CHECK(workspace_epoch_kind IN ('private-chat', 'local-workspace')),
18
+ workspace_epoch_label TEXT CHECK(workspace_epoch_label IS NULL OR length(workspace_epoch_label) <= 1024),
19
+ workspace_epoch_allowed_directory_fingerprints_json TEXT NOT NULL
20
+ CHECK(length(workspace_epoch_allowed_directory_fingerprints_json) <= 65536 AND json_valid(workspace_epoch_allowed_directory_fingerprints_json)),
21
+ status TEXT NOT NULL CHECK(status IN ('new', 'clean', 'active_structured', 'active_native', 'externally_advanced', 'needs_reconciliation', 'portable_only', 'invalidated', 'error')),
22
+ encrypted_continuation TEXT CHECK(encrypted_continuation IS NULL OR length(encrypted_continuation) <= 8388608),
23
+ continuation_hash TEXT CHECK(continuation_hash IS NULL OR length(continuation_hash) <= 128),
24
+ revision INTEGER NOT NULL DEFAULT 0 CHECK(revision >= 0),
25
+ is_active INTEGER NOT NULL DEFAULT 0 CHECK(is_active IN (0, 1)),
26
+ capabilities_json TEXT CHECK(capabilities_json IS NULL OR (length(capabilities_json) <= 262144 AND json_valid(capabilities_json))),
27
+ last_request_id TEXT CHECK(last_request_id IS NULL OR length(last_request_id) <= 240),
28
+ last_used_at TEXT CHECK(last_used_at IS NULL OR length(last_used_at) <= 64),
29
+ last_structured_commit_id TEXT CHECK(last_structured_commit_id IS NULL OR length(last_structured_commit_id) <= 240),
30
+ last_handoff_capsule_id TEXT CHECK(last_handoff_capsule_id IS NULL OR length(last_handoff_capsule_id) <= 240),
31
+ redacted_native_session_hash TEXT CHECK(redacted_native_session_hash IS NULL OR length(redacted_native_session_hash) <= 128),
32
+ invalidation_reason TEXT CHECK(invalidation_reason IS NULL OR length(invalidation_reason) <= 2048),
33
+ created_at TEXT NOT NULL CHECK(length(created_at) <= 64),
34
+ updated_at TEXT NOT NULL CHECK(length(updated_at) <= 64)
35
+ ) STRICT;
36
+ CREATE INDEX IF NOT EXISTS idx_provider_lanes_conversation ON provider_lanes(conversation_id);
37
+ CREATE INDEX IF NOT EXISTS idx_provider_lanes_runtime ON provider_lanes(runtime_provider_id);
38
+ CREATE INDEX IF NOT EXISTS idx_provider_lanes_status ON provider_lanes(status);
39
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_provider_lanes_one_active
40
+ ON provider_lanes(conversation_id) WHERE is_active = 1;
41
+
42
+ CREATE TABLE IF NOT EXISTS provider_writer_leases (
43
+ lease_id TEXT PRIMARY KEY NOT NULL CHECK(length(lease_id) BETWEEN 1 AND 240),
44
+ schema_version INTEGER NOT NULL DEFAULT 1 CHECK(schema_version = 1),
45
+ lane_id TEXT NOT NULL REFERENCES provider_lanes(lane_id) ON DELETE CASCADE,
46
+ lane_revision INTEGER NOT NULL CHECK(lane_revision >= 0),
47
+ lease_revision INTEGER NOT NULL CHECK(lease_revision >= 1),
48
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
49
+ host_instance_id TEXT NOT NULL CHECK(length(host_instance_id) BETWEEN 1 AND 240),
50
+ runtime_provider_id TEXT NOT NULL CHECK(length(runtime_provider_id) BETWEEN 1 AND 240),
51
+ native_provider_id TEXT CHECK(native_provider_id IS NULL OR length(native_provider_id) <= 240),
52
+ native_session_hash TEXT CHECK(native_session_hash IS NULL OR length(native_session_hash) <= 128),
53
+ owner_surface TEXT NOT NULL CHECK(length(owner_surface) BETWEEN 1 AND 120),
54
+ owner_pid INTEGER NOT NULL CHECK(owner_pid > 0),
55
+ owner_process_start_time TEXT NOT NULL CHECK(length(owner_process_start_time) BETWEEN 1 AND 128),
56
+ owner_process_identity TEXT NOT NULL CHECK(length(owner_process_identity) BETWEEN 1 AND 512),
57
+ state TEXT NOT NULL CHECK(state IN ('active', 'releasing', 'released', 'stale', 'unknown')),
58
+ acquired_at TEXT NOT NULL CHECK(length(acquired_at) <= 64),
59
+ expires_at TEXT NOT NULL CHECK(length(expires_at) <= 64),
60
+ renewed_at TEXT CHECK(renewed_at IS NULL OR length(renewed_at) <= 64),
61
+ last_heartbeat_at TEXT NOT NULL CHECK(length(last_heartbeat_at) <= 64),
62
+ workspace_epoch_id TEXT NOT NULL CHECK(length(workspace_epoch_id) BETWEEN 1 AND 240),
63
+ authority_snapshot_hash TEXT NOT NULL CHECK(length(authority_snapshot_hash) BETWEEN 1 AND 512),
64
+ created_at TEXT NOT NULL CHECK(length(created_at) <= 64),
65
+ updated_at TEXT NOT NULL CHECK(length(updated_at) <= 64)
66
+ ) STRICT;
67
+ CREATE INDEX IF NOT EXISTS idx_provider_writer_leases_lane ON provider_writer_leases(lane_id);
68
+ CREATE INDEX IF NOT EXISTS idx_provider_writer_leases_expiry ON provider_writer_leases(expires_at);
69
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_provider_writer_leases_one_conflicting
70
+ ON provider_writer_leases(lane_id) WHERE state IN ('active', 'releasing', 'unknown');
71
+
72
+ CREATE TABLE IF NOT EXISTS provider_transition_outbox (
73
+ outbox_id TEXT PRIMARY KEY NOT NULL CHECK(length(outbox_id) BETWEEN 1 AND 240),
74
+ schema_version INTEGER NOT NULL DEFAULT 1 CHECK(schema_version = 1),
75
+ conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
76
+ lane_id TEXT NOT NULL REFERENCES provider_lanes(lane_id) ON DELETE CASCADE,
77
+ lane_revision INTEGER NOT NULL CHECK(lane_revision >= 0),
78
+ transition_type TEXT NOT NULL CHECK(length(transition_type) BETWEEN 1 AND 120),
79
+ event_id TEXT NOT NULL CHECK(length(event_id) BETWEEN 1 AND 240),
80
+ idempotency_key TEXT NOT NULL UNIQUE CHECK(length(idempotency_key) BETWEEN 1 AND 240),
81
+ payload_json TEXT NOT NULL CHECK(length(payload_json) <= 1048576 AND json_valid(payload_json)),
82
+ payload_hash TEXT NOT NULL CHECK(length(payload_hash) BETWEEN 1 AND 128),
83
+ status TEXT NOT NULL CHECK(status IN ('pending', 'delivered', 'failed', 'abandoned')),
84
+ retry_count INTEGER NOT NULL DEFAULT 0 CHECK(retry_count >= 0),
85
+ last_attempt_at TEXT CHECK(last_attempt_at IS NULL OR length(last_attempt_at) <= 64),
86
+ error TEXT CHECK(error IS NULL OR length(error) <= 2048),
87
+ created_at TEXT NOT NULL CHECK(length(created_at) <= 64),
88
+ delivered_at TEXT CHECK(delivered_at IS NULL OR length(delivered_at) <= 64),
89
+ updated_at TEXT NOT NULL CHECK(length(updated_at) <= 64)
90
+ ) STRICT;
91
+ CREATE INDEX IF NOT EXISTS idx_provider_transition_outbox_pending
92
+ ON provider_transition_outbox(status, created_at);
93
+
94
+ CREATE TABLE IF NOT EXISTS idempotency_receipts (
95
+ idempotency_key TEXT PRIMARY KEY NOT NULL CHECK(length(idempotency_key) BETWEEN 1 AND 240),
96
+ scope TEXT NOT NULL CHECK(length(scope) BETWEEN 1 AND 120),
97
+ request_id TEXT NOT NULL CHECK(length(request_id) BETWEEN 1 AND 240),
98
+ request_hash TEXT NOT NULL CHECK(length(request_hash) BETWEEN 1 AND 128),
99
+ lane_id TEXT CHECK(lane_id IS NULL OR length(lane_id) <= 240),
100
+ conversation_id TEXT CHECK(conversation_id IS NULL OR length(conversation_id) <= 240),
101
+ response_json TEXT NOT NULL CHECK(length(response_json) <= 1048576 AND json_valid(response_json)),
102
+ response_hash TEXT NOT NULL CHECK(length(response_hash) BETWEEN 1 AND 128),
103
+ created_at TEXT NOT NULL CHECK(length(created_at) <= 64),
104
+ expires_at TEXT CHECK(expires_at IS NULL OR length(expires_at) <= 64)
105
+ ) STRICT;
106
+ CREATE INDEX IF NOT EXISTS idx_idempotency_receipts_scope_request
107
+ ON idempotency_receipts(scope, request_id);
108
+ `;
109
+ export const PROVIDER_LANE_TABLES = [
110
+ 'provider_lanes',
111
+ 'provider_writer_leases',
112
+ 'provider_transition_outbox',
113
+ 'idempotency_receipts',
114
+ ];
115
+ export function applyProviderLaneSchema(database) {
116
+ database.exec(PROVIDER_LANE_SCHEMA_DDL);
117
+ }
118
+ export function validateProviderLaneSchema(database) {
119
+ for (const table of PROVIDER_LANE_TABLES) {
120
+ const row = database.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(table);
121
+ if (!isRecord(row) || row.name !== table) {
122
+ throw new Error(`Agent state database is missing table ${table}.`);
123
+ }
124
+ }
125
+ }
126
+ function isRecord(value) {
127
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
128
+ }
129
+ //# sourceMappingURL=providerLaneSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerLaneSchema.js","sourceRoot":"","sources":["../../src/state/providerLaneSchema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAS3C,+DAA+D;AAC/D,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGvC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,gBAAgB;IAChB,wBAAwB;IACxB,4BAA4B;IAC5B,sBAAsB;CACd,CAAA;AAEV,MAAM,UAAU,uBAAuB,CAAC,QAA8B;IACpE,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,QAA8B;IACvE,KAAK,MAAM,KAAK,IAAI,oBAAoB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAC1B,kEAAkE,CACnE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACZ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,GAAG,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC"}
@@ -0,0 +1,122 @@
1
+ import type { AgentCockpitErrorCode, ProviderLaneProjectionV1, ProviderLaneStatus, ProviderLaneWorkspaceEpochProjection, ProviderSessionCapabilities } from '@xenosystem/agent-interface-contract';
2
+ export interface ProviderLaneWorkspaceEpochV1 extends ProviderLaneWorkspaceEpochProjection {
3
+ allowedDirectoryFingerprints: string[];
4
+ }
5
+ /** Host-private lane state. Continuation is encrypted before it reaches SQLite. */
6
+ export interface ProviderLaneRecordV1 {
7
+ schemaVersion: 1;
8
+ laneId: string;
9
+ conversationId: string;
10
+ runtimeProviderId: string;
11
+ providerKind: string;
12
+ providerDisplayName?: string;
13
+ nativeProviderId?: string;
14
+ modelId?: string;
15
+ modelDisplayName?: string;
16
+ resumeCompatibilityKey: string;
17
+ workspaceEpoch: ProviderLaneWorkspaceEpochV1;
18
+ status: ProviderLaneStatus;
19
+ revision: number;
20
+ isActive: boolean;
21
+ capabilities?: ProviderSessionCapabilities;
22
+ continuation?: unknown;
23
+ continuationHash?: string;
24
+ lastRequestId?: string;
25
+ lastUsedAt?: string;
26
+ lastStructuredCommitId?: string;
27
+ lastHandoffCapsuleId?: string;
28
+ redactedNativeSessionHash?: string;
29
+ invalidationReason?: string;
30
+ createdAt: string;
31
+ updatedAt: string;
32
+ }
33
+ export type WriterLeaseState = 'active' | 'releasing' | 'released' | 'stale' | 'unknown';
34
+ export interface ProviderWriterLeaseRecordV1 {
35
+ schemaVersion: 1;
36
+ leaseId: string;
37
+ laneId: string;
38
+ laneRevision: number;
39
+ leaseRevision: number;
40
+ conversationId: string;
41
+ hostInstanceId: string;
42
+ runtimeProviderId: string;
43
+ nativeProviderId?: string;
44
+ nativeSessionHash?: string;
45
+ ownerSurface: string;
46
+ ownerPid: number;
47
+ ownerProcessStartTime: string;
48
+ ownerProcessIdentity: string;
49
+ state: WriterLeaseState;
50
+ acquiredAt: string;
51
+ expiresAt: string;
52
+ renewedAt?: string;
53
+ lastHeartbeatAt: string;
54
+ workspaceEpochId: string;
55
+ authoritySnapshotHash: string;
56
+ createdAt: string;
57
+ updatedAt: string;
58
+ }
59
+ export interface ProviderTransitionOutboxDraft {
60
+ outboxId: string;
61
+ conversationId: string;
62
+ laneId: string;
63
+ laneRevision: number;
64
+ transitionType: string;
65
+ eventId: string;
66
+ idempotencyKey: string;
67
+ payload: Record<string, unknown>;
68
+ }
69
+ export interface ProviderTransitionOutboxRecord extends ProviderTransitionOutboxDraft {
70
+ schemaVersion: 1;
71
+ payloadHash: string;
72
+ status: 'pending' | 'delivered' | 'failed' | 'abandoned';
73
+ retryCount: number;
74
+ lastAttemptAt?: string;
75
+ error?: string;
76
+ createdAt: string;
77
+ deliveredAt?: string;
78
+ updatedAt: string;
79
+ }
80
+ export interface IdempotencyReceiptDraft {
81
+ idempotencyKey: string;
82
+ scope: string;
83
+ requestId: string;
84
+ /** Hash of canonical request input, never of the response. */
85
+ requestHash: string;
86
+ laneId?: string;
87
+ conversationId?: string;
88
+ response: Record<string, unknown>;
89
+ expiresAt?: string;
90
+ }
91
+ export interface IdempotencyReceiptRecord extends IdempotencyReceiptDraft {
92
+ responseHash: string;
93
+ createdAt: string;
94
+ }
95
+ export interface LaneTransitionCommitInput {
96
+ lane?: ProviderLaneRecordV1;
97
+ /** Required whenever lane is present. Use 0 to create. */
98
+ expectedRevision?: number;
99
+ outbox?: ProviderTransitionOutboxDraft | ProviderTransitionOutboxDraft[];
100
+ idempotency?: IdempotencyReceiptDraft;
101
+ lease?: ProviderWriterLeaseRecordV1;
102
+ }
103
+ export interface LaneMutationResult {
104
+ success: boolean;
105
+ code?: AgentCockpitErrorCode;
106
+ error?: string;
107
+ lane?: ProviderLaneRecordV1;
108
+ projection?: ProviderLaneProjectionV1;
109
+ }
110
+ export interface LaneTransitionCommitResult extends LaneMutationResult {
111
+ replayed?: boolean;
112
+ /** Exact bounded response stored for the original request. */
113
+ response?: Record<string, unknown>;
114
+ outboxIds?: string[];
115
+ }
116
+ export interface ProviderStateCipher {
117
+ readonly available: boolean;
118
+ encrypt(plaintext: string): string;
119
+ decrypt(ciphertext: string): string;
120
+ }
121
+ export declare function toProviderLaneProjection(lane: ProviderLaneRecordV1): ProviderLaneProjectionV1;
122
+ //# sourceMappingURL=providerLaneTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerLaneTypes.d.ts","sourceRoot":"","sources":["../../src/state/providerLaneTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export function toProviderLaneProjection(lane) {
2
+ return {
3
+ schemaVersion: 1,
4
+ laneId: lane.laneId,
5
+ conversationId: lane.conversationId,
6
+ runtimeProviderId: lane.runtimeProviderId,
7
+ providerKind: lane.providerKind,
8
+ ...(lane.providerDisplayName ? { providerDisplayName: lane.providerDisplayName } : {}),
9
+ ...(lane.modelId ? { modelId: lane.modelId } : {}),
10
+ ...(lane.modelDisplayName ? { modelDisplayName: lane.modelDisplayName } : {}),
11
+ resumeCompatibilityKey: lane.resumeCompatibilityKey,
12
+ workspaceEpoch: {
13
+ id: lane.workspaceEpoch.id,
14
+ fingerprint: lane.workspaceEpoch.fingerprint,
15
+ wireMode: lane.workspaceEpoch.wireMode,
16
+ kind: lane.workspaceEpoch.kind,
17
+ ...(lane.workspaceEpoch.label ? { label: lane.workspaceEpoch.label } : {}),
18
+ },
19
+ status: lane.status,
20
+ revision: lane.revision,
21
+ ...(lane.capabilities ? { capabilities: lane.capabilities } : {}),
22
+ ...(lane.lastUsedAt ? { lastUsedAt: lane.lastUsedAt } : {}),
23
+ ...(lane.lastRequestId ? { lastRequestId: lane.lastRequestId } : {}),
24
+ ...(lane.redactedNativeSessionHash ? { redactedNativeSessionHash: lane.redactedNativeSessionHash } : {}),
25
+ ...(lane.invalidationReason ? { invalidationReason: lane.invalidationReason } : {}),
26
+ };
27
+ }
28
+ //# sourceMappingURL=providerLaneTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerLaneTypes.js","sourceRoot":"","sources":["../../src/state/providerLaneTypes.ts"],"names":[],"mappings":"AA2IA,MAAM,UAAU,wBAAwB,CAAC,IAA0B;IACjE,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;QACnD,cAAc,EAAE;YACd,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE;YAC1B,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW;YAC5C,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ;YACtC,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI;YAC9B,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E;QACD,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,yBAAyB,EAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpF,CAAA;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { LocalAgentHostPaths } from '../localHostPaths.js';
2
+ import type { ProviderStateCipher } from './providerLaneTypes.js';
3
+ interface SdkProtectedStateStore {
4
+ readonly available: boolean;
5
+ }
6
+ interface SdkProtectedStateEnvelopeCipher {
7
+ readonly available: boolean;
8
+ protect(plaintext: string): string;
9
+ unprotect(ciphertext: string): string;
10
+ }
11
+ interface SdkProtectedStateApi {
12
+ createOsProtectedStateStore?(options?: {
13
+ serviceName?: string;
14
+ configDir?: string;
15
+ storageDir?: string;
16
+ }): SdkProtectedStateStore;
17
+ createProtectedStateEnvelopeCipher?(options?: {
18
+ store?: SdkProtectedStateStore;
19
+ keyName?: string;
20
+ }): SdkProtectedStateEnvelopeCipher;
21
+ }
22
+ export type LoadSdkProtectedStateApi = () => Promise<SdkProtectedStateApi>;
23
+ /**
24
+ * Adapts the canonical SDK protected-state implementation to provider-lane
25
+ * storage. Missing or unavailable platform protection deliberately fails
26
+ * closed; the host never falls back to plaintext continuation state.
27
+ */
28
+ export declare function createSdkProviderStateCipher(paths: LocalAgentHostPaths, loadSdk?: LoadSdkProtectedStateApi): Promise<ProviderStateCipher>;
29
+ export {};
30
+ //# sourceMappingURL=sdkProtectedStateCipher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkProtectedStateCipher.d.ts","sourceRoot":"","sources":["../../src/state/sdkProtectedStateCipher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAKjE,UAAU,sBAAsB;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED,UAAU,+BAA+B;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAA;IAClC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;CACtC;AAED,UAAU,oBAAoB;IAC5B,2BAA2B,CAAC,CAAC,OAAO,CAAC,EAAE;QACrC,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,GAAG,sBAAsB,CAAA;IAC1B,kCAAkC,CAAC,CAAC,OAAO,CAAC,EAAE;QAC5C,KAAK,CAAC,EAAE,sBAAsB,CAAA;QAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,GAAG,+BAA+B,CAAA;CACpC;AAED,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAE1E;;;;GAIG;AACH,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,wBAA2C,GACnD,OAAO,CAAC,mBAAmB,CAAC,CAwB9B"}
@@ -0,0 +1,50 @@
1
+ import { join } from 'node:path';
2
+ const PROVIDER_STATE_SERVICE = 'ai.xenostudio.xeno-agent.provider-lanes';
3
+ const PROVIDER_STATE_KEY = 'xeno.provider-lanes.encryption-key.v1';
4
+ /**
5
+ * Adapts the canonical SDK protected-state implementation to provider-lane
6
+ * storage. Missing or unavailable platform protection deliberately fails
7
+ * closed; the host never falls back to plaintext continuation state.
8
+ */
9
+ export async function createSdkProviderStateCipher(paths, loadSdk = loadInstalledSdk) {
10
+ try {
11
+ const sdk = await loadSdk();
12
+ if (!sdk.createOsProtectedStateStore || !sdk.createProtectedStateEnvelopeCipher) {
13
+ return unavailableCipher();
14
+ }
15
+ const store = sdk.createOsProtectedStateStore({
16
+ serviceName: PROVIDER_STATE_SERVICE,
17
+ configDir: paths.stateRepositoryRoot,
18
+ storageDir: join(paths.stateRepositoryRoot, 'secure', 'provider-state'),
19
+ });
20
+ const cipher = sdk.createProtectedStateEnvelopeCipher({
21
+ store,
22
+ keyName: PROVIDER_STATE_KEY,
23
+ });
24
+ if (!store.available || !cipher.available)
25
+ return unavailableCipher();
26
+ return {
27
+ available: true,
28
+ encrypt: (plaintext) => cipher.protect(plaintext),
29
+ decrypt: (ciphertext) => cipher.unprotect(ciphertext),
30
+ };
31
+ }
32
+ catch {
33
+ return unavailableCipher();
34
+ }
35
+ }
36
+ async function loadInstalledSdk() {
37
+ return import('@xenosystem/agent-sdk');
38
+ }
39
+ function unavailableCipher() {
40
+ return {
41
+ available: false,
42
+ encrypt: () => {
43
+ throw new Error('SDK protected provider state is unavailable.');
44
+ },
45
+ decrypt: () => {
46
+ throw new Error('SDK protected provider state is unavailable.');
47
+ },
48
+ };
49
+ }
50
+ //# sourceMappingURL=sdkProtectedStateCipher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkProtectedStateCipher.js","sourceRoot":"","sources":["../../src/state/sdkProtectedStateCipher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAIhC,MAAM,sBAAsB,GAAG,yCAAyC,CAAA;AACxE,MAAM,kBAAkB,GAAG,uCAAuC,CAAA;AA0BlE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,KAA0B,EAC1B,UAAoC,gBAAgB;IAEpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAA;QAC3B,IAAI,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,GAAG,CAAC,kCAAkC,EAAE,CAAC;YAChF,OAAO,iBAAiB,EAAE,CAAA;QAC5B,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,CAAC,2BAA2B,CAAC;YAC5C,WAAW,EAAE,sBAAsB;YACnC,SAAS,EAAE,KAAK,CAAC,mBAAmB;YACpC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,CAAC;SACxE,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,GAAG,CAAC,kCAAkC,CAAC;YACpD,KAAK;YACL,OAAO,EAAE,kBAAkB;SAC5B,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO,iBAAiB,EAAE,CAAA;QACrE,OAAO;YACL,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;YACjD,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC;SACtD,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,iBAAiB,EAAE,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,OAAO,MAAM,CAAC,uBAAuB,CAAkC,CAAA;AACzE,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QACjE,CAAC;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QACjE,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -1,12 +1,25 @@
1
1
  import { type CommandExecutionPort } from '../isolation/CommandExecution.js';
2
2
  import type { CommandStreamPort } from '../isolation/CommandStream.js';
3
- import type { AgentHostEventType, AgentHostClientIdentity, AgentWorkspaceAccessContext, AgentWorkspaceCommandRunRequest, AgentWorkspaceCommandRunResult, AgentWorkspaceDirectoryListRequest, AgentWorkspaceDirectoryListResult, AgentWorkspaceFileReadRequest, AgentWorkspaceFileReadResult, AgentWorkspaceFileWriteRequest, AgentWorkspaceFileWriteResult, AgentWorkspaceGrantRequest, AgentWorkspaceGrantResult, AgentWorkspacePtyInputRequest, AgentWorkspacePtyResizeRequest, AgentWorkspacePtySnapshotRequest, AgentWorkspacePtySnapshotResult, AgentWorkspacePtyStartRequest, AgentWorkspacePtyStartResult, AgentWorkspaceTerminalControlRequest, AgentWorkspaceTerminalControlResult, AgentWorkspaceTerminalStartRequest, AgentWorkspaceTerminalStartResult } from '@xenosystem/agent-interface-contract';
3
+ import type { AgentCockpitErrorCode, AgentHostEventType, AgentHostClientIdentity, AgentWorkspaceAccessContext, AgentWorkspaceCommandRunRequest, AgentWorkspaceCommandRunResult, AgentWorkspaceDirectoryListRequest, AgentWorkspaceDirectoryListResult, AgentWorkspaceFileReadRequest, AgentWorkspaceFileReadResult, AgentWorkspaceFileWriteRequest, AgentWorkspaceFileWriteResult, AgentWorkspaceGrantRequest, AgentWorkspaceGrantResult, AgentWorkspacePtyInputRequest, AgentWorkspacePtyResizeRequest, AgentWorkspacePtySnapshotRequest, AgentWorkspacePtySnapshotResult, AgentWorkspacePtyStartRequest, AgentWorkspacePtyStartResult, ProviderSessionPtyProfile, AgentWorkspaceTerminalControlRequest, AgentWorkspaceTerminalControlResult, AgentWorkspaceTerminalStartRequest, AgentWorkspaceTerminalStartResult } from '@xenosystem/agent-interface-contract';
4
4
  type WorkspaceEventSink = (type: AgentHostEventType, payload: Record<string, unknown>) => void;
5
5
  interface PersistedApplicationGrant {
6
6
  path: string;
7
7
  source: 'user-picker' | 'legacy-migration' | 'host-managed';
8
8
  createdAt: number;
9
9
  }
10
+ export type ProviderSessionPtyResolver = (profile: ProviderSessionPtyProfile, cwd: string, platform?: NodeJS.Platform) => {
11
+ executable: string;
12
+ args: string[];
13
+ } | {
14
+ error: string;
15
+ code?: AgentCockpitErrorCode;
16
+ } | Promise<{
17
+ executable: string;
18
+ args: string[];
19
+ } | {
20
+ error: string;
21
+ code?: AgentCockpitErrorCode;
22
+ }>;
10
23
  export interface WorkspaceHostServiceOptions {
11
24
  rootDirectory: string;
12
25
  managedConversationRoot?: string;
@@ -25,6 +38,7 @@ export interface WorkspaceHostServiceOptions {
25
38
  * sandbox, not anything about the sandbox itself.
26
39
  */
27
40
  executionEnvironment?: RunCommandExecutionEnvironment;
41
+ providerSessionPtyResolver?: ProviderSessionPtyResolver | undefined;
28
42
  }
29
43
  /**
30
44
  * The slice of `RunExecutionEnvironment` this service needs.
@@ -85,6 +99,8 @@ export declare class WorkspaceHostService {
85
99
  private readonly grantStorePath;
86
100
  private readonly applicationGrantStorePath;
87
101
  private readonly managedConversationRoot;
102
+ private readonly providerSessionTerminalRoot;
103
+ private readonly providerSessionPtyResolver?;
88
104
  private readonly terminalSessions;
89
105
  private readonly ptySessions;
90
106
  private readonly grants;
@@ -95,6 +111,11 @@ export declare class WorkspaceHostService {
95
111
  private readonly executionEnvironment;
96
112
  constructor(options: WorkspaceHostServiceOptions);
97
113
  setEventSink(sink: WorkspaceEventSink): void;
114
+ /**
115
+ * Creates the neutral, host-owned workspace used by Chat mode. This does not
116
+ * mint a renderer grant: authorization remains scoped to the conversation ID.
117
+ */
118
+ ensureManagedConversationWorkspace(conversationId: string): string;
98
119
  grantDirectory(request: AgentWorkspaceGrantRequest): AgentWorkspaceGrantResult;
99
120
  /**
100
121
  * The directories the user has explicitly granted, canonicalised.
@@ -121,6 +142,8 @@ export declare class WorkspaceHostService {
121
142
  stopTerminal(request: AgentWorkspaceTerminalControlRequest): AgentWorkspaceTerminalControlResult;
122
143
  startPty(request: AgentWorkspacePtyStartRequest): Promise<AgentWorkspacePtyStartResult>;
123
144
  snapshotPty(request: AgentWorkspacePtySnapshotRequest): AgentWorkspacePtySnapshotResult;
145
+ /** Host-only ownership transfer used when a native provider TUI is reattached by another surface. */
146
+ transferPtyOwnership(terminalId: string, ownerInstanceId: string): boolean;
124
147
  inputPty(request: AgentWorkspacePtyInputRequest): AgentWorkspaceTerminalControlResult;
125
148
  resizePty(request: AgentWorkspacePtyResizeRequest): AgentWorkspaceTerminalControlResult;
126
149
  clearPty(request: AgentWorkspaceTerminalControlRequest): AgentWorkspaceTerminalControlResult;
@@ -147,5 +170,12 @@ export declare class WorkspaceHostService {
147
170
  private persistGrants;
148
171
  private persistApplicationGrants;
149
172
  }
173
+ export declare function resolveProviderSessionPtyLaunch(profile: AgentWorkspacePtyStartRequest['profile'], _cwd: string, _platform?: NodeJS.Platform): {
174
+ executable: string;
175
+ args: string[];
176
+ } | {
177
+ error: string;
178
+ code: AgentCockpitErrorCode;
179
+ };
150
180
  export {};
151
181
  //# sourceMappingURL=WorkspaceHostService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceHostService.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceHostService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkspaceHostService.d.ts","sourceRoot":"","sources":["../../src/workspace/WorkspaceHostService.ts"],"names":[],"mappings":"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"}