@allin-ai/agent-client 0.1.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.
Files changed (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +53 -0
  3. package/bin/allinai-agent +4 -0
  4. package/dist/capabilities/context.d.ts +16 -0
  5. package/dist/capabilities/context.d.ts.map +1 -0
  6. package/dist/capabilities/context.js +98 -0
  7. package/dist/capabilities/context.js.map +1 -0
  8. package/dist/capabilities/input.d.ts +7 -0
  9. package/dist/capabilities/input.d.ts.map +1 -0
  10. package/dist/capabilities/input.js +224 -0
  11. package/dist/capabilities/input.js.map +1 -0
  12. package/dist/capabilities/manifest.d.ts +15 -0
  13. package/dist/capabilities/manifest.d.ts.map +1 -0
  14. package/dist/capabilities/manifest.js +292 -0
  15. package/dist/capabilities/manifest.js.map +1 -0
  16. package/dist/capabilities/policy.d.ts +17 -0
  17. package/dist/capabilities/policy.d.ts.map +1 -0
  18. package/dist/capabilities/policy.js +57 -0
  19. package/dist/capabilities/policy.js.map +1 -0
  20. package/dist/capabilities/shell-host.d.ts +32 -0
  21. package/dist/capabilities/shell-host.d.ts.map +1 -0
  22. package/dist/capabilities/shell-host.js +378 -0
  23. package/dist/capabilities/shell-host.js.map +1 -0
  24. package/dist/capabilities/shell-wire.d.ts +13 -0
  25. package/dist/capabilities/shell-wire.d.ts.map +1 -0
  26. package/dist/capabilities/shell-wire.js +60 -0
  27. package/dist/capabilities/shell-wire.js.map +1 -0
  28. package/dist/capabilities/types.d.ts +46 -0
  29. package/dist/capabilities/types.d.ts.map +1 -0
  30. package/dist/capabilities/types.js +7 -0
  31. package/dist/capabilities/types.js.map +1 -0
  32. package/dist/cli/commands.d.ts +83 -0
  33. package/dist/cli/commands.d.ts.map +1 -0
  34. package/dist/cli/commands.js +638 -0
  35. package/dist/cli/commands.js.map +1 -0
  36. package/dist/cli/main.d.ts +2 -0
  37. package/dist/cli/main.d.ts.map +1 -0
  38. package/dist/cli/main.js +7 -0
  39. package/dist/cli/main.js.map +1 -0
  40. package/dist/client/state-store.d.ts +80 -0
  41. package/dist/client/state-store.d.ts.map +1 -0
  42. package/dist/client/state-store.js +422 -0
  43. package/dist/client/state-store.js.map +1 -0
  44. package/dist/client/supervisor.d.ts +118 -0
  45. package/dist/client/supervisor.d.ts.map +1 -0
  46. package/dist/client/supervisor.js +627 -0
  47. package/dist/client/supervisor.js.map +1 -0
  48. package/dist/client/transport.d.ts +30 -0
  49. package/dist/client/transport.d.ts.map +1 -0
  50. package/dist/client/transport.js +2 -0
  51. package/dist/client/transport.js.map +1 -0
  52. package/dist/client/types.d.ts +65 -0
  53. package/dist/client/types.d.ts.map +1 -0
  54. package/dist/client/types.js +13 -0
  55. package/dist/client/types.js.map +1 -0
  56. package/dist/client/wire.d.ts +32 -0
  57. package/dist/client/wire.d.ts.map +1 -0
  58. package/dist/client/wire.js +302 -0
  59. package/dist/client/wire.js.map +1 -0
  60. package/dist/client/ws-transport.d.ts +54 -0
  61. package/dist/client/ws-transport.d.ts.map +1 -0
  62. package/dist/client/ws-transport.js +229 -0
  63. package/dist/client/ws-transport.js.map +1 -0
  64. package/dist/config.d.ts +38 -0
  65. package/dist/config.d.ts.map +1 -0
  66. package/dist/config.js +125 -0
  67. package/dist/config.js.map +1 -0
  68. package/dist/control.d.ts +59 -0
  69. package/dist/control.d.ts.map +1 -0
  70. package/dist/control.js +217 -0
  71. package/dist/control.js.map +1 -0
  72. package/dist/credentials.d.ts +44 -0
  73. package/dist/credentials.d.ts.map +1 -0
  74. package/dist/credentials.js +229 -0
  75. package/dist/credentials.js.map +1 -0
  76. package/dist/hub.d.ts +83 -0
  77. package/dist/hub.d.ts.map +1 -0
  78. package/dist/hub.js +412 -0
  79. package/dist/hub.js.map +1 -0
  80. package/dist/index.d.ts +20 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +18 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/logger.d.ts +47 -0
  85. package/dist/logger.d.ts.map +1 -0
  86. package/dist/logger.js +175 -0
  87. package/dist/logger.js.map +1 -0
  88. package/dist/paths.d.ts +29 -0
  89. package/dist/paths.d.ts.map +1 -0
  90. package/dist/paths.js +50 -0
  91. package/dist/paths.js.map +1 -0
  92. package/dist/plugins/git.d.ts +30 -0
  93. package/dist/plugins/git.d.ts.map +1 -0
  94. package/dist/plugins/git.js +80 -0
  95. package/dist/plugins/git.js.map +1 -0
  96. package/dist/plugins/manager.d.ts +41 -0
  97. package/dist/plugins/manager.d.ts.map +1 -0
  98. package/dist/plugins/manager.js +328 -0
  99. package/dist/plugins/manager.js.map +1 -0
  100. package/dist/plugins/manifest.d.ts +9 -0
  101. package/dist/plugins/manifest.d.ts.map +1 -0
  102. package/dist/plugins/manifest.js +63 -0
  103. package/dist/plugins/manifest.js.map +1 -0
  104. package/dist/plugins/types.d.ts +39 -0
  105. package/dist/plugins/types.d.ts.map +1 -0
  106. package/dist/plugins/types.js +2 -0
  107. package/dist/plugins/types.js.map +1 -0
  108. package/dist/runtime/claude.d.ts +30 -0
  109. package/dist/runtime/claude.d.ts.map +1 -0
  110. package/dist/runtime/claude.js +163 -0
  111. package/dist/runtime/claude.js.map +1 -0
  112. package/dist/runtime/codex.d.ts +44 -0
  113. package/dist/runtime/codex.d.ts.map +1 -0
  114. package/dist/runtime/codex.js +192 -0
  115. package/dist/runtime/codex.js.map +1 -0
  116. package/dist/runtime/events.d.ts +7 -0
  117. package/dist/runtime/events.d.ts.map +1 -0
  118. package/dist/runtime/events.js +37 -0
  119. package/dist/runtime/events.js.map +1 -0
  120. package/dist/runtime/index.d.ts +10 -0
  121. package/dist/runtime/index.d.ts.map +1 -0
  122. package/dist/runtime/index.js +10 -0
  123. package/dist/runtime/index.js.map +1 -0
  124. package/dist/runtime/pi.d.ts +34 -0
  125. package/dist/runtime/pi.d.ts.map +1 -0
  126. package/dist/runtime/pi.js +211 -0
  127. package/dist/runtime/pi.js.map +1 -0
  128. package/dist/runtime/registry.d.ts +16 -0
  129. package/dist/runtime/registry.d.ts.map +1 -0
  130. package/dist/runtime/registry.js +22 -0
  131. package/dist/runtime/registry.js.map +1 -0
  132. package/dist/runtime/runner-child.d.ts +2 -0
  133. package/dist/runtime/runner-child.d.ts.map +1 -0
  134. package/dist/runtime/runner-child.js +41 -0
  135. package/dist/runtime/runner-child.js.map +1 -0
  136. package/dist/runtime/runner-manager.d.ts +77 -0
  137. package/dist/runtime/runner-manager.d.ts.map +1 -0
  138. package/dist/runtime/runner-manager.js +295 -0
  139. package/dist/runtime/runner-manager.js.map +1 -0
  140. package/dist/runtime/runner-wire.d.ts +23 -0
  141. package/dist/runtime/runner-wire.d.ts.map +1 -0
  142. package/dist/runtime/runner-wire.js +93 -0
  143. package/dist/runtime/runner-wire.js.map +1 -0
  144. package/dist/runtime/types.d.ts +43 -0
  145. package/dist/runtime/types.d.ts.map +1 -0
  146. package/dist/runtime/types.js +3 -0
  147. package/dist/runtime/types.js.map +1 -0
  148. package/dist/runtime/zcode.d.ts +14 -0
  149. package/dist/runtime/zcode.d.ts.map +1 -0
  150. package/dist/runtime/zcode.js +21 -0
  151. package/dist/runtime/zcode.js.map +1 -0
  152. package/dist/service/launchd.d.ts +34 -0
  153. package/dist/service/launchd.d.ts.map +1 -0
  154. package/dist/service/launchd.js +86 -0
  155. package/dist/service/launchd.js.map +1 -0
  156. package/dist/service/systemd.d.ts +16 -0
  157. package/dist/service/systemd.d.ts.map +1 -0
  158. package/dist/service/systemd.js +89 -0
  159. package/dist/service/systemd.js.map +1 -0
  160. package/dist/wire.d.ts +24 -0
  161. package/dist/wire.d.ts.map +1 -0
  162. package/dist/wire.js +7 -0
  163. package/dist/wire.js.map +1 -0
  164. package/package.json +140 -0
@@ -0,0 +1,2 @@
1
+ export declare function main(args?: string[]): Promise<void>;
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAEA,wBAAsB,IAAI,CAAC,IAAI,WAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE"}
@@ -0,0 +1,7 @@
1
+ import { runCli } from "./commands.js";
2
+ export async function main(args = process.argv.slice(2)) {
3
+ const result = await runCli(args);
4
+ if (result.exitCode !== 0)
5
+ process.exitCode = result.exitCode;
6
+ }
7
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAChE,CAAC"}
@@ -0,0 +1,80 @@
1
+ import type { ClientCommand, ClientEvent } from "./types.js";
2
+ import type { ActivePluginSnapshot, PluginStateStore, StoredPluginState } from "../plugins/types.js";
3
+ export declare const EXECUTION_STATES: readonly ["received", "awaiting_approval", "running", "rejected", "done", "failed", "cancelled", "recovery_required"];
4
+ export type ExecutionState = (typeof EXECUTION_STATES)[number];
5
+ export type StoredExecution = {
6
+ executionId: string;
7
+ command: ClientCommand;
8
+ state: ExecutionState;
9
+ attempt: number;
10
+ admittedAt: string;
11
+ updatedAt: string;
12
+ lastEventSeq: number;
13
+ pluginSnapshot: ActivePluginSnapshot[];
14
+ };
15
+ export type AdmissionResult = {
16
+ disposition: "inserted" | "duplicate";
17
+ execution: StoredExecution;
18
+ };
19
+ export type AdmissionOptions = {
20
+ pluginSnapshot?: ActivePluginSnapshot[];
21
+ };
22
+ export type EventToAppend = Omit<ClientEvent, "eventSeq"> & {
23
+ eventSeq?: number;
24
+ };
25
+ /**
26
+ * Durable local inbox/outbox for one Agent Client daemon.
27
+ *
28
+ * `last_event_seq` deliberately lives with the execution rather than the
29
+ * outbox: acknowledged rows are deleted, but a later event must never reuse
30
+ * their sequence number.
31
+ */
32
+ export declare class ClientStateStore implements PluginStateStore {
33
+ private readonly db;
34
+ constructor(dbPath: string);
35
+ close(): void;
36
+ /**
37
+ * Atomically writes the inbox command and its initial received event. A
38
+ * redelivered execution returns the existing row without adding an event.
39
+ */
40
+ admit(command: ClientCommand, options?: AdmissionOptions): AdmissionResult;
41
+ getExecution(executionId: string): StoredExecution | null;
42
+ listExecutions(): StoredExecution[];
43
+ /**
44
+ * Changes execution state and commits the matching state event in the same
45
+ * transaction. Callers cannot report a durable state without a durable
46
+ * outbox record for it.
47
+ */
48
+ transition(executionId: string, nextState: ExecutionState, payload?: Record<string, unknown>): ClientEvent;
49
+ /**
50
+ * Appends a non-state runtime event supplied by the caller. If no sequence is
51
+ * supplied, this store allocates the next sequence. Explicit sequences are
52
+ * accepted only when they are the next sequence, preventing acknowledgement
53
+ * watermarks from skipping an event.
54
+ */
55
+ appendEvent(event: EventToAppend): ClientEvent;
56
+ listUnackedEvents(executionId?: string): ClientEvent[];
57
+ /** Deletes only events at or below the Hub's acknowledgement watermark. */
58
+ acknowledge(executionId: string, eventSeqWatermark: number): number;
59
+ /**
60
+ * On daemon boot, no in-process runner can be trusted to still exist. Mark
61
+ * every persisted running execution (or one selected execution) as needing
62
+ * recovery and enqueue a matching state event.
63
+ */
64
+ markRecoveryRequired(executionId?: string): ClientEvent[];
65
+ private initialize;
66
+ private transaction;
67
+ private getExecutionRow;
68
+ private requireExecutionRow;
69
+ private toExecution;
70
+ getLastPluginSyncRevision(): string | null;
71
+ recordPluginSyncSuccess(revision: string): void;
72
+ listPluginStates(): StoredPluginState[];
73
+ savePluginState(state: StoredPluginState): void;
74
+ private assertLegalTransition;
75
+ private transitionRow;
76
+ private insertOutboxEvent;
77
+ private parseStoredEvent;
78
+ private assertValidEvent;
79
+ }
80
+ //# sourceMappingURL=state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/client/state-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAE9E,OAAO,KAAK,EACV,oBAAoB,EAEpB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,gBAAgB,uHASnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,oBAAoB,EAAE,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,WAAW,EAAE,UAAU,GAAG,WAAW,CAAC;IACtC,SAAS,EAAE,eAAe,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAmHF;;;;;;GAMG;AACH,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;gBAEtB,MAAM,EAAE,MAAM;IAK1B,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,KAAK,CACH,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,gBAAqB,GAC7B,eAAe;IAwDlB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAKzD,cAAc,IAAI,eAAe,EAAE;IAWnC;;;;OAIG;IACH,UAAU,CACR,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,cAAc,EACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,WAAW;IAQd;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,WAAW;IAgC9C,iBAAiB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;IAoBtD,2EAA2E;IAC3E,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM;IAenE;;;;OAIG;IACH,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;IAuBzD,OAAO,CAAC,UAAU;IA4ClB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,WAAW;IAwBnB,yBAAyB,IAAI,MAAM,GAAG,IAAI;IAO1C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAa/C,gBAAgB,IAAI,iBAAiB,EAAE;IAYvC,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAkB/C,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,gBAAgB;CAUzB"}
@@ -0,0 +1,422 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ import { parseClientCommand, parseClientEventBatch } from "./wire.js";
3
+ export const EXECUTION_STATES = [
4
+ "received",
5
+ "awaiting_approval",
6
+ "running",
7
+ "rejected",
8
+ "done",
9
+ "failed",
10
+ "cancelled",
11
+ "recovery_required",
12
+ ];
13
+ const LEGAL_TRANSITIONS = {
14
+ received: ["awaiting_approval", "running", "rejected", "cancelled"],
15
+ awaiting_approval: ["running", "rejected", "cancelled"],
16
+ running: ["done", "failed", "cancelled", "recovery_required"],
17
+ rejected: [],
18
+ done: [],
19
+ failed: [],
20
+ cancelled: [],
21
+ recovery_required: [],
22
+ };
23
+ function isExecutionState(value) {
24
+ return EXECUTION_STATES.includes(value);
25
+ }
26
+ function now() {
27
+ return new Date().toISOString();
28
+ }
29
+ function commandAttempt(command) {
30
+ return command.kind === "cancel" ? 0 : command.attempt;
31
+ }
32
+ function isPlainObject(value) {
33
+ return typeof value === "object" && value !== null && !Array.isArray(value);
34
+ }
35
+ function normalizePluginSnapshot(value) {
36
+ const seen = new Set();
37
+ return value.map((plugin) => {
38
+ if (!plugin ||
39
+ typeof plugin.id !== "string" ||
40
+ !plugin.id ||
41
+ typeof plugin.resolvedCommit !== "string" ||
42
+ !/^[0-9a-f]{40}$/i.test(plugin.resolvedCommit) ||
43
+ seen.has(plugin.id)) {
44
+ throw new TypeError("Plugin snapshot must contain unique full commits");
45
+ }
46
+ seen.add(plugin.id);
47
+ return {
48
+ id: plugin.id,
49
+ resolvedCommit: plugin.resolvedCommit.toLowerCase(),
50
+ };
51
+ });
52
+ }
53
+ function parsePluginSnapshot(value) {
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(value);
57
+ }
58
+ catch {
59
+ throw new TypeError("Stored plugin snapshot is invalid JSON");
60
+ }
61
+ if (!Array.isArray(parsed))
62
+ throw new TypeError("Stored plugin snapshot is invalid");
63
+ return normalizePluginSnapshot(parsed);
64
+ }
65
+ function assertInstalledPlugin(value) {
66
+ if (!isPlainObject(value) ||
67
+ typeof value.id !== "string" ||
68
+ !value.id ||
69
+ typeof value.gitUrl !== "string" ||
70
+ !value.gitUrl ||
71
+ typeof value.enabled !== "boolean" ||
72
+ typeof value.resolvedCommit !== "string" ||
73
+ !value.resolvedCommit ||
74
+ typeof value.installedAt !== "string" ||
75
+ !value.installedAt ||
76
+ !["active", "blocked", "failed"].includes(value.status)) {
77
+ throw new TypeError("Plugin installation record is invalid");
78
+ }
79
+ }
80
+ function parseInstalledPlugin(value) {
81
+ let parsed;
82
+ try {
83
+ parsed = JSON.parse(value);
84
+ }
85
+ catch {
86
+ throw new TypeError("Stored plugin record is invalid JSON");
87
+ }
88
+ assertInstalledPlugin(parsed);
89
+ return parsed;
90
+ }
91
+ /**
92
+ * Durable local inbox/outbox for one Agent Client daemon.
93
+ *
94
+ * `last_event_seq` deliberately lives with the execution rather than the
95
+ * outbox: acknowledged rows are deleted, but a later event must never reuse
96
+ * their sequence number.
97
+ */
98
+ export class ClientStateStore {
99
+ db;
100
+ constructor(dbPath) {
101
+ this.db = new DatabaseSync(dbPath);
102
+ this.initialize();
103
+ }
104
+ close() {
105
+ this.db.close();
106
+ }
107
+ /**
108
+ * Atomically writes the inbox command and its initial received event. A
109
+ * redelivered execution returns the existing row without adding an event.
110
+ */
111
+ admit(command, options = {}) {
112
+ return this.transaction(() => {
113
+ const previous = this.getExecutionRow(command.executionId);
114
+ if (previous) {
115
+ return {
116
+ disposition: "duplicate",
117
+ execution: this.toExecution(previous),
118
+ };
119
+ }
120
+ const admittedAt = now();
121
+ const pluginSnapshot = normalizePluginSnapshot(options.pluginSnapshot ?? []);
122
+ const received = {
123
+ executionId: command.executionId,
124
+ eventSeq: 1,
125
+ type: "received",
126
+ occurredAt: admittedAt,
127
+ };
128
+ if (pluginSnapshot.length > 0)
129
+ received.payload = { pluginSnapshot };
130
+ this.db
131
+ .prepare(`INSERT INTO executions (
132
+ execution_id, command_json, state, attempt, admitted_at, updated_at, last_event_seq, plugin_snapshot_json
133
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
134
+ .run(command.executionId, JSON.stringify(command), "received", commandAttempt(command), admittedAt, admittedAt, received.eventSeq, JSON.stringify(pluginSnapshot));
135
+ this.insertOutboxEvent(received);
136
+ return {
137
+ disposition: "inserted",
138
+ execution: {
139
+ executionId: command.executionId,
140
+ command,
141
+ state: "received",
142
+ attempt: commandAttempt(command),
143
+ admittedAt,
144
+ updatedAt: admittedAt,
145
+ lastEventSeq: received.eventSeq,
146
+ pluginSnapshot,
147
+ },
148
+ };
149
+ });
150
+ }
151
+ getExecution(executionId) {
152
+ const row = this.getExecutionRow(executionId);
153
+ return row ? this.toExecution(row) : null;
154
+ }
155
+ listExecutions() {
156
+ const rows = this.db
157
+ .prepare(`SELECT execution_id, command_json, state, attempt, admitted_at, updated_at, last_event_seq, plugin_snapshot_json
158
+ FROM executions
159
+ ORDER BY admitted_at ASC, execution_id ASC`)
160
+ .all();
161
+ return rows.map((row) => this.toExecution(row));
162
+ }
163
+ /**
164
+ * Changes execution state and commits the matching state event in the same
165
+ * transaction. Callers cannot report a durable state without a durable
166
+ * outbox record for it.
167
+ */
168
+ transition(executionId, nextState, payload) {
169
+ return this.transaction(() => {
170
+ const current = this.requireExecutionRow(executionId);
171
+ this.assertLegalTransition(current, nextState);
172
+ return this.transitionRow(current, nextState, payload);
173
+ });
174
+ }
175
+ /**
176
+ * Appends a non-state runtime event supplied by the caller. If no sequence is
177
+ * supplied, this store allocates the next sequence. Explicit sequences are
178
+ * accepted only when they are the next sequence, preventing acknowledgement
179
+ * watermarks from skipping an event.
180
+ */
181
+ appendEvent(event) {
182
+ if (event.type !== "progress") {
183
+ throw new TypeError("Only progress events may be appended directly; state events must use transition");
184
+ }
185
+ return this.transaction(() => {
186
+ const current = this.requireExecutionRow(event.executionId);
187
+ const eventSeq = event.eventSeq ?? current.last_event_seq + 1;
188
+ if (!Number.isSafeInteger(eventSeq) ||
189
+ eventSeq !== current.last_event_seq + 1) {
190
+ throw new RangeError(`Event sequence for ${event.executionId} must be ${current.last_event_seq + 1}`);
191
+ }
192
+ const storedEvent = { ...event, eventSeq };
193
+ this.assertValidEvent(storedEvent);
194
+ this.insertOutboxEvent(storedEvent);
195
+ this.db
196
+ .prepare(`UPDATE executions
197
+ SET last_event_seq = ?, updated_at = ?
198
+ WHERE execution_id = ?`)
199
+ .run(storedEvent.eventSeq, now(), storedEvent.executionId);
200
+ return storedEvent;
201
+ });
202
+ }
203
+ listUnackedEvents(executionId) {
204
+ const rows = executionId
205
+ ? this.db
206
+ .prepare(`SELECT event_json FROM outbox
207
+ WHERE execution_id = ?
208
+ ORDER BY event_seq ASC`)
209
+ .all(executionId)
210
+ : this.db
211
+ .prepare(`SELECT event_json FROM outbox
212
+ ORDER BY execution_id ASC, event_seq ASC`)
213
+ .all();
214
+ return rows.map(({ event_json: eventJson }) => this.parseStoredEvent(eventJson));
215
+ }
216
+ /** Deletes only events at or below the Hub's acknowledgement watermark. */
217
+ acknowledge(executionId, eventSeqWatermark) {
218
+ if (!Number.isSafeInteger(eventSeqWatermark) || eventSeqWatermark < 0) {
219
+ throw new RangeError("Acknowledgement watermark must be a non-negative safe integer");
220
+ }
221
+ const result = this.db
222
+ .prepare(`DELETE FROM outbox
223
+ WHERE execution_id = ? AND event_seq <= ?`)
224
+ .run(executionId, eventSeqWatermark);
225
+ return Number(result.changes);
226
+ }
227
+ /**
228
+ * On daemon boot, no in-process runner can be trusted to still exist. Mark
229
+ * every persisted running execution (or one selected execution) as needing
230
+ * recovery and enqueue a matching state event.
231
+ */
232
+ markRecoveryRequired(executionId) {
233
+ return this.transaction(() => {
234
+ const rows = executionId
235
+ ? this.db
236
+ .prepare(`SELECT execution_id, command_json, state, attempt, admitted_at, updated_at, last_event_seq, plugin_snapshot_json
237
+ FROM executions
238
+ WHERE execution_id = ? AND state = 'running'`)
239
+ .all(executionId)
240
+ : this.db
241
+ .prepare(`SELECT execution_id, command_json, state, attempt, admitted_at, updated_at, last_event_seq, plugin_snapshot_json
242
+ FROM executions
243
+ WHERE state = 'running'
244
+ ORDER BY admitted_at ASC, execution_id ASC`)
245
+ .all();
246
+ return rows.map((row) => this.transitionRow(row, "recovery_required"));
247
+ });
248
+ }
249
+ initialize() {
250
+ this.transaction(() => {
251
+ this.db.exec(`
252
+ CREATE TABLE IF NOT EXISTS executions (
253
+ execution_id TEXT PRIMARY KEY,
254
+ command_json TEXT NOT NULL,
255
+ state TEXT NOT NULL,
256
+ attempt INTEGER NOT NULL,
257
+ admitted_at TEXT NOT NULL,
258
+ updated_at TEXT NOT NULL,
259
+ last_event_seq INTEGER NOT NULL DEFAULT 0,
260
+ plugin_snapshot_json TEXT NOT NULL DEFAULT '[]'
261
+ );
262
+
263
+ CREATE TABLE IF NOT EXISTS outbox (
264
+ execution_id TEXT NOT NULL,
265
+ event_seq INTEGER NOT NULL,
266
+ event_json TEXT NOT NULL,
267
+ PRIMARY KEY (execution_id, event_seq)
268
+ );
269
+
270
+ CREATE TABLE IF NOT EXISTS plugin_states (
271
+ plugin_id TEXT PRIMARY KEY,
272
+ plugin_json TEXT NOT NULL,
273
+ active_json TEXT
274
+ );
275
+
276
+ CREATE TABLE IF NOT EXISTS plugin_sync_state (
277
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
278
+ revision TEXT NOT NULL,
279
+ synced_at TEXT NOT NULL
280
+ );
281
+ `);
282
+ const columns = this.db
283
+ .prepare("PRAGMA table_info(executions)")
284
+ .all();
285
+ if (!columns.some((column) => column.name === "plugin_snapshot_json")) {
286
+ this.db.exec("ALTER TABLE executions ADD COLUMN plugin_snapshot_json TEXT NOT NULL DEFAULT '[]'");
287
+ }
288
+ });
289
+ }
290
+ transaction(fn) {
291
+ this.db.exec("BEGIN IMMEDIATE");
292
+ try {
293
+ const result = fn();
294
+ this.db.exec("COMMIT");
295
+ return result;
296
+ }
297
+ catch (error) {
298
+ this.db.exec("ROLLBACK");
299
+ throw error;
300
+ }
301
+ }
302
+ getExecutionRow(executionId) {
303
+ return (this.db
304
+ .prepare(`SELECT execution_id, command_json, state, attempt, admitted_at, updated_at, last_event_seq, plugin_snapshot_json
305
+ FROM executions
306
+ WHERE execution_id = ?`)
307
+ .get(executionId) ?? null);
308
+ }
309
+ requireExecutionRow(executionId) {
310
+ const row = this.getExecutionRow(executionId);
311
+ if (!row)
312
+ throw new Error(`Unknown execution ${executionId}`);
313
+ return row;
314
+ }
315
+ toExecution(row) {
316
+ if (!isExecutionState(row.state)) {
317
+ throw new TypeError(`Stored execution ${row.execution_id} has invalid state ${row.state}`);
318
+ }
319
+ const command = parseClientCommand(JSON.parse(row.command_json));
320
+ if (!command) {
321
+ throw new TypeError(`Stored execution ${row.execution_id} has an invalid command`);
322
+ }
323
+ return {
324
+ executionId: row.execution_id,
325
+ command,
326
+ state: row.state,
327
+ attempt: row.attempt,
328
+ admittedAt: row.admitted_at,
329
+ updatedAt: row.updated_at,
330
+ lastEventSeq: row.last_event_seq,
331
+ pluginSnapshot: parsePluginSnapshot(row.plugin_snapshot_json),
332
+ };
333
+ }
334
+ getLastPluginSyncRevision() {
335
+ const row = this.db
336
+ .prepare("SELECT revision FROM plugin_sync_state WHERE singleton = 1")
337
+ .get();
338
+ return row?.revision ?? null;
339
+ }
340
+ recordPluginSyncSuccess(revision) {
341
+ if (typeof revision !== "string" || revision.trim().length === 0) {
342
+ throw new TypeError("Plugin sync revision must be a nonempty string");
343
+ }
344
+ this.db
345
+ .prepare(`INSERT INTO plugin_sync_state (singleton, revision, synced_at)
346
+ VALUES (1, ?, ?)
347
+ ON CONFLICT(singleton) DO UPDATE SET revision = excluded.revision, synced_at = excluded.synced_at`)
348
+ .run(revision, now());
349
+ }
350
+ listPluginStates() {
351
+ const rows = this.db
352
+ .prepare("SELECT plugin_json, active_json FROM plugin_states ORDER BY plugin_id ASC")
353
+ .all();
354
+ return rows.map((row) => ({
355
+ plugin: parseInstalledPlugin(row.plugin_json),
356
+ active: row.active_json ? parseInstalledPlugin(row.active_json) : null,
357
+ }));
358
+ }
359
+ savePluginState(state) {
360
+ assertInstalledPlugin(state.plugin);
361
+ if (state.active)
362
+ assertInstalledPlugin(state.active);
363
+ this.db
364
+ .prepare(`INSERT INTO plugin_states (plugin_id, plugin_json, active_json)
365
+ VALUES (?, ?, ?)
366
+ ON CONFLICT(plugin_id) DO UPDATE SET
367
+ plugin_json = excluded.plugin_json,
368
+ active_json = excluded.active_json`)
369
+ .run(state.plugin.id, JSON.stringify(state.plugin), state.active ? JSON.stringify(state.active) : null);
370
+ }
371
+ assertLegalTransition(current, nextState) {
372
+ if (!isExecutionState(current.state)) {
373
+ throw new TypeError(`Stored execution ${current.execution_id} has invalid state ${current.state}`);
374
+ }
375
+ if (!LEGAL_TRANSITIONS[current.state].includes(nextState)) {
376
+ throw new Error(`Cannot transition execution ${current.execution_id} from ${current.state} to ${nextState}`);
377
+ }
378
+ }
379
+ transitionRow(current, nextState, payload) {
380
+ const occurredAt = now();
381
+ const event = {
382
+ executionId: current.execution_id,
383
+ eventSeq: current.last_event_seq + 1,
384
+ type: nextState,
385
+ occurredAt,
386
+ };
387
+ if (payload)
388
+ event.payload = payload;
389
+ this.db
390
+ .prepare(`UPDATE executions
391
+ SET state = ?, updated_at = ?, last_event_seq = ?
392
+ WHERE execution_id = ?`)
393
+ .run(nextState, occurredAt, event.eventSeq, current.execution_id);
394
+ this.insertOutboxEvent(event);
395
+ return event;
396
+ }
397
+ insertOutboxEvent(event) {
398
+ this.db
399
+ .prepare(`INSERT INTO outbox (execution_id, event_seq, event_json)
400
+ VALUES (?, ?, ?)`)
401
+ .run(event.executionId, event.eventSeq, JSON.stringify(event));
402
+ }
403
+ parseStoredEvent(eventJson) {
404
+ const parsed = parseClientEventBatch({
405
+ type: "event.push",
406
+ events: [JSON.parse(eventJson)],
407
+ });
408
+ if (!parsed) {
409
+ throw new TypeError("Stored outbox event is invalid");
410
+ }
411
+ return parsed[0];
412
+ }
413
+ assertValidEvent(event) {
414
+ if (!parseClientEventBatch({
415
+ type: "event.push",
416
+ events: [event],
417
+ })) {
418
+ throw new TypeError("Cannot append an invalid client event");
419
+ }
420
+ }
421
+ }
422
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/client/state-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { ClientStateStore } from "./state-store.js";
2
+ import type { ClientCommand } from "./types.js";
3
+ import type { ClientTransport } from "./transport.js";
4
+ import type { ActivePluginSnapshot, InstalledPlugin, PluginConfig } from "../plugins/types.js";
5
+ import { type LocalContextSource } from "../capabilities/context.js";
6
+ import { type CapabilityLocalPolicy } from "../capabilities/policy.js";
7
+ import type { CapabilityEvent } from "../capabilities/shell-wire.js";
8
+ import type { ShellCapability } from "../capabilities/types.js";
9
+ import type { RunnerManager } from "../runtime/types.js";
10
+ type AgentRunCommand = Extract<ClientCommand, {
11
+ kind: "agent.run";
12
+ }>;
13
+ type CapabilityInvokeCommand = Extract<ClientCommand, {
14
+ kind: "capability.invoke";
15
+ }>;
16
+ export declare const LOCAL_POLICY_DECISIONS: readonly ["auto", "approval", "deny"];
17
+ export type LocalPolicyDecision = (typeof LOCAL_POLICY_DECISIONS)[number];
18
+ /**
19
+ * The local daemon decides whether an admitted remote run may launch. The
20
+ * default is deny: receiving a Hub command must not implicitly execute an
21
+ * agent until a local policy has been deliberately configured.
22
+ */
23
+ export type LocalPolicy = (command: AgentRunCommand) => LocalPolicyDecision | Promise<LocalPolicyDecision>;
24
+ export type ClientSupervisorOptions = {
25
+ store: ClientStateStore;
26
+ transport: ClientTransport;
27
+ runner: RunnerManager;
28
+ /** Maximum simultaneous local executions. Overflow is durably rejected. */
29
+ maxConcurrentRuns?: number;
30
+ policy?: LocalPolicy;
31
+ plugins?: PluginManagerPort;
32
+ capabilityHost?: CapabilityHostPort;
33
+ capabilityPolicy?: CapabilityLocalPolicy;
34
+ capabilityContext?: CapabilityContextResolver;
35
+ };
36
+ export type PluginManagerPort = {
37
+ sync(desired: PluginConfig[]): Promise<InstalledPlugin[]>;
38
+ snapshotActivePlugins(runtime?: AgentRunCommand["runtime"]): ActivePluginSnapshot[];
39
+ };
40
+ /** A locally validated capability plus the exact immutable plugin root it owns. */
41
+ export type ResolvedActiveCapability = {
42
+ plugin: InstalledPlugin;
43
+ capability: ShellCapability;
44
+ pluginRoot: string;
45
+ };
46
+ /**
47
+ * The Supervisor only knows how to resolve an active, local declaration and
48
+ * consume structured events. It cannot name an executable or provide argv.
49
+ */
50
+ export type CapabilityHostPort = {
51
+ resolveActiveCapability(capabilityId: string): Promise<ResolvedActiveCapability | null>;
52
+ invoke(resolved: ResolvedActiveCapability, input: unknown, context: Record<string, unknown>, signal: AbortSignal): AsyncIterable<CapabilityEvent>;
53
+ };
54
+ /** Supplies only local metadata. Hub command fields are never spread into it. */
55
+ export type CapabilityContextResolver = (command: CapabilityInvokeCommand, resolved: ResolvedActiveCapability) => LocalContextSource;
56
+ /**
57
+ * Coordinates durable task admission, local execution policy, and outbox
58
+ * delivery. Vendor runtimes and shell hosts remain outside this class.
59
+ */
60
+ export declare class ClientSupervisor {
61
+ private readonly options;
62
+ private readonly policy;
63
+ private readonly capabilityContext;
64
+ private readonly maxConcurrentRuns;
65
+ private readonly pluginSyncInFlight;
66
+ private readonly capabilityAbortControllers;
67
+ private readonly runnerConsumptionTasks;
68
+ private readonly capabilityConsumptionTasks;
69
+ private started;
70
+ private shuttingDown;
71
+ constructor(options: ClientSupervisorOptions);
72
+ start(): Promise<void>;
73
+ stop(): Promise<void>;
74
+ /**
75
+ * Service shutdown has a stricter lifecycle than an ordinary transport
76
+ * disconnect: persist cancellation and signal every locally owned child
77
+ * before the socket and state store are released.
78
+ */
79
+ shutdown(): Promise<void>;
80
+ /**
81
+ * Approval only resumes the exact persisted structured command. It never
82
+ * accepts a replacement command, entrypoint, or argument vector.
83
+ */
84
+ approve(executionId: string): Promise<void>;
85
+ /**
86
+ * Pushes durable outbox rows and removes only the watermark each execution
87
+ * actually received. A failed push does not touch local state, so reconnect
88
+ * replay remains possible.
89
+ */
90
+ flush(): Promise<void>;
91
+ private handleCommand;
92
+ private decide;
93
+ private handleCapabilityCommand;
94
+ private startApprovedCapability;
95
+ private resolveActiveCapability;
96
+ private validateCapabilityInput;
97
+ private startPersistedCapability;
98
+ private consumeCapabilityEvents;
99
+ /**
100
+ * Plugin desired state is independent of task admission. A failure records no
101
+ * successful revision, reports a typed rejection if the transport supports
102
+ * it, and deliberately leaves all in-flight runners untouched.
103
+ */
104
+ private handlePluginSync;
105
+ private syncPluginRevision;
106
+ private reportPluginSync;
107
+ private startPersistedAgentRun;
108
+ private cancelActiveExecution;
109
+ private consumeRunnerEvents;
110
+ private hasCapacity;
111
+ private trackConsumptionTask;
112
+ private waitForConsumptionTasks;
113
+ private appendProgressIfRunning;
114
+ private transitionRunningExecution;
115
+ private requireExecution;
116
+ }
117
+ export {};
118
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/client/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAGjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EACf,YAAY,EACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAGV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAE7B,KAAK,eAAe,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC;AACrE,KAAK,uBAAuB,GAAG,OAAO,CACpC,aAAa,EACb;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAC9B,CAAC;AAEF,eAAO,MAAM,sBAAsB,uCAAwC,CAAC;AAE5E,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,eAAe,KACrB,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,gBAAgB,CAAC;IACxB,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1D,qBAAqB,CACnB,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,GACnC,oBAAoB,EAAE,CAAC;CAC3B,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,uBAAuB,CACrB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC;IAC5C,MAAM,CACJ,QAAQ,EAAE,wBAAwB,EAClC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,MAAM,EAAE,WAAW,GAClB,aAAa,CAAC,eAAe,CAAC,CAAC;CACnC,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,yBAAyB,GAAG,CACtC,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,wBAAwB,KAC/B,kBAAkB,CAAC;AAkFxB;;;GAGG;AACH,qBAAa,gBAAgB;IAiBf,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhBpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoC;IACvE,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAGvC;IACJ,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAoC;IAC3E,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAGvC;IACJ,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEA,OAAO,EAAE,uBAAuB;IAavD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B;;;OAGG;IACG,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBjD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA4Bd,aAAa;YAsCb,MAAM;YASN,uBAAuB;YAyDvB,uBAAuB;YAmDvB,uBAAuB;IA0BrC,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,wBAAwB;YAkElB,uBAAuB;IAyCrC;;;;OAIG;YACW,gBAAgB;YAkBhB,kBAAkB;YAmElB,gBAAgB;YAWhB,sBAAsB;YAiDtB,qBAAqB;YAuBrB,mBAAmB;IAsCjC,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,oBAAoB;YAgBd,uBAAuB;IAYrC,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,0BAA0B;IAWlC,OAAO,CAAC,gBAAgB;CAKzB"}