@moxt-ai/mobius 0.0.4 → 0.0.5

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 (80) hide show
  1. package/dist/acp/session-manager.d.ts.map +1 -1
  2. package/dist/acp/session-manager.js +15 -29
  3. package/dist/acp/session-manager.js.map +1 -1
  4. package/dist/agent-catalog/agent-diagnostics.d.ts +3 -0
  5. package/dist/agent-catalog/agent-diagnostics.d.ts.map +1 -0
  6. package/dist/agent-catalog/agent-diagnostics.js +62 -0
  7. package/dist/agent-catalog/agent-diagnostics.js.map +1 -0
  8. package/dist/agent-catalog/discover-local-agents.d.ts +77 -0
  9. package/dist/agent-catalog/discover-local-agents.d.ts.map +1 -0
  10. package/dist/agent-catalog/discover-local-agents.js +478 -0
  11. package/dist/agent-catalog/discover-local-agents.js.map +1 -0
  12. package/dist/agent-catalog/local-agent.d.ts +38 -0
  13. package/dist/agent-catalog/local-agent.d.ts.map +1 -0
  14. package/dist/agent-catalog/local-agent.js +93 -0
  15. package/dist/agent-catalog/local-agent.js.map +1 -0
  16. package/dist/agent-catalog/publish-agent-catalog.d.ts +3 -0
  17. package/dist/agent-catalog/publish-agent-catalog.d.ts.map +1 -0
  18. package/dist/agent-catalog/publish-agent-catalog.js +58 -0
  19. package/dist/agent-catalog/publish-agent-catalog.js.map +1 -0
  20. package/dist/agent-installation/agent-installation-manager.d.ts +60 -0
  21. package/dist/agent-installation/agent-installation-manager.d.ts.map +1 -0
  22. package/dist/agent-installation/agent-installation-manager.js +242 -0
  23. package/dist/agent-installation/agent-installation-manager.js.map +1 -0
  24. package/dist/agent-installation/automatic-adapter-provisioner.d.ts +18 -0
  25. package/dist/agent-installation/automatic-adapter-provisioner.d.ts.map +1 -0
  26. package/dist/agent-installation/automatic-adapter-provisioner.js +116 -0
  27. package/dist/agent-installation/automatic-adapter-provisioner.js.map +1 -0
  28. package/dist/agent-installation/fixed-agent-install-recipes.d.ts +20 -0
  29. package/dist/agent-installation/fixed-agent-install-recipes.d.ts.map +1 -0
  30. package/dist/agent-installation/fixed-agent-install-recipes.js +163 -0
  31. package/dist/agent-installation/fixed-agent-install-recipes.js.map +1 -0
  32. package/dist/agent-installation/fixed-installation-executor.d.ts +20 -0
  33. package/dist/agent-installation/fixed-installation-executor.d.ts.map +1 -0
  34. package/dist/agent-installation/fixed-installation-executor.js +213 -0
  35. package/dist/agent-installation/fixed-installation-executor.js.map +1 -0
  36. package/dist/agent-installation/installation-grants.d.ts +2 -0
  37. package/dist/agent-installation/installation-grants.d.ts.map +1 -0
  38. package/dist/agent-installation/installation-grants.js +52 -0
  39. package/dist/agent-installation/installation-grants.js.map +1 -0
  40. package/dist/agent-installation/local-installation-authorizer.d.ts +7 -0
  41. package/dist/agent-installation/local-installation-authorizer.d.ts.map +1 -0
  42. package/dist/agent-installation/local-installation-authorizer.js +32 -0
  43. package/dist/agent-installation/local-installation-authorizer.js.map +1 -0
  44. package/dist/agent-installation/managed-adapter-installer.d.ts +21 -0
  45. package/dist/agent-installation/managed-adapter-installer.d.ts.map +1 -0
  46. package/dist/agent-installation/managed-adapter-installer.js +161 -0
  47. package/dist/agent-installation/managed-adapter-installer.js.map +1 -0
  48. package/dist/agent-installation/verified-download.d.ts +24 -0
  49. package/dist/agent-installation/verified-download.d.ts.map +1 -0
  50. package/dist/agent-installation/verified-download.js +158 -0
  51. package/dist/agent-installation/verified-download.js.map +1 -0
  52. package/dist/audit/audit-store.d.ts +1 -0
  53. package/dist/audit/audit-store.d.ts.map +1 -1
  54. package/dist/audit/audit-store.js +12 -4
  55. package/dist/audit/audit-store.js.map +1 -1
  56. package/dist/cli.js +4430 -1573
  57. package/dist/cli.js.map +4 -4
  58. package/dist/config.d.ts +6 -10
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +10 -53
  61. package/dist/config.js.map +1 -1
  62. package/dist/index.js +3233 -464
  63. package/dist/index.js.map +4 -4
  64. package/dist/pairing/pair-local-machine.d.ts +2 -2
  65. package/dist/pairing/pair-local-machine.d.ts.map +1 -1
  66. package/dist/pairing/pair-local-machine.js +41 -20
  67. package/dist/pairing/pair-local-machine.js.map +1 -1
  68. package/dist/process/executable.d.ts +40 -0
  69. package/dist/process/executable.d.ts.map +1 -0
  70. package/dist/process/executable.js +313 -0
  71. package/dist/process/executable.js.map +1 -0
  72. package/dist/run-daemon.d.ts +1 -1
  73. package/dist/run-daemon.d.ts.map +1 -1
  74. package/dist/run-daemon.js +182 -12
  75. package/dist/run-daemon.js.map +1 -1
  76. package/dist/storage/state-directory.d.ts +2 -0
  77. package/dist/storage/state-directory.d.ts.map +1 -0
  78. package/dist/storage/state-directory.js +10 -0
  79. package/dist/storage/state-directory.js.map +1 -0
  80. package/package.json +3 -5
