@beeos-ai/device-agent 0.9.13 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/device-compat.d.ts +14 -0
- package/dist/adapters/device-compat.js +71 -0
- package/dist/adapters/device-compat.js.map +1 -0
- package/dist/agent-runtime/adapters/index.d.ts +1 -3
- package/dist/agent-runtime/adapters/index.js +1 -3
- package/dist/agent-runtime/adapters/index.js.map +1 -1
- package/dist/agent-runtime/adapters/openai.d.ts +5 -5
- package/dist/agent-runtime/adapters/openai.js +19 -6
- package/dist/agent-runtime/adapters/openai.js.map +1 -1
- package/dist/agent-runtime/adapters/registry.d.ts +1 -1
- package/dist/agent-runtime/adapters/registry.js +3 -3
- package/dist/agent-runtime/adapters/registry.js.map +1 -1
- package/dist/agent-runtime/agent-runner.d.ts +1 -1
- package/dist/agent-runtime/factory.d.ts +22 -0
- package/dist/agent-runtime/factory.js +25 -0
- package/dist/agent-runtime/factory.js.map +1 -0
- package/dist/agent-runtime/index.d.ts +9 -4
- package/dist/agent-runtime/index.js +9 -4
- package/dist/agent-runtime/index.js.map +1 -1
- package/dist/{model → agent-runtime/models}/base.d.ts +1 -1
- package/dist/{model → agent-runtime/models}/base.js.map +1 -1
- package/dist/{model → agent-runtime/models}/client.d.ts +3 -3
- package/dist/{model → agent-runtime/models}/client.js +2 -2
- package/dist/agent-runtime/models/client.js.map +1 -0
- package/dist/agent-runtime/models/image/compress.js.map +1 -0
- package/dist/{model → agent-runtime/models}/image/transport.d.ts +2 -2
- package/dist/{model → agent-runtime/models}/image/transport.js +1 -1
- package/dist/agent-runtime/models/image/transport.js.map +1 -0
- package/dist/agent-runtime/models/vlm/autoglm.js.map +1 -0
- package/dist/{model/adapters → agent-runtime/models/vlm}/base.d.ts +1 -1
- package/dist/agent-runtime/models/vlm/base.js.map +1 -0
- package/dist/{model/adapters → agent-runtime/models/vlm}/general.js +19 -25
- package/dist/agent-runtime/models/vlm/general.js.map +1 -0
- package/dist/{model/adapters → agent-runtime/models/vlm}/guiowl.js +1 -1
- package/dist/agent-runtime/models/vlm/guiowl.js.map +1 -0
- package/dist/{model/adapters → agent-runtime/models/vlm}/index.d.ts +0 -2
- package/dist/agent-runtime/models/vlm/index.js +7 -0
- package/dist/agent-runtime/models/vlm/index.js.map +1 -0
- package/dist/{model/adapters → agent-runtime/models/vlm}/maiui.js +1 -1
- package/dist/agent-runtime/models/vlm/maiui.js.map +1 -0
- package/dist/{model/adapters → agent-runtime/models/vlm}/qwenvl.js +1 -1
- package/dist/agent-runtime/models/vlm/qwenvl.js.map +1 -0
- package/dist/{model/adapters → agent-runtime/models/vlm/shared}/tool-call.d.ts +1 -1
- package/dist/agent-runtime/models/vlm/shared/tool-call.js.map +1 -0
- package/dist/agent-runtime/modes/hybrid/index.d.ts +58 -0
- package/dist/{adapters/agentcore-runner.js → agent-runtime/modes/hybrid/index.js} +21 -54
- package/dist/agent-runtime/modes/hybrid/index.js.map +1 -0
- package/dist/agent-runtime/{planner → modes/hybrid/planner}/base.d.ts +2 -2
- package/dist/agent-runtime/modes/hybrid/planner/base.js.map +1 -0
- package/dist/agent-runtime/modes/hybrid/planner/llm-planner.js.map +1 -0
- package/dist/agent-runtime/modes/hybrid/planner/noop-planner.js.map +1 -0
- package/dist/agent-runtime/{planner → modes/hybrid/planner}/prompts.d.ts +2 -2
- package/dist/agent-runtime/modes/hybrid/planner/prompts.js.map +1 -0
- package/dist/{adapters → agent-runtime/modes/orchestrator}/app-guide.d.ts +1 -1
- package/dist/{adapters → agent-runtime/modes/orchestrator}/app-guide.js +51 -6
- package/dist/agent-runtime/modes/orchestrator/app-guide.js.map +1 -0
- package/dist/{adapters/agentcore-orchestrator.d.ts → agent-runtime/modes/orchestrator/index.d.ts} +5 -6
- package/dist/{adapters/agentcore-orchestrator.js → agent-runtime/modes/orchestrator/index.js} +30 -21
- package/dist/agent-runtime/modes/orchestrator/index.js.map +1 -0
- package/dist/{adapters/orchestrator-agent-prompt.js → agent-runtime/modes/orchestrator/prompt.js} +5 -11
- package/dist/agent-runtime/modes/orchestrator/prompt.js.map +1 -0
- package/dist/agent-runtime/plan-executor.d.ts +1 -1
- package/dist/agent-runtime/reflection.js +46 -36
- package/dist/agent-runtime/reflection.js.map +1 -1
- package/dist/agent-runtime/vlm.d.ts +17 -0
- package/dist/agent-runtime/vlm.js +18 -0
- package/dist/agent-runtime/vlm.js.map +1 -0
- package/dist/api.d.ts +9 -20
- package/dist/api.js +26 -33
- package/dist/api.js.map +1 -1
- package/dist/app/agent-host.js +11 -0
- package/dist/app/agent-host.js.map +1 -1
- package/dist/app/multi-device-host.d.ts +143 -0
- package/dist/app/multi-device-host.js +237 -0
- package/dist/app/multi-device-host.js.map +1 -0
- package/dist/app/plugin-commands/device-status-command.d.ts +28 -0
- package/dist/app/plugin-commands/device-status-command.js +101 -0
- package/dist/app/plugin-commands/device-status-command.js.map +1 -0
- package/dist/app/session-manager.d.ts +1 -0
- package/dist/app/session-manager.js +12 -11
- package/dist/app/session-manager.js.map +1 -1
- package/dist/bootstrap.d.ts +0 -2
- package/dist/bootstrap.js +131 -78
- package/dist/bootstrap.js.map +1 -1
- package/dist/config/loader.d.ts +4 -19
- package/dist/config/loader.js +64 -89
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +26 -40
- package/dist/config/schema.js +30 -57
- package/dist/config/schema.js.map +1 -1
- package/dist/core/task-outcome.d.ts +32 -0
- package/dist/core/task-outcome.js +68 -0
- package/dist/core/task-outcome.js.map +1 -0
- package/dist/fleet/adapters/process/in-process-manager.d.ts +76 -0
- package/dist/fleet/adapters/process/in-process-manager.js +206 -0
- package/dist/fleet/adapters/process/in-process-manager.js.map +1 -0
- package/dist/fleet/adapters/process/node-process-manager.d.ts +19 -0
- package/dist/fleet/adapters/process/node-process-manager.js +1 -1
- package/dist/fleet/adapters/process/node-process-manager.js.map +1 -1
- package/dist/fleet/supervisor.d.ts +21 -0
- package/dist/fleet/supervisor.js +204 -9
- package/dist/fleet/supervisor.js.map +1 -1
- package/dist/inbound/acp/handlers/models.js +0 -1
- package/dist/inbound/acp/handlers/models.js.map +1 -1
- package/dist/inbound/cli/fleet-command.d.ts +32 -0
- package/dist/inbound/cli/fleet-command.js +51 -2
- package/dist/inbound/cli/fleet-command.js.map +1 -1
- package/dist/inbound/cli/main.d.ts +3 -8
- package/dist/inbound/cli/main.js +14 -54
- package/dist/inbound/cli/main.js.map +1 -1
- package/dist/inbound/cli/run-command.d.ts +2 -2
- package/dist/inbound/cli/run-command.js +10 -9
- package/dist/inbound/cli/run-command.js.map +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/plugins/message-bus/device-command.d.ts +70 -0
- package/dist/plugins/message-bus/device-command.js +197 -0
- package/dist/plugins/message-bus/device-command.js.map +1 -0
- package/dist/plugins/message-bus/index.d.ts +16 -0
- package/dist/plugins/message-bus/index.js +17 -0
- package/dist/plugins/message-bus/index.js.map +1 -1
- package/dist/plugins/message-bus/ms-channel-notifier.js +30 -2
- package/dist/plugins/message-bus/ms-channel-notifier.js.map +1 -1
- package/dist/ports/agent-core.d.ts +12 -6
- package/dist/ports/agent-host.d.ts +2 -0
- package/package.json +1 -1
- package/dist/adapters/agentcore-inner-loop.d.ts +0 -28
- package/dist/adapters/agentcore-inner-loop.js +0 -71
- package/dist/adapters/agentcore-inner-loop.js.map +0 -1
- package/dist/adapters/agentcore-orchestrator.js.map +0 -1
- package/dist/adapters/agentcore-runner.d.ts +0 -70
- package/dist/adapters/agentcore-runner.js.map +0 -1
- package/dist/adapters/app-guide.js.map +0 -1
- package/dist/adapters/orchestrator-agent-prompt.js.map +0 -1
- package/dist/adapters/vlm-inner-loop.d.ts +0 -94
- package/dist/adapters/vlm-inner-loop.js +0 -202
- package/dist/adapters/vlm-inner-loop.js.map +0 -1
- package/dist/agent-runtime/adapters/ui-tars.d.ts +0 -13
- package/dist/agent-runtime/adapters/ui-tars.js +0 -22
- package/dist/agent-runtime/adapters/ui-tars.js.map +0 -1
- package/dist/agent-runtime/planner/base.js.map +0 -1
- package/dist/agent-runtime/planner/llm-planner.js.map +0 -1
- package/dist/agent-runtime/planner/noop-planner.js.map +0 -1
- package/dist/agent-runtime/planner/prompts.js.map +0 -1
- package/dist/agent.d.ts +0 -110
- package/dist/agent.js +0 -162
- package/dist/agent.js.map +0 -1
- package/dist/grounding/grounder.d.ts +0 -46
- package/dist/grounding/grounder.js +0 -82
- package/dist/grounding/grounder.js.map +0 -1
- package/dist/model/adapters/autoglm.js.map +0 -1
- package/dist/model/adapters/base.js.map +0 -1
- package/dist/model/adapters/general.js.map +0 -1
- package/dist/model/adapters/guiowl.js.map +0 -1
- package/dist/model/adapters/index.js +0 -9
- package/dist/model/adapters/index.js.map +0 -1
- package/dist/model/adapters/maiui.js.map +0 -1
- package/dist/model/adapters/qwenvl.js.map +0 -1
- package/dist/model/adapters/showui.d.ts +0 -1
- package/dist/model/adapters/showui.js +0 -132
- package/dist/model/adapters/showui.js.map +0 -1
- package/dist/model/adapters/tool-call.js.map +0 -1
- package/dist/model/adapters/uitars.d.ts +0 -1
- package/dist/model/adapters/uitars.js +0 -176
- package/dist/model/adapters/uitars.js.map +0 -1
- package/dist/model/client.js.map +0 -1
- package/dist/model/image/compress.js.map +0 -1
- package/dist/model/image/transport.js.map +0 -1
- /package/dist/{model → agent-runtime/models}/base.js +0 -0
- /package/dist/{model → agent-runtime/models}/image/compress.d.ts +0 -0
- /package/dist/{model → agent-runtime/models}/image/compress.js +0 -0
- /package/dist/{model/adapters → agent-runtime/models/vlm}/autoglm.d.ts +0 -0
- /package/dist/{model/adapters → agent-runtime/models/vlm}/autoglm.js +0 -0
- /package/dist/{model/adapters → agent-runtime/models/vlm}/base.js +0 -0
- /package/dist/{model/adapters → agent-runtime/models/vlm}/general.d.ts +0 -0
- /package/dist/{model/adapters → agent-runtime/models/vlm}/guiowl.d.ts +0 -0
- /package/dist/{model/adapters → agent-runtime/models/vlm}/maiui.d.ts +0 -0
- /package/dist/{model/adapters → agent-runtime/models/vlm}/qwenvl.d.ts +0 -0
- /package/dist/{model/adapters → agent-runtime/models/vlm/shared}/tool-call.js +0 -0
- /package/dist/agent-runtime/{planner → modes/hybrid/planner}/base.js +0 -0
- /package/dist/agent-runtime/{planner → modes/hybrid/planner}/llm-planner.d.ts +0 -0
- /package/dist/agent-runtime/{planner → modes/hybrid/planner}/llm-planner.js +0 -0
- /package/dist/agent-runtime/{planner → modes/hybrid/planner}/noop-planner.d.ts +0 -0
- /package/dist/agent-runtime/{planner → modes/hybrid/planner}/noop-planner.js +0 -0
- /package/dist/agent-runtime/{planner → modes/hybrid/planner}/prompts.js +0 -0
- /package/dist/{adapters/orchestrator-agent-prompt.d.ts → agent-runtime/modes/orchestrator/prompt.d.ts} +0 -0
package/dist/config/schema.js
CHANGED
|
@@ -8,18 +8,12 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The agent runs as a two-layer system by default:
|
|
10
10
|
*
|
|
11
|
-
* - **outer** orchestrator
|
|
12
|
-
*
|
|
13
|
-
* - **
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* - **grounder** visual ground — coordinate grounding tool used by the outer
|
|
17
|
-
* layer when it needs precise tap targets.
|
|
18
|
-
* Defaults to mirroring `mobileUse` so a
|
|
19
|
-
* fully self-hosted setup still works.
|
|
11
|
+
* - **outer** orchestrator — text LLM via pi-coding-agent
|
|
12
|
+
* (default `moonshotai/kimi-k2.6` on ARouter)
|
|
13
|
+
* - **vlm** inner VLM — vision-language device control loop
|
|
14
|
+
* (default `AutoGLM-Phone-9B-Q4_K_M.gguf` with
|
|
15
|
+
* the `autoglm` adapter)
|
|
20
16
|
*
|
|
21
|
-
* The legacy single-layer mode is still available via `legacyInner: true`
|
|
22
|
-
* (or `--legacy-inner`) — that path drives `vlm-inner-loop.ts` directly.
|
|
23
17
|
*/
|
|
24
18
|
import { z } from "zod";
|
|
25
19
|
export const RuntimeMode = z.enum(["android", "desktop"]);
|
|
@@ -44,7 +38,7 @@ export const DEFAULT_AROUTER_BASE_URL = "https://api.arouter.ai";
|
|
|
44
38
|
/** Default outer orchestrator model when nothing is configured. */
|
|
45
39
|
export const DEFAULT_OUTER_MODEL = "moonshotai/kimi-k2.6";
|
|
46
40
|
/**
|
|
47
|
-
* Default inner
|
|
41
|
+
* Default inner VLM model when nothing is configured.
|
|
48
42
|
*
|
|
49
43
|
* The `llama/` prefix is the ARouter **provider** route — without it, the
|
|
50
44
|
* gateway falls back to `openai/...` and the request is shipped to
|
|
@@ -52,20 +46,27 @@ export const DEFAULT_OUTER_MODEL = "moonshotai/kimi-k2.6";
|
|
|
52
46
|
* surfaces the upstream error as a hollow `502 status code (no body)`.
|
|
53
47
|
* See `docs/adr/` and the agent-runtime README for the full routing table.
|
|
54
48
|
*/
|
|
55
|
-
export const
|
|
56
|
-
/**
|
|
57
|
-
|
|
49
|
+
export const DEFAULT_VLM_MODEL = "llama/AutoGLM-Phone-9B-Q4_K_M.gguf";
|
|
50
|
+
/**
|
|
51
|
+
* Default VLM adapter. Intentionally EMPTY: an unset provider means
|
|
52
|
+
* "auto-detect the adapter from the model name" (`detectAdapter`), which
|
|
53
|
+
* already falls back to `autoglm` when no pattern matches. Forcing
|
|
54
|
+
* `autoglm` here would short-circuit detection and mis-parse e.g.
|
|
55
|
+
* `general` models whose name carries no detectable pattern. Set a
|
|
56
|
+
* non-empty `vlmProvider` (config / `VLM_PROVIDER` / `--vlm-provider`)
|
|
57
|
+
* to override.
|
|
58
|
+
*/
|
|
59
|
+
export const DEFAULT_VLM_PROVIDER = "";
|
|
58
60
|
/**
|
|
59
61
|
* Group-specific defaults exported for `loader.ts` to perform a
|
|
60
62
|
* post-merge `applyGroupDefaults` pass.
|
|
61
63
|
*
|
|
62
64
|
* Why exported (and why loader does the backfill rather than zod):
|
|
63
65
|
* `zod.default(v)` only fires when the input field is `undefined`.
|
|
64
|
-
* When `loader` ends up producing `
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* the missing field with empty string. Net result: `mobileUse.model`
|
|
66
|
+
* When `loader` ends up producing `vlm: { apiKey: "x" }` (e.g. from
|
|
67
|
+
* `VLM_API_KEY` alone), zod sees the object and skips the whole
|
|
68
|
+
* `.default(...)` — then `LlmSection`'s inner `model: z.string().default("")`
|
|
69
|
+
* fills the missing field with empty string. Net result: `vlm.model`
|
|
69
70
|
* silently becomes `""` and the agent boots without a model.
|
|
70
71
|
*
|
|
71
72
|
* Loader is the right place to express "deep-merge group defaults"
|
|
@@ -82,19 +83,13 @@ export const OUTER_DEFAULTS = {
|
|
|
82
83
|
model: DEFAULT_OUTER_MODEL,
|
|
83
84
|
provider: "",
|
|
84
85
|
};
|
|
85
|
-
export const
|
|
86
|
+
export const VLM_DEFAULTS = {
|
|
86
87
|
baseUrl: DEFAULT_AROUTER_BASE_URL,
|
|
87
|
-
model:
|
|
88
|
-
provider:
|
|
89
|
-
};
|
|
90
|
-
export const GROUNDER_DEFAULTS = {
|
|
91
|
-
baseUrl: DEFAULT_AROUTER_BASE_URL,
|
|
92
|
-
model: DEFAULT_MOBILE_USE_MODEL,
|
|
93
|
-
provider: DEFAULT_MOBILE_USE_PROVIDER,
|
|
88
|
+
model: DEFAULT_VLM_MODEL,
|
|
89
|
+
provider: DEFAULT_VLM_PROVIDER,
|
|
94
90
|
};
|
|
95
91
|
const outerDefaults = LlmSection.parse({ ...OUTER_DEFAULTS });
|
|
96
|
-
const
|
|
97
|
-
const grounderDefaults = LlmSection.parse({ ...GROUNDER_DEFAULTS });
|
|
92
|
+
const vlmDefaults = LlmSection.parse({ ...VLM_DEFAULTS });
|
|
98
93
|
export const Config = z
|
|
99
94
|
.object({
|
|
100
95
|
/** Standalone mode: skip Bridge handshake, only run HTTP/CLI. */
|
|
@@ -144,21 +139,10 @@ export const Config = z
|
|
|
144
139
|
*/
|
|
145
140
|
outer: LlmSection.default(outerDefaults),
|
|
146
141
|
/**
|
|
147
|
-
* Inner
|
|
148
|
-
* Maps from `
|
|
149
|
-
*/
|
|
150
|
-
mobileUse: LlmSection.default(mobileUseDefaults),
|
|
151
|
-
/**
|
|
152
|
-
* Visual grounder used by the outer layer for precise coordinate
|
|
153
|
-
* grounding. Maps from `GROUNDER_*` env / `--grounder-*` flags.
|
|
154
|
-
*/
|
|
155
|
-
grounder: LlmSection.default(grounderDefaults),
|
|
156
|
-
/**
|
|
157
|
-
* Force the legacy single-layer adapter (vlm-inner-loop) instead of
|
|
158
|
-
* the v0.3.0 default `AgentRunnerCore`. Maps from `--legacy-inner`
|
|
159
|
-
* / `BEEOS_LEGACY_INNER`. Default `false`.
|
|
142
|
+
* Inner VLM. Performs the screenshot→reason→act loop.
|
|
143
|
+
* Maps from `VLM_*` env / `--vlm-*` flags.
|
|
160
144
|
*/
|
|
161
|
-
|
|
145
|
+
vlm: LlmSection.default(vlmDefaults),
|
|
162
146
|
/**
|
|
163
147
|
* Enable OrchestratorAgent (OpenAI tool-calling outer loop + inner
|
|
164
148
|
* mobile_use VLM) instead of the default `AgentRunnerCore`. Maps from
|
|
@@ -177,26 +161,15 @@ export const Config = z
|
|
|
177
161
|
* → reuse `mobileUse.model`. Maps from `--planner-model`.
|
|
178
162
|
*/
|
|
179
163
|
plannerModel: z.string().default(""),
|
|
180
|
-
/** Optional planner base URL. Empty → reuse `
|
|
164
|
+
/** Optional planner base URL. Empty → reuse `vlm.baseUrl`. */
|
|
181
165
|
plannerBaseUrl: z.string().default(""),
|
|
182
|
-
/** Optional planner API key. Empty → reuse `
|
|
166
|
+
/** Optional planner API key. Empty → reuse `vlm.apiKey`. */
|
|
183
167
|
plannerApiKey: z.string().default(""),
|
|
184
168
|
// ── Plugin toggles ────────────────────────────────────────────────────
|
|
185
169
|
/** Disable the ACP plugin (Bridge WS). Maps from `--no-acp`. */
|
|
186
170
|
disableAcp: z.boolean().default(false),
|
|
187
171
|
/** Disable the HTTP debug plugin. Maps from `--no-http`. */
|
|
188
172
|
disableHttp: z.boolean().default(false),
|
|
189
|
-
// ── Backward-compat top-level VLM fields ─────────────────────────────
|
|
190
|
-
/**
|
|
191
|
-
* @deprecated since the two-layer split — mirrored to `mobileUse.apiKey`
|
|
192
|
-
* by the loader. New configs should use `mobileUse.apiKey` (and/or
|
|
193
|
-
* `outer.apiKey` / `grounder.apiKey`) instead.
|
|
194
|
-
*/
|
|
195
|
-
vlmApiKey: z.string().default(""),
|
|
196
|
-
/** @deprecated mirrored to `mobileUse.baseUrl`. */
|
|
197
|
-
vlmBaseUrl: z.string().default(DEFAULT_AROUTER_BASE_URL),
|
|
198
|
-
/** @deprecated mirrored to `mobileUse.model`. */
|
|
199
|
-
vlmModel: z.string().default(""),
|
|
200
173
|
httpEnabled: z.boolean().default(false),
|
|
201
174
|
httpHost: z.string().default("127.0.0.1"),
|
|
202
175
|
httpPort: z.coerce.number().int().positive().default(9090),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type AgentBayTaskStatus = "running" | "completed" | "failed" | "cancelled" | "unsupported";
|
|
2
|
+
export type AgentTaskReason = "done" | "fail" | "call_for_user" | "step_budget" | "timeout" | "reflection_veto" | "cancelled" | "error";
|
|
3
|
+
export interface AgentCoreTaskOutcomeFields {
|
|
4
|
+
taskStatus: AgentBayTaskStatus;
|
|
5
|
+
taskReason: AgentTaskReason;
|
|
6
|
+
taskAction?: string;
|
|
7
|
+
taskProduct?: string;
|
|
8
|
+
taskError?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AgentTaskOutcome extends AgentCoreTaskOutcomeFields {
|
|
11
|
+
taskId: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function deriveTaskOutcome(args: {
|
|
14
|
+
taskId: string;
|
|
15
|
+
result: {
|
|
16
|
+
finalMessage: string;
|
|
17
|
+
cancelled: boolean;
|
|
18
|
+
taskStatus?: AgentBayTaskStatus;
|
|
19
|
+
taskReason?: AgentTaskReason;
|
|
20
|
+
taskAction?: string;
|
|
21
|
+
taskProduct?: string;
|
|
22
|
+
taskError?: string;
|
|
23
|
+
};
|
|
24
|
+
error?: string;
|
|
25
|
+
}): AgentTaskOutcome;
|
|
26
|
+
export declare function taskOutcomeFromTerminator(args: {
|
|
27
|
+
terminator: string;
|
|
28
|
+
finalMessage?: string;
|
|
29
|
+
taskAction?: string;
|
|
30
|
+
taskError?: string;
|
|
31
|
+
}): AgentCoreTaskOutcomeFields;
|
|
32
|
+
export declare function toAgentBayTaskPayload(outcome: AgentTaskOutcome | AgentCoreTaskOutcomeFields): Record<string, unknown>;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
export function deriveTaskOutcome(args) {
|
|
2
|
+
const { taskId, result, error } = args;
|
|
3
|
+
const taskStatus = result.taskStatus ?? (error
|
|
4
|
+
? "failed"
|
|
5
|
+
: result.cancelled
|
|
6
|
+
? "cancelled"
|
|
7
|
+
: "completed");
|
|
8
|
+
const taskReason = result.taskReason ?? (error
|
|
9
|
+
? result.cancelled
|
|
10
|
+
? "cancelled"
|
|
11
|
+
: "error"
|
|
12
|
+
: result.cancelled
|
|
13
|
+
? "cancelled"
|
|
14
|
+
: "done");
|
|
15
|
+
const taskProduct = result.taskProduct ?? (result.finalMessage || undefined);
|
|
16
|
+
const taskError = result.taskError ?? error;
|
|
17
|
+
return {
|
|
18
|
+
taskId,
|
|
19
|
+
taskStatus,
|
|
20
|
+
taskReason,
|
|
21
|
+
...(result.taskAction ? { taskAction: result.taskAction } : {}),
|
|
22
|
+
...(taskProduct ? { taskProduct } : {}),
|
|
23
|
+
...(taskError ? { taskError } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function taskOutcomeFromTerminator(args) {
|
|
27
|
+
const { terminator, finalMessage, taskAction, taskError } = args;
|
|
28
|
+
const base = {
|
|
29
|
+
...(taskAction ? { taskAction } : {}),
|
|
30
|
+
...(finalMessage ? { taskProduct: finalMessage } : {}),
|
|
31
|
+
...(taskError ? { taskError } : {}),
|
|
32
|
+
};
|
|
33
|
+
switch (terminator) {
|
|
34
|
+
case "done":
|
|
35
|
+
return { taskStatus: "completed", taskReason: "done", ...base };
|
|
36
|
+
case "cancelled":
|
|
37
|
+
return { taskStatus: "cancelled", taskReason: "cancelled", ...base };
|
|
38
|
+
case "call_for_user":
|
|
39
|
+
return { taskStatus: "failed", taskReason: "call_for_user", ...base };
|
|
40
|
+
case "step_budget":
|
|
41
|
+
return { taskStatus: "failed", taskReason: "step_budget", ...base };
|
|
42
|
+
case "timeout":
|
|
43
|
+
return { taskStatus: "failed", taskReason: "timeout", ...base };
|
|
44
|
+
case "reflection_veto":
|
|
45
|
+
return { taskStatus: "failed", taskReason: "reflection_veto", ...base };
|
|
46
|
+
case "fail":
|
|
47
|
+
return { taskStatus: "failed", taskReason: "fail", ...base };
|
|
48
|
+
case "error":
|
|
49
|
+
default:
|
|
50
|
+
return { taskStatus: "failed", taskReason: "error", ...base };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function toAgentBayTaskPayload(outcome) {
|
|
54
|
+
const payload = {
|
|
55
|
+
task_status: outcome.taskStatus,
|
|
56
|
+
task_reason: outcome.taskReason,
|
|
57
|
+
};
|
|
58
|
+
if ("taskId" in outcome)
|
|
59
|
+
payload.task_id = outcome.taskId;
|
|
60
|
+
if (outcome.taskAction)
|
|
61
|
+
payload.task_action = outcome.taskAction;
|
|
62
|
+
if (outcome.taskProduct)
|
|
63
|
+
payload.task_product = outcome.taskProduct;
|
|
64
|
+
if (outcome.taskError)
|
|
65
|
+
payload.task_error = outcome.taskError;
|
|
66
|
+
return payload;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=task-outcome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-outcome.js","sourceRoot":"","sources":["../../src/core/task-outcome.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — `IProcessManager` that hosts the device-agent DAEMON in-process.
|
|
3
|
+
*
|
|
4
|
+
* This is the production "one process controls many devices" path. The fleet
|
|
5
|
+
* supervisor and its pure FSM are UNCHANGED: they still believe they are
|
|
6
|
+
* spawning a daemon child per device. This adapter intercepts only the daemon
|
|
7
|
+
* lifecycle and redirects it to an in-process {@link MultiDeviceHost}, while
|
|
8
|
+
* delegating EVERYTHING else (mcp + scrcpy spawn/kill, liveness, pid) to a
|
|
9
|
+
* real {@link NodeProcessManager}.
|
|
10
|
+
*
|
|
11
|
+
* Topology this produces:
|
|
12
|
+
*
|
|
13
|
+
* device-agent fleet start --in-process (this OS process)
|
|
14
|
+
* ├── device-mcp-server (one shared child, via delegate) ← still a child
|
|
15
|
+
* ├── scrcpy-bridge × N (per device, via delegate) ← still children
|
|
16
|
+
* └── MultiDeviceHost (the N device-agent daemons, in-process)
|
|
17
|
+
*
|
|
18
|
+
* So the N ~50 MB agent daemons collapse into one process (deduplicated
|
|
19
|
+
* module/runtime baseline), but live video (scrcpy) and the shared MCP keep
|
|
20
|
+
* their own processes exactly as before.
|
|
21
|
+
*
|
|
22
|
+
* Why wrap instead of edit the supervisor: keeping `supervisor.ts` /
|
|
23
|
+
* `node-process-manager.ts` byte-identical to upstream means zero merge
|
|
24
|
+
* friction and the daemon's failover / activeAdbSerial / vlm-config logic is
|
|
25
|
+
* reused verbatim — `spawnDaemon` already receives the post-failover active
|
|
26
|
+
* transport in `opts.adbSerial` and the instance id for the per-device VLM
|
|
27
|
+
* config in `opts.instanceId`.
|
|
28
|
+
*/
|
|
29
|
+
import type { IProcessManager, ManagedProcess, ProcessEventListener, SpawnOptions, SpawnScrcpyOptions } from "../../ports/process-manager.js";
|
|
30
|
+
import { NodeProcessManager } from "./node-process-manager.js";
|
|
31
|
+
import type { Config } from "../../../config/schema.js";
|
|
32
|
+
import type { Logger } from "../../../logger/index.js";
|
|
33
|
+
export interface InProcessProcessManagerOptions {
|
|
34
|
+
/** Real process manager that owns the mcp + scrcpy children. */
|
|
35
|
+
delegate: NodeProcessManager;
|
|
36
|
+
/** Pino logger; the hosted MultiDeviceHost derives per-device children from it. */
|
|
37
|
+
logger: Logger;
|
|
38
|
+
/** Fallback Agent Gateway URL for bindings without a per-device override. */
|
|
39
|
+
defaultAgentGatewayUrl?: string;
|
|
40
|
+
/** Shared fleet-wide base config (vlm/outer/planMode/…) applied to every runtime. */
|
|
41
|
+
baseConfig?: Partial<Config>;
|
|
42
|
+
/** Bind host of the shared mcp (default 127.0.0.1, matches NodeProcessManager). */
|
|
43
|
+
mcpHost?: string;
|
|
44
|
+
}
|
|
45
|
+
export declare class InProcessProcessManager implements IProcessManager {
|
|
46
|
+
private readonly delegate;
|
|
47
|
+
private readonly log;
|
|
48
|
+
private readonly defaultAgentGatewayUrl;
|
|
49
|
+
private readonly baseConfig;
|
|
50
|
+
private readonly mcpHost;
|
|
51
|
+
/** Lazily built once the shared mcp port is known (first spawnMcp). */
|
|
52
|
+
private host;
|
|
53
|
+
/** Real port the singleton mcp bound — captured from the first spawnMcp. */
|
|
54
|
+
private mcpPort;
|
|
55
|
+
private readonly listeners;
|
|
56
|
+
constructor(opts: InProcessProcessManagerOptions);
|
|
57
|
+
start(): Promise<void>;
|
|
58
|
+
stop(): Promise<void>;
|
|
59
|
+
spawnMcp(opts: SpawnOptions): Promise<void>;
|
|
60
|
+
killMcp(serial: string, opts?: {
|
|
61
|
+
expected?: boolean;
|
|
62
|
+
}): Promise<void>;
|
|
63
|
+
spawnScrcpy(opts: SpawnScrcpyOptions): Promise<void>;
|
|
64
|
+
killScrcpy(serial: string, opts?: {
|
|
65
|
+
expected?: boolean;
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
spawnDaemon(opts: SpawnOptions): Promise<void>;
|
|
68
|
+
killDaemon(serial: string, opts?: {
|
|
69
|
+
expected?: boolean;
|
|
70
|
+
}): Promise<void>;
|
|
71
|
+
isAlive(serial: string, which: ManagedProcess): boolean;
|
|
72
|
+
pid(serial: string, which: ManagedProcess): number | null;
|
|
73
|
+
on(listener: ProcessEventListener): () => void;
|
|
74
|
+
private ensureHost;
|
|
75
|
+
private emit;
|
|
76
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter — `IProcessManager` that hosts the device-agent DAEMON in-process.
|
|
3
|
+
*
|
|
4
|
+
* This is the production "one process controls many devices" path. The fleet
|
|
5
|
+
* supervisor and its pure FSM are UNCHANGED: they still believe they are
|
|
6
|
+
* spawning a daemon child per device. This adapter intercepts only the daemon
|
|
7
|
+
* lifecycle and redirects it to an in-process {@link MultiDeviceHost}, while
|
|
8
|
+
* delegating EVERYTHING else (mcp + scrcpy spawn/kill, liveness, pid) to a
|
|
9
|
+
* real {@link NodeProcessManager}.
|
|
10
|
+
*
|
|
11
|
+
* Topology this produces:
|
|
12
|
+
*
|
|
13
|
+
* device-agent fleet start --in-process (this OS process)
|
|
14
|
+
* ├── device-mcp-server (one shared child, via delegate) ← still a child
|
|
15
|
+
* ├── scrcpy-bridge × N (per device, via delegate) ← still children
|
|
16
|
+
* └── MultiDeviceHost (the N device-agent daemons, in-process)
|
|
17
|
+
*
|
|
18
|
+
* So the N ~50 MB agent daemons collapse into one process (deduplicated
|
|
19
|
+
* module/runtime baseline), but live video (scrcpy) and the shared MCP keep
|
|
20
|
+
* their own processes exactly as before.
|
|
21
|
+
*
|
|
22
|
+
* Why wrap instead of edit the supervisor: keeping `supervisor.ts` /
|
|
23
|
+
* `node-process-manager.ts` byte-identical to upstream means zero merge
|
|
24
|
+
* friction and the daemon's failover / activeAdbSerial / vlm-config logic is
|
|
25
|
+
* reused verbatim — `spawnDaemon` already receives the post-failover active
|
|
26
|
+
* transport in `opts.adbSerial` and the instance id for the per-device VLM
|
|
27
|
+
* config in `opts.instanceId`.
|
|
28
|
+
*/
|
|
29
|
+
import * as path from "node:path";
|
|
30
|
+
import * as fs from "node:fs";
|
|
31
|
+
import { materializeInlineAgentConfig } from "./node-process-manager.js";
|
|
32
|
+
import { MultiDeviceHost } from "../../../app/multi-device-host.js";
|
|
33
|
+
import { getBeeosHome } from "../../../config/paths.js";
|
|
34
|
+
export class InProcessProcessManager {
|
|
35
|
+
delegate;
|
|
36
|
+
log;
|
|
37
|
+
defaultAgentGatewayUrl;
|
|
38
|
+
baseConfig;
|
|
39
|
+
mcpHost;
|
|
40
|
+
/** Lazily built once the shared mcp port is known (first spawnMcp). */
|
|
41
|
+
host = null;
|
|
42
|
+
/** Real port the singleton mcp bound — captured from the first spawnMcp. */
|
|
43
|
+
mcpPort = null;
|
|
44
|
+
listeners = new Set();
|
|
45
|
+
constructor(opts) {
|
|
46
|
+
this.delegate = opts.delegate;
|
|
47
|
+
this.log = opts.logger;
|
|
48
|
+
this.defaultAgentGatewayUrl = opts.defaultAgentGatewayUrl;
|
|
49
|
+
this.baseConfig = opts.baseConfig;
|
|
50
|
+
this.mcpHost = opts.mcpHost ?? "127.0.0.1";
|
|
51
|
+
}
|
|
52
|
+
async start() {
|
|
53
|
+
await this.delegate.start();
|
|
54
|
+
}
|
|
55
|
+
async stop() {
|
|
56
|
+
// Tear down hosted runtimes first (closes their WS + flushes sessions),
|
|
57
|
+
// then the mcp/scrcpy children the delegate owns.
|
|
58
|
+
if (this.host)
|
|
59
|
+
await this.host.stop().catch(() => { });
|
|
60
|
+
await this.delegate.stop();
|
|
61
|
+
}
|
|
62
|
+
// ── mcp / scrcpy: delegated verbatim (still real child processes) ─────────
|
|
63
|
+
async spawnMcp(opts) {
|
|
64
|
+
// The first spawnMcp's port is the singleton mcp's real port (subsequent
|
|
65
|
+
// calls are refcount bumps on the same port). Capture it so hosted
|
|
66
|
+
// runtimes route to the shared server.
|
|
67
|
+
this.mcpPort ??= opts.mcpPort;
|
|
68
|
+
return this.delegate.spawnMcp(opts);
|
|
69
|
+
}
|
|
70
|
+
killMcp(serial, opts) {
|
|
71
|
+
return this.delegate.killMcp(serial, opts);
|
|
72
|
+
}
|
|
73
|
+
spawnScrcpy(opts) {
|
|
74
|
+
return this.delegate.spawnScrcpy(opts);
|
|
75
|
+
}
|
|
76
|
+
killScrcpy(serial, opts) {
|
|
77
|
+
return this.delegate.killScrcpy(serial, opts);
|
|
78
|
+
}
|
|
79
|
+
// ── daemon: hosted in-process ────────────────────────────────────────────
|
|
80
|
+
async spawnDaemon(opts) {
|
|
81
|
+
const host = this.ensureHost();
|
|
82
|
+
// Per-instance VLM/orchestrator config: materialise the same file the
|
|
83
|
+
// spawned daemon would read via `--vlm-config-file`, then fall back to the
|
|
84
|
+
// legacy `~/.beeos/<instanceId>.config.json` if present.
|
|
85
|
+
let configFile;
|
|
86
|
+
if (opts.instanceId) {
|
|
87
|
+
const fromState = await materializeInlineAgentConfig(opts.instanceId);
|
|
88
|
+
if (fromState) {
|
|
89
|
+
configFile = fromState;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const legacy = path.join(getBeeosHome(), `${opts.instanceId}.config.json`);
|
|
93
|
+
if (await fileExists(legacy))
|
|
94
|
+
configFile = legacy;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
await host.addDevice(spawnOptionsToBinding(opts), { configFile });
|
|
98
|
+
// Translate boot outcome into the lifecycle events the FSM expects. A
|
|
99
|
+
// boot failure is fault-isolated inside the host (no throw), so we must
|
|
100
|
+
// detect it via `has()` and report `daemon_exited` (unexpected) — that
|
|
101
|
+
// drives the FSM's backoff + respawn exactly like a crashed child.
|
|
102
|
+
if (host.has(opts.serial)) {
|
|
103
|
+
this.emit({ kind: "daemon_started", serial: opts.serial, pid: process.pid });
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
this.emit({
|
|
107
|
+
kind: "daemon_exited",
|
|
108
|
+
serial: opts.serial,
|
|
109
|
+
code: 1,
|
|
110
|
+
signal: null,
|
|
111
|
+
expected: false,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async killDaemon(serial, opts) {
|
|
116
|
+
const wasRunning = this.host?.has(serial) ?? false;
|
|
117
|
+
if (this.host)
|
|
118
|
+
await this.host.removeDevice(serial);
|
|
119
|
+
if (wasRunning) {
|
|
120
|
+
this.emit({
|
|
121
|
+
kind: "daemon_exited",
|
|
122
|
+
serial,
|
|
123
|
+
code: null,
|
|
124
|
+
signal: "SIGTERM",
|
|
125
|
+
expected: opts?.expected ?? true,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ── introspection ────────────────────────────────────────────────────────
|
|
130
|
+
isAlive(serial, which) {
|
|
131
|
+
if (which === "daemon")
|
|
132
|
+
return this.host?.has(serial) ?? false;
|
|
133
|
+
return this.delegate.isAlive(serial, which);
|
|
134
|
+
}
|
|
135
|
+
pid(serial, which) {
|
|
136
|
+
// Hosted daemons share THIS process — report our own pid when present.
|
|
137
|
+
if (which === "daemon")
|
|
138
|
+
return this.host?.has(serial) ? process.pid : null;
|
|
139
|
+
return this.delegate.pid(serial, which);
|
|
140
|
+
}
|
|
141
|
+
on(listener) {
|
|
142
|
+
// Fan in BOTH the delegate's mcp/scrcpy events and our synthetic daemon
|
|
143
|
+
// events. The delegate never emits daemon events (we never call its
|
|
144
|
+
// spawnDaemon), so there is no duplication.
|
|
145
|
+
const offDelegate = this.delegate.on(listener);
|
|
146
|
+
this.listeners.add(listener);
|
|
147
|
+
return () => {
|
|
148
|
+
offDelegate();
|
|
149
|
+
this.listeners.delete(listener);
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
// ── internals ─────────────────────────────────────────────────────────────
|
|
153
|
+
ensureHost() {
|
|
154
|
+
if (this.host)
|
|
155
|
+
return this.host;
|
|
156
|
+
if (this.mcpPort == null) {
|
|
157
|
+
// The FSM always spawns mcp before daemon, so this should be unreachable;
|
|
158
|
+
// guard loudly rather than route runtimes at a bogus port.
|
|
159
|
+
throw new Error("InProcessProcessManager: spawnDaemon before mcp port was known");
|
|
160
|
+
}
|
|
161
|
+
this.host = new MultiDeviceHost({
|
|
162
|
+
mcpUrl: `http://${this.mcpHost}:${this.mcpPort}`,
|
|
163
|
+
defaultAgentGatewayUrl: this.defaultAgentGatewayUrl,
|
|
164
|
+
...(this.baseConfig ? { baseConfig: this.baseConfig } : {}),
|
|
165
|
+
logger: this.log,
|
|
166
|
+
});
|
|
167
|
+
return this.host;
|
|
168
|
+
}
|
|
169
|
+
emit(event) {
|
|
170
|
+
for (const l of this.listeners) {
|
|
171
|
+
try {
|
|
172
|
+
l(event);
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
this.log.warn({ err: e.message }, "in-process manager: listener threw");
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Project a supervisor-built `SpawnOptions` onto the `DeviceBinding` the host
|
|
182
|
+
* consumes. `opts.adbSerial` is already the post-failover ACTIVE transport, so
|
|
183
|
+
* the in-process runtime targets the same device the spawned daemon would.
|
|
184
|
+
*/
|
|
185
|
+
function spawnOptionsToBinding(opts) {
|
|
186
|
+
return {
|
|
187
|
+
serial: opts.serial,
|
|
188
|
+
adbSerial: opts.adbSerial,
|
|
189
|
+
name: opts.name ?? opts.serial,
|
|
190
|
+
instanceId: opts.instanceId ?? null,
|
|
191
|
+
keyFile: opts.keyFile,
|
|
192
|
+
agentGatewayUrl: opts.agentGatewayUrl,
|
|
193
|
+
backend: opts.backend,
|
|
194
|
+
// httpPort intentionally dropped — MultiDeviceHost forces HTTP debug off.
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
async function fileExists(p) {
|
|
198
|
+
try {
|
|
199
|
+
await fs.promises.access(p);
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=in-process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-process-manager.js","sourceRoot":"","sources":["../../../../src/fleet/adapters/process/in-process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -257,3 +257,22 @@ export declare class NodeProcessManager implements IProcessManager {
|
|
|
257
257
|
private killChild;
|
|
258
258
|
private emit;
|
|
259
259
|
}
|
|
260
|
+
/**
|
|
261
|
+
* Read `state.json` and, if a `kind=device` agent with the given
|
|
262
|
+
* `instance_id` carries an inline `agent_config`, materialise it to a
|
|
263
|
+
* stable path under `~/.beeos/runtime/agent-config/<instance_id>.json`
|
|
264
|
+
* and return that path. Returns `null` when state.json is absent /
|
|
265
|
+
* malformed / forward-versioned / has no inline payload — caller then
|
|
266
|
+
* falls back to the legacy `~/.beeos/<instance_id>.config.json`.
|
|
267
|
+
*
|
|
268
|
+
* Why a temp file (rather than a `--vlm-config-json '<payload>'`
|
|
269
|
+
* flag) — keeping the existing CLI flag interface unchanged means
|
|
270
|
+
* the dual-write Step 3 doesn't have to ship in lockstep with a
|
|
271
|
+
* device-agent flag-parser change. The file lives under a stable
|
|
272
|
+
* path so successive spawns are idempotent (the FSM may respawn
|
|
273
|
+
* many times before the operator next runs `beeos device attach`).
|
|
274
|
+
*
|
|
275
|
+
* Round 5: shape parsing delegated to the shared `readStateJson`
|
|
276
|
+
* helper; this function just projects + materialises.
|
|
277
|
+
*/
|
|
278
|
+
export declare function materializeInlineAgentConfig(instanceId: string): Promise<string | null>;
|
|
@@ -1092,7 +1092,7 @@ async function fileExists(p) {
|
|
|
1092
1092
|
* Round 5: shape parsing delegated to the shared `readStateJson`
|
|
1093
1093
|
* helper; this function just projects + materialises.
|
|
1094
1094
|
*/
|
|
1095
|
-
async function materializeInlineAgentConfig(instanceId) {
|
|
1095
|
+
export async function materializeInlineAgentConfig(instanceId) {
|
|
1096
1096
|
const home = beeoHome();
|
|
1097
1097
|
const statePath = path.join(home, "state.json");
|
|
1098
1098
|
const result = await readStateJson(statePath);
|