@@ -0,0 +1,58 @@
1
+ import { fetch } from "undici";
2
+ import { environmentProxyDispatcher } from "../network/environment-proxy.js";
3
+ const CATALOG_UPDATE_TIMEOUT_MILLISECONDS = 20_000;
4
+ class AgentCatalogPublishError extends Error {
5
+ code = "agent_catalog_update_failed";
6
+ constructor(message, options = {}) {
7
+ super(message, options);
8
+ this.name = "AgentCatalogPublishError";
9
+ }
10
+ }
11
+ function catalogEndpoint(relayUrl) {
12
+ const endpoint = new URL(relayUrl);
13
+ endpoint.protocol = endpoint.protocol === "wss:" ? "https:" : "http:";
14
+ if (!endpoint.pathname.endsWith("/daemon")) {
15
+ throw new AgentCatalogPublishError("The Relay URL is invalid");
16
+ }
17
+ endpoint.pathname = `${endpoint.pathname.slice(0, -"/daemon".length)}/catalog`;
18
+ return endpoint;
19
+ }
20
+ export async function publishAgentCatalog(config, signal) {
21
+ signal.throwIfAborted();
22
+ const timeoutSignal = AbortSignal.timeout(CATALOG_UPDATE_TIMEOUT_MILLISECONDS);
23
+ const requestSignal = AbortSignal.any([signal, timeoutSignal]);
24
+ let response;
25
+ const catalog = config.catalog.read();
26
+ try {
27
+ response = await fetch(catalogEndpoint(config.relayUrl), {
28
+ body: JSON.stringify({
29
+ agents: catalog.agents.map((agent) => ({
30
+ id: agent.id,
31
+ label: agent.label,
32
+ })),
33
+ installableAgents: catalog.installableAgents.map((agent) => ({
34
+ id: agent.id,
35
+ label: agent.label,
36
+ requiresLocalApproval: agent.requiresLocalApproval,
37
+ })),
38
+ }),
39
+ dispatcher: environmentProxyDispatcher,
40
+ headers: { "content-type": "application/json" },
41
+ method: "PUT",
42
+ signal: requestSignal,
43
+ });
44
+ }
45
+ catch (error) {
46
+ if (signal.aborted) {
47
+ signal.throwIfAborted();
48
+ }
49
+ throw new AgentCatalogPublishError(timeoutSignal.aborted
50
+ ? "The Agent catalog update timed out"
51
+ : "The Agent catalog could not be updated", { cause: error });
52
+ }
53
+ await response.body?.cancel();
54
+ if (!response.ok) {
55
+ throw new AgentCatalogPublishError("The Relay rejected the Agent catalog update");
56
+ }
57
+ }
58
+ //# sourceMappingURL=publish-agent-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish-agent-catalog.js","sourceRoot":"","sources":["../../src/agent-catalog/publish-agent-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import type { AgentInstallationStage, AgentInstallRequestCommand } from "@moxt-ai/mobius-protocol";
2
+ import type { LocalAgentSpecification } from "../agent-catalog/discover-local-agents.ts";
3
+ export declare abstract class AgentInstallation {
4
+ readonly agentId: string;
5
+ readonly requestId: string;
6
+ abstract readonly status: string;
7
+ protected constructor(requestId: string, agentId: string);
8
+ }
9
+ export declare class RequestedInstallation extends AgentInstallation {
10
+ readonly status = "requested";
11
+ constructor(requestId: string, agentId: string);
12
+ }
13
+ export declare class AwaitingLocalApproval extends AgentInstallation {
14
+ readonly status = "awaiting_local_approval";
15
+ constructor(requestId: string, agentId: string);
16
+ }
17
+ export declare class RunningInstallation extends AgentInstallation {
18
+ readonly stage: AgentInstallationStage;
19
+ readonly status = "running";
20
+ constructor(requestId: string, agentId: string, stage: AgentInstallationStage);
21
+ }
22
+ export declare class SucceededInstallation extends AgentInstallation {
23
+ readonly authenticationMayBeRequired = true;
24
+ readonly status = "succeeded";
25
+ constructor(requestId: string, agentId: string);
26
+ }
27
+ export declare class FailedInstallation extends AgentInstallation {
28
+ readonly code: string;
29
+ readonly message: string;
30
+ readonly status = "failed";
31
+ constructor(requestId: string, agentId: string, code: string, message: string);
32
+ }
33
+ export declare class CancelledInstallation extends AgentInstallation {
34
+ readonly status = "cancelled";
35
+ constructor(requestId: string, agentId: string);
36
+ }
37
+ export declare class InstallationManagerError extends Error {
38
+ readonly code: string;
39
+ constructor(code: string, message: string, options?: ErrorOptions);
40
+ }
41
+ export interface InstallationAuthorizer {
42
+ readonly authorize: (agentId: string, label: string, requestId: string, signal: AbortSignal) => Promise<boolean>;
43
+ }
44
+ export interface InstallationExecutor {
45
+ readonly execute: (agentId: string, requestId: string, report: (stage: AgentInstallationStage) => Promise<void>, signal: AbortSignal) => Promise<void>;
46
+ }
47
+ export interface InstallationObserver {
48
+ readonly onState: (state: AgentInstallation) => Promise<void>;
49
+ }
50
+ export interface InstallationAudit {
51
+ readonly record: (event: string, requestId: string, agentId: string, details?: Readonly<Record<string, string>>) => void;
52
+ }
53
+ export declare class AgentInstallationManager {
54
+ #private;
55
+ constructor(specifications: readonly LocalAgentSpecification[], authorizer: InstallationAuthorizer, executor: InstallationExecutor, observer: InstallationObserver, audit?: InstallationAudit);
56
+ readonly request: (command: AgentInstallRequestCommand, signal: AbortSignal) => Promise<AgentInstallation>;
57
+ readonly cancel: (requestId: string) => Promise<AgentInstallation>;
58
+ readonly close: () => Promise<void>;
59
+ }
60
+ //# sourceMappingURL=agent-installation-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-installation-manager.d.ts","sourceRoot":"","sources":["../../src/agent-installation/agent-installation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC3B,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAIzF,8BAAsB,iBAAiB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAEjC,SAAS,aAAa,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAGvD;CACF;AAED,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,QAAQ,CAAC,MAAM,eAAe;IAE9B,YAAY,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAE7C;CACF;AAED,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,QAAQ,CAAC,MAAM,6BAA6B;IAE5C,YAAY,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAE7C;CACF;AAED,qBAAa,mBAAoB,SAAQ,iBAAiB;IACxD,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,MAAM,aAAa;IAE5B,YACE,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,sBAAsB,EAI9B;CACF;AAED,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,QAAQ,CAAC,2BAA2B,QAAQ;IAC5C,QAAQ,CAAC,MAAM,eAAe;IAE9B,YAAY,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAE7C;CACF;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,YAAY;IAE3B,YACE,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAKhB;CACF;AAED,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,QAAQ,CAAC,MAAM,eAAe;IAE9B,YAAY,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAE7C;CACF;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAIpE;CACF;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,CAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,EACxD,MAAM,EAAE,WAAW,KAChB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,CACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KACvC,IAAI,CAAC;CACX;AA2CD,qBAAa,wBAAwB;;IASnC,YACE,cAAc,EAAE,SAAS,uBAAuB,EAAE,EAClD,UAAU,EAAE,sBAAsB,EAClC,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,oBAAoB,EAC9B,KAAK,GAAE,iBAA+C,EAOvD;IAED,QAAQ,CAAC,OAAO,YACL,0BAA0B,UAC3B,WAAW,KAClB,OAAO,CAAC,iBAAiB,CAAC,CA4E3B;IAEF,QAAQ,CAAC,MAAM,cAAqB,MAAM,KAAG,OAAO,CAAC,iBAAiB,CAAC,CAuBrE;IAEF,QAAQ,CAAC,KAAK,QAAa,OAAO,CAAC,IAAI,CAAC,CActC;CAkJH"}
@@ -0,0 +1,242 @@
1
+ const INSTALLATION_DEADLINE_MILLISECONDS = 10 * 60 * 1_000;
2
+ export class AgentInstallation {
3
+ agentId;
4
+ requestId;
5
+ constructor(requestId, agentId) {
6
+ this.agentId = agentId;
7
+ this.requestId = requestId;
8
+ }
9
+ }
10
+ export class RequestedInstallation extends AgentInstallation {
11
+ status = "requested";
12
+ constructor(requestId, agentId) {
13
+ super(requestId, agentId);
14
+ }
15
+ }
16
+ export class AwaitingLocalApproval extends AgentInstallation {
17
+ status = "awaiting_local_approval";
18
+ constructor(requestId, agentId) {
19
+ super(requestId, agentId);
20
+ }
21
+ }
22
+ export class RunningInstallation extends AgentInstallation {
23
+ stage;
24
+ status = "running";
25
+ constructor(requestId, agentId, stage) {
26
+ super(requestId, agentId);
27
+ this.stage = stage;
28
+ }
29
+ }
30
+ export class SucceededInstallation extends AgentInstallation {
31
+ authenticationMayBeRequired = true;
32
+ status = "succeeded";
33
+ constructor(requestId, agentId) {
34
+ super(requestId, agentId);
35
+ }
36
+ }
37
+ export class FailedInstallation extends AgentInstallation {
38
+ code;
39
+ message;
40
+ status = "failed";
41
+ constructor(requestId, agentId, code, message) {
42
+ super(requestId, agentId);
43
+ this.code = code;
44
+ this.message = message;
45
+ }
46
+ }
47
+ export class CancelledInstallation extends AgentInstallation {
48
+ status = "cancelled";
49
+ constructor(requestId, agentId) {
50
+ super(requestId, agentId);
51
+ }
52
+ }
53
+ export class InstallationManagerError extends Error {
54
+ code;
55
+ constructor(code, message, options = {}) {
56
+ super(message, options);
57
+ this.code = code;
58
+ this.name = "InstallationManagerError";
59
+ }
60
+ }
61
+ class NullInstallationAudit {
62
+ record = () => undefined;
63
+ }
64
+ class InstallationJob {
65
+ agentId;
66
+ completion = Promise.withResolvers();
67
+ controller = new AbortController();
68
+ requestId;
69
+ state;
70
+ constructor(requestId, agentId) {
71
+ this.agentId = agentId;
72
+ this.requestId = requestId;
73
+ this.state = new RequestedInstallation(requestId, agentId);
74
+ }
75
+ }
76
+ function specificationFor(specifications, agentId) {
77
+ for (const specification of specifications) {
78
+ if (specification.id === agentId) {
79
+ return specification;
80
+ }
81
+ }
82
+ return null;
83
+ }
84
+ function executionFailure(error) {
85
+ if (error instanceof InstallationManagerError) {
86
+ return error;
87
+ }
88
+ return new InstallationManagerError("installation_failed", "The local Agent installation failed", { cause: error });
89
+ }
90
+ export class AgentInstallationManager {
91
+ #activeAgents = new Map();
92
+ #audit;
93
+ #authorizer;
94
+ #executor;
95
+ #jobs = new Map();
96
+ #observer;
97
+ #specifications;
98
+ constructor(specifications, authorizer, executor, observer, audit = new NullInstallationAudit()) {
99
+ this.#audit = audit;
100
+ this.#authorizer = authorizer;
101
+ this.#executor = executor;
102
+ this.#observer = observer;
103
+ this.#specifications = Object.freeze([...specifications]);
104
+ }
105
+ request = async (command, signal) => {
106
+ const existing = this.#jobs.get(command.requestId);
107
+ if (existing !== undefined) {
108
+ if (existing.agentId !== command.agentId) {
109
+ const conflict = new FailedInstallation(command.requestId, command.agentId, "installation_request_conflict", "The installation request identifier is already in use");
110
+ this.#audit.record("agent_installation_failed_installation_request_conflict", command.requestId, command.agentId);
111
+ await this.#observer.onState(conflict);
112
+ return conflict;
113
+ }
114
+ await this.#observer.onState(existing.state);
115
+ return await existing.completion.promise;
116
+ }
117
+ this.#audit.record("agent_installation_requested", command.requestId, command.agentId);
118
+ const specification = specificationFor(this.#specifications, command.agentId);
119
+ if (specification === null) {
120
+ const unknown = new FailedInstallation(command.requestId, command.agentId, "unknown_agent", "The requested Agent is not supported");
121
+ const job = new InstallationJob(command.requestId, command.agentId);
122
+ job.state = unknown;
123
+ job.completion.resolve(unknown);
124
+ this.#jobs.set(command.requestId, job);
125
+ this.#audit.record("agent_installation_failed_unknown_agent", command.requestId, command.agentId);
126
+ await this.#observer.onState(unknown);
127
+ return unknown;
128
+ }
129
+ if (this.#activeAgents.has(command.agentId)) {
130
+ const busy = new FailedInstallation(command.requestId, command.agentId, "installation_in_progress", "An installation for this Agent is already running");
131
+ const job = new InstallationJob(command.requestId, command.agentId);
132
+ job.state = busy;
133
+ job.completion.resolve(busy);
134
+ this.#jobs.set(command.requestId, job);
135
+ this.#audit.record("agent_installation_failed_installation_in_progress", command.requestId, command.agentId);
136
+ await this.#observer.onState(busy);
137
+ return busy;
138
+ }
139
+ const job = new InstallationJob(command.requestId, command.agentId);
140
+ this.#jobs.set(command.requestId, job);
141
+ this.#activeAgents.set(command.agentId, command.requestId);
142
+ void this.#run(job, specification, signal);
143
+ return await job.completion.promise;
144
+ };
145
+ cancel = async (requestId) => {
146
+ const job = this.#jobs.get(requestId);
147
+ if (job === undefined) {
148
+ throw new InstallationManagerError("installation_not_found", "The installation request was not found");
149
+ }
150
+ if (job.state instanceof SucceededInstallation ||
151
+ job.state instanceof FailedInstallation ||
152
+ job.state instanceof CancelledInstallation) {
153
+ await this.#observer.onState(job.state);
154
+ return job.state;
155
+ }
156
+ this.#audit.record("agent_installation_cancellation_requested", job.requestId, job.agentId);
157
+ job.controller.abort(new Error("Agent installation cancelled"));
158
+ return await job.completion.promise;
159
+ };
160
+ close = async () => {
161
+ const completions = [];
162
+ for (const requestId of this.#activeAgents.values()) {
163
+ const job = this.#jobs.get(requestId);
164
+ if (job === undefined) {
165
+ throw new InstallationManagerError("installation_state_invalid", "An active Agent installation is unavailable");
166
+ }
167
+ job.controller.abort(new Error("Mobius daemon stopped"));
168
+ completions.push(job.completion.promise);
169
+ }
170
+ await Promise.all(completions);
171
+ };
172
+ #transition = async (job, state) => {
173
+ job.state = state;
174
+ await this.#observer.onState(state);
175
+ };
176
+ #run = async (job, specification, externalSignal) => {
177
+ const abort = () => job.controller.abort(externalSignal.reason);
178
+ externalSignal.addEventListener("abort", abort, { once: true });
179
+ if (externalSignal.aborted) {
180
+ abort();
181
+ }
182
+ const deadline = setTimeout(() => {
183
+ job.controller.abort(new InstallationManagerError("installation_timeout", "The local Agent installation exceeded its deadline"));
184
+ }, INSTALLATION_DEADLINE_MILLISECONDS);
185
+ const signal = job.controller.signal;
186
+ try {
187
+ await this.#transition(job, new AwaitingLocalApproval(job.requestId, job.agentId));
188
+ this.#audit.record("agent_installation_awaiting_approval", job.requestId, job.agentId);
189
+ const approved = await this.#authorizer.authorize(specification.id, specification.label, job.requestId, signal);
190
+ signal.throwIfAborted();
191
+ if (!approved) {
192
+ const denied = new FailedInstallation(job.requestId, job.agentId, "installation_not_authorized", "Installation was not approved on the local machine");
193
+ await this.#transition(job, denied);
194
+ this.#audit.record("agent_installation_denied", job.requestId, job.agentId);
195
+ job.completion.resolve(denied);
196
+ return;
197
+ }
198
+ this.#audit.record("agent_installation_authorized", job.requestId, job.agentId);
199
+ await this.#executor.execute(job.agentId, job.requestId, async (stage) => {
200
+ signal.throwIfAborted();
201
+ await this.#transition(job, new RunningInstallation(job.requestId, job.agentId, stage));
202
+ this.#audit.record(`agent_installation_${stage}`, job.requestId, job.agentId);
203
+ }, signal);
204
+ signal.throwIfAborted();
205
+ const succeeded = new SucceededInstallation(job.requestId, job.agentId);
206
+ await this.#transition(job, succeeded);
207
+ this.#audit.record("agent_installation_completed", job.requestId, job.agentId);
208
+ job.completion.resolve(succeeded);
209
+ }
210
+ catch (error) {
211
+ if (signal.aborted) {
212
+ if (signal.reason instanceof InstallationManagerError &&
213
+ signal.reason.code === "installation_timeout") {
214
+ const timedOut = new FailedInstallation(job.requestId, job.agentId, signal.reason.code, signal.reason.message);
215
+ await this.#transition(job, timedOut);
216
+ this.#audit.record("agent_installation_failed_installation_timeout", job.requestId, job.agentId);
217
+ job.completion.resolve(timedOut);
218
+ return;
219
+ }
220
+ const cancelled = new CancelledInstallation(job.requestId, job.agentId);
221
+ await this.#transition(job, cancelled);
222
+ this.#audit.record("agent_installation_cancelled", job.requestId, job.agentId);
223
+ job.completion.resolve(cancelled);
224
+ }
225
+ else {
226
+ const failure = executionFailure(error);
227
+ const failed = new FailedInstallation(job.requestId, job.agentId, failure.code, failure.message);
228
+ await this.#transition(job, failed);
229
+ this.#audit.record(`agent_installation_failed_${failure.code}`, job.requestId, job.agentId);
230
+ job.completion.resolve(failed);
231
+ }
232
+ }
233
+ finally {
234
+ clearTimeout(deadline);
235
+ externalSignal.removeEventListener("abort", abort);
236
+ if (this.#activeAgents.get(job.agentId) === job.requestId) {
237
+ this.#activeAgents.delete(job.agentId);
238
+ }
239
+ }
240
+ };
241
+ }
242
+ //# sourceMappingURL=agent-installation-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-installation-manager.js","sourceRoot":"","sources":["../../src/agent-installation/agent-installation-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type LocalAgentInventory, type LocalAgentSpecification } from "../agent-catalog/discover-local-agents.ts";
2
+ import type { LocalAgentCatalog } from "../agent-catalog/local-agent.ts";
3
+ import type { InstallationAudit } from "./agent-installation-manager.ts";
4
+ import { type AdapterInstallationPort } from "./managed-adapter-installer.ts";
5
+ export interface AutomaticAdapterProvisionerOptions {
6
+ readonly architecture?: NodeJS.Architecture;
7
+ readonly approvedRoot: string;
8
+ readonly audit: InstallationAudit;
9
+ readonly catalog: LocalAgentCatalog;
10
+ readonly environment: Readonly<NodeJS.ProcessEnv>;
11
+ readonly platform?: NodeJS.Platform;
12
+ }
13
+ export declare class AutomaticAdapterProvisioner {
14
+ #private;
15
+ constructor(options: AutomaticAdapterProvisionerOptions, adapterInstaller: AdapterInstallationPort, specifications?: readonly LocalAgentSpecification[]);
16
+ readonly prepare: (signal: AbortSignal) => Promise<LocalAgentInventory>;
17
+ }
18
+ //# sourceMappingURL=automatic-adapter-provisioner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automatic-adapter-provisioner.d.ts","sourceRoot":"","sources":["../../src/agent-installation/automatic-adapter-provisioner.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAG7B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,gCAAgC,CAAC;AASxC,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;CACrC;AAyDD,qBAAa,2BAA2B;;IAKtC,YACE,OAAO,EAAE,kCAAkC,EAC3C,gBAAgB,EAAE,uBAAuB,EACzC,cAAc,GAAE,SAAS,uBAAuB,EAAwC,EAKzF;IAED,QAAQ,CAAC,OAAO,WACN,WAAW,KAClB,OAAO,CAAC,mBAAmB,CAAC,CA2I7B;CACH"}
@@ -0,0 +1,116 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { AvailableAgent, discoverLocalAgentInventory, findVerifiedAgentExecutable, supportedLocalAgentSpecifications, } from "../agent-catalog/discover-local-agents.js";
3
+ import { ManagedAdapterInstallError, } from "./managed-adapter-installer.js";
4
+ const AUTOMATIC_ADAPTER_FAILURE_CODES = new Set([
5
+ "adapter_not_found",
6
+ "adapter_probe_failed",
7
+ "adapter_probe_timeout",
8
+ "acp_incompatible",
9
+ ]);
10
+ class InstalledAutomaticAdapter {
11
+ executable;
12
+ requestId;
13
+ specification;
14
+ constructor(specification, requestId, executable) {
15
+ this.executable = executable;
16
+ this.requestId = requestId;
17
+ this.specification = specification;
18
+ }
19
+ }
20
+ function shouldProvisionAdapter(unavailable, options) {
21
+ return (AUTOMATIC_ADAPTER_FAILURE_CODES.has(unavailable.code) &&
22
+ options.environment[unavailable.specification.adapterOverrideVariable] ===
23
+ undefined &&
24
+ unavailable.specification.supportsInstallation(options.platform ?? process.platform, options.architecture ?? process.arch));
25
+ }
26
+ function stableFailureCode(error) {
27
+ return error instanceof ManagedAdapterInstallError
28
+ ? error.code
29
+ : "adapter_install_failed";
30
+ }
31
+ function discoveryOptions(options, environment, signal, specifications) {
32
+ return {
33
+ ...(options.architecture === undefined
34
+ ? {}
35
+ : { architecture: options.architecture }),
36
+ approvedRoot: options.approvedRoot,
37
+ environment,
38
+ ...(options.platform === undefined ? {} : { platform: options.platform }),
39
+ signal,
40
+ specifications,
41
+ };
42
+ }
43
+ export class AutomaticAdapterProvisioner {
44
+ #adapterInstaller;
45
+ #options;
46
+ #specifications;
47
+ constructor(options, adapterInstaller, specifications = supportedLocalAgentSpecifications()) {
48
+ this.#adapterInstaller = adapterInstaller;
49
+ this.#options = options;
50
+ this.#specifications = Object.freeze([...specifications]);
51
+ }
52
+ prepare = async (signal) => {
53
+ signal.throwIfAborted();
54
+ let inventory = await discoverLocalAgentInventory(discoveryOptions(this.#options, this.#options.environment, signal, this.#specifications));
55
+ const candidates = inventory.unavailable.filter((unavailable) => shouldProvisionAdapter(unavailable, this.#options));
56
+ const attempts = [];
57
+ for (const unavailable of candidates) {
58
+ signal.throwIfAborted();
59
+ const specification = unavailable.specification;
60
+ const verifiedAgent = await findVerifiedAgentExecutable(specification, discoveryOptions(this.#options, this.#options.environment, signal, this.#specifications));
61
+ if (verifiedAgent === null) {
62
+ attempts.push(null);
63
+ continue;
64
+ }
65
+ const requestId = `automatic-adapter-${randomUUID()}`;
66
+ this.#options.audit.record("agent_adapter_auto_install_started", requestId, specification.id, {
67
+ agentVersion: verifiedAgent.version,
68
+ adapterVersion: specification.adapterVersion,
69
+ });
70
+ process.stdout.write(`Installing the pinned ACP adapter for ${specification.label}.\n`);
71
+ try {
72
+ const executable = await this.#adapterInstaller.install(specification, signal);
73
+ this.#options.audit.record("agent_adapter_auto_install_completed", requestId, specification.id, { adapterVersion: specification.adapterVersion });
74
+ attempts.push(new InstalledAutomaticAdapter(specification, requestId, executable));
75
+ }
76
+ catch (error) {
77
+ if (signal.aborted) {
78
+ this.#options.audit.record("agent_adapter_auto_install_cancelled", requestId, specification.id);
79
+ signal.throwIfAborted();
80
+ }
81
+ this.#options.audit.record("agent_adapter_auto_install_failed", requestId, specification.id, { code: stableFailureCode(error) });
82
+ process.stderr.write(`The pinned ACP adapter for ${specification.label} could not be installed automatically; the daemon will continue.\n`);
83
+ attempts.push(null);
84
+ }
85
+ }
86
+ signal.throwIfAborted();
87
+ const installed = attempts.filter((attempt) => attempt !== null);
88
+ if (installed.length > 0) {
89
+ const verificationEnvironment = {
90
+ ...this.#options.environment,
91
+ };
92
+ for (const attempt of installed) {
93
+ verificationEnvironment[attempt.specification.adapterOverrideVariable] =
94
+ attempt.executable.path;
95
+ }
96
+ inventory = await discoverLocalAgentInventory(discoveryOptions(this.#options, verificationEnvironment, signal, this.#specifications));
97
+ }
98
+ this.#options.catalog.transition(inventory.readyAgents(), inventory.installable);
99
+ for (const attempt of installed) {
100
+ const available = inventory.available.find((candidate) => candidate instanceof AvailableAgent &&
101
+ candidate.specification.id === attempt.specification.id);
102
+ if (available === undefined) {
103
+ const unavailable = inventory.unavailable.find((candidate) => candidate.specification.id === attempt.specification.id);
104
+ this.#options.audit.record("agent_adapter_auto_install_verification_failed", attempt.requestId, attempt.specification.id, { code: unavailable?.code ?? "agent_verification_failed" });
105
+ continue;
106
+ }
107
+ this.#options.audit.record("agent_adapter_auto_install_verified", attempt.requestId, attempt.specification.id, {
108
+ adapterVersion: available.agent.adapterVersion,
109
+ agentVersion: available.agent.agentVersion,
110
+ });
111
+ process.stdout.write(`${attempt.specification.label} ACP integration is ready.\n`);
112
+ }
113
+ return inventory;
114
+ };
115
+ }
116
+ //# sourceMappingURL=automatic-adapter-provisioner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automatic-adapter-provisioner.js","sourceRoot":"","sources":["../../src/agent-installation/automatic-adapter-provisioner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { AgentInstallationStage } from "@moxt-ai/mobius-protocol";
2
+ import { type ResolvedExecutable } from "../process/executable.ts";
3
+ import type { InstallationAudit } from "./agent-installation-manager.ts";
4
+ export interface AgentInstallRecipeOptions {
5
+ readonly audit: InstallationAudit;
6
+ readonly report: (stage: AgentInstallationStage) => Promise<void>;
7
+ readonly requestId: string;
8
+ readonly signal: AbortSignal;
9
+ readonly stateDirectory: string;
10
+ }
11
+ export declare abstract class FixedAgentInstallRecipe {
12
+ abstract readonly id: string;
13
+ abstract readonly label: string;
14
+ abstract readonly releaseChannel: string;
15
+ abstract readonly install: (options: AgentInstallRecipeOptions) => Promise<ResolvedExecutable>;
16
+ protected readonly assertSupportedPlatform: () => void;
17
+ protected readonly requireInstalledExecutable: (path: string) => Promise<ResolvedExecutable>;
18
+ }
19
+ export declare function fixedAgentInstallRecipes(): readonly FixedAgentInstallRecipe[];
20
+ //# sourceMappingURL=fixed-agent-install-recipes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed-agent-install-recipes.d.ts","sourceRoot":"","sources":["../../src/agent-installation/fixed-agent-install-recipes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AASzE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,8BAAsB,uBAAuB;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,CACzB,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEjC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,QAAO,IAAI,CAUnD;IAEF,SAAS,CAAC,QAAQ,CAAC,0BAA0B,SACrC,MAAM,KACX,OAAO,CAAC,kBAAkB,CAAC,CAS5B;CACH;AAsKD,wBAAgB,wBAAwB,IAAI,SAAS,uBAAuB,EAAE,CAK7E"}