frely-cli 0.6.10 → 0.8.3

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 (104) hide show
  1. package/README.md +97 -293
  2. package/README.zh-CN.md +230 -0
  3. package/dist/agent/agent-service.d.ts +77 -0
  4. package/dist/agent/agent-service.js +348 -0
  5. package/dist/agent/agent-service.js.map +1 -0
  6. package/dist/agent/app-install.d.ts +49 -0
  7. package/dist/agent/app-install.js +133 -0
  8. package/dist/agent/app-install.js.map +1 -0
  9. package/dist/agent/app-key.d.ts +14 -0
  10. package/dist/agent/app-key.js +46 -0
  11. package/dist/agent/app-key.js.map +1 -0
  12. package/dist/agent/compose.d.ts +23 -0
  13. package/dist/agent/compose.js +42 -0
  14. package/dist/agent/compose.js.map +1 -0
  15. package/dist/agent/ops-server.d.ts +18 -0
  16. package/dist/agent/ops-server.js +175 -0
  17. package/dist/agent/ops-server.js.map +1 -0
  18. package/dist/agent/ops-stdio.d.ts +5 -0
  19. package/dist/agent/ops-stdio.js +47 -0
  20. package/dist/agent/ops-stdio.js.map +1 -0
  21. package/dist/agent/ops.d.ts +25 -0
  22. package/dist/agent/ops.js +82 -0
  23. package/dist/agent/ops.js.map +1 -0
  24. package/dist/agent/protocol.d.ts +72 -0
  25. package/dist/agent/protocol.js +195 -0
  26. package/dist/agent/protocol.js.map +1 -0
  27. package/dist/agent/supervisor.d.ts +80 -0
  28. package/dist/agent/supervisor.js +278 -0
  29. package/dist/agent/supervisor.js.map +1 -0
  30. package/dist/agent/task-store.d.ts +82 -0
  31. package/dist/agent/task-store.js +220 -0
  32. package/dist/agent/task-store.js.map +1 -0
  33. package/dist/agent/tool-executor.d.ts +28 -0
  34. package/dist/agent/tool-executor.js +113 -0
  35. package/dist/agent/tool-executor.js.map +1 -0
  36. package/dist/agent/worktrees.d.ts +35 -0
  37. package/dist/agent/worktrees.js +143 -0
  38. package/dist/agent/worktrees.js.map +1 -0
  39. package/dist/agent-help.d.ts +200 -176
  40. package/dist/agent-help.js +65 -32
  41. package/dist/agent-help.js.map +1 -1
  42. package/dist/auth.d.ts +3 -0
  43. package/dist/auth.js +52 -14
  44. package/dist/auth.js.map +1 -1
  45. package/dist/cloud.d.ts +1 -1
  46. package/dist/cloud.js +6 -13
  47. package/dist/cloud.js.map +1 -1
  48. package/dist/device/protocol.d.ts +11 -2
  49. package/dist/device/protocol.js +18 -2
  50. package/dist/device/protocol.js.map +1 -1
  51. package/dist/device/relay-client.d.ts +19 -2
  52. package/dist/device/relay-client.js +65 -13
  53. package/dist/device/relay-client.js.map +1 -1
  54. package/dist/diagnostics.js +12 -4
  55. package/dist/diagnostics.js.map +1 -1
  56. package/dist/index.js +203 -173
  57. package/dist/index.js.map +1 -1
  58. package/dist/key-budget.js +2 -2
  59. package/dist/key-budget.js.map +1 -1
  60. package/dist/mcp-authorization.js +9 -7
  61. package/dist/mcp-authorization.js.map +1 -1
  62. package/dist/mcp-command.d.ts +12 -4
  63. package/dist/mcp-command.js +54 -25
  64. package/dist/mcp-command.js.map +1 -1
  65. package/dist/provider/state.d.ts +2 -0
  66. package/dist/provider/state.js +1 -0
  67. package/dist/provider/state.js.map +1 -1
  68. package/dist/runtime/mcp-lease.js +1 -1
  69. package/dist/runtime/mcp-lease.js.map +1 -1
  70. package/dist/runtime/mcp.d.ts +139 -0
  71. package/dist/runtime/mcp.js +88 -29
  72. package/dist/runtime/mcp.js.map +1 -1
  73. package/dist/runtime/process-manager.d.ts +1 -1
  74. package/dist/runtime/process-manager.js +4 -2
  75. package/dist/runtime/process-manager.js.map +1 -1
  76. package/dist/runtime/relay-agent.d.ts +25 -0
  77. package/dist/runtime/relay-agent.js +63 -0
  78. package/dist/runtime/relay-agent.js.map +1 -0
  79. package/dist/runtime/relay-mcp.d.ts +5 -2
  80. package/dist/runtime/relay-mcp.js +6 -1
  81. package/dist/runtime/relay-mcp.js.map +1 -1
  82. package/dist/runtime/relay-session.d.ts +47 -0
  83. package/dist/runtime/relay-session.js +56 -0
  84. package/dist/runtime/relay-session.js.map +1 -0
  85. package/dist/runtime/sandbox.d.ts +16 -0
  86. package/dist/runtime/sandbox.js +149 -0
  87. package/dist/runtime/sandbox.js.map +1 -0
  88. package/dist/runtime/workspace-registry.d.ts +5 -0
  89. package/dist/runtime/workspace-registry.js +87 -0
  90. package/dist/runtime/workspace-registry.js.map +1 -0
  91. package/dist/runtime/workspace-router.d.ts +5 -0
  92. package/dist/runtime/workspace-router.js +32 -0
  93. package/dist/runtime/workspace-router.js.map +1 -0
  94. package/dist/runtime/workspace.js +3 -1
  95. package/dist/runtime/workspace.js.map +1 -1
  96. package/dist/skill/access.d.ts +4 -2
  97. package/dist/skill/access.js +7 -3
  98. package/dist/skill/access.js.map +1 -1
  99. package/dist/upgrade/installation.js +1 -1
  100. package/dist/upgrade/installation.js.map +1 -1
  101. package/dist/workspace-command.d.ts +8 -0
  102. package/dist/workspace-command.js +36 -0
  103. package/dist/workspace-command.js.map +1 -0
  104. package/package.json +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-service.js","sourceRoot":"","sources":["../../src/agent/agent-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export declare const APP_INSTALL_SCHEMA_VERSION = 1;
2
+ export declare const CAPSULE_MANIFEST_NAME = "capsule-manifest.json";
3
+ export type AppInstall = {
4
+ schemaVersion: number;
5
+ appVersion: string;
6
+ capsulePath: string;
7
+ protocolVersion: number;
8
+ };
9
+ export type CapsuleManifest = {
10
+ schemaVersion: number;
11
+ capsuleKind: string;
12
+ sourceCommit: string;
13
+ target: {
14
+ id: string;
15
+ platform: string;
16
+ architecture: string;
17
+ };
18
+ versions: {
19
+ piNode: string;
20
+ protocol: string;
21
+ };
22
+ runtime: {
23
+ executable: string;
24
+ };
25
+ application: {
26
+ entrypoint: string;
27
+ agentHostEntrypoint?: string;
28
+ launch?: string[];
29
+ };
30
+ };
31
+ export declare class AppInstallError extends Error {
32
+ readonly code: "app_not_installed" | "app_manifest_invalid" | "capsule_invalid" | "capsule_platform_mismatch" | "capsule_integrity_failed";
33
+ constructor(code: "app_not_installed" | "app_manifest_invalid" | "capsule_invalid" | "capsule_platform_mismatch" | "capsule_integrity_failed");
34
+ }
35
+ export declare function appInstallPath(env?: NodeJS.ProcessEnv): string;
36
+ export declare function readAppInstall(path?: string, env?: NodeJS.ProcessEnv): Promise<AppInstall>;
37
+ export type CapsuleFacts = {
38
+ manifest: CapsuleManifest;
39
+ nodeExecutable: string;
40
+ agentHostEntrypoint: string;
41
+ entrypointIsAgentHost: boolean;
42
+ };
43
+ /** Structural capsule verification: manifest shape, platform match, entrypoints. */
44
+ export declare function verifyCapsule(appInstall: AppInstall): Promise<CapsuleFacts>;
45
+ /**
46
+ * Full integrity walk (sha256 of every payload file against the manifest).
47
+ * Expensive; run once per supervisor lifetime, not on every host restart.
48
+ */
49
+ export declare function verifyCapsuleIntegrity(appInstall: AppInstall): Promise<void>;
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Reads `~/.config/frely/app.json` (written by the Frely App) and verifies the
3
+ * referenced Runtime Capsule well enough to launch its agent host entry.
4
+ */
5
+ import { createHash } from "node:crypto";
6
+ import { homedir } from "node:os";
7
+ import { lstat, readFile, readlink, stat } from "node:fs/promises";
8
+ import { join, relative, resolve } from "node:path";
9
+ export const APP_INSTALL_SCHEMA_VERSION = 1;
10
+ export const CAPSULE_MANIFEST_NAME = "capsule-manifest.json";
11
+ export class AppInstallError extends Error {
12
+ code;
13
+ constructor(code) {
14
+ super(code);
15
+ this.code = code;
16
+ this.name = "AppInstallError";
17
+ }
18
+ }
19
+ export function appInstallPath(env = process.env) {
20
+ return join(env.XDG_CONFIG_HOME || join(homedir(), ".config"), "frely", "app.json");
21
+ }
22
+ export async function readAppInstall(path, env = process.env) {
23
+ let raw;
24
+ try {
25
+ raw = await readFile(path ?? appInstallPath(env), "utf8");
26
+ }
27
+ catch {
28
+ throw new AppInstallError("app_not_installed");
29
+ }
30
+ let value;
31
+ try {
32
+ value = JSON.parse(raw);
33
+ }
34
+ catch {
35
+ throw new AppInstallError("app_manifest_invalid");
36
+ }
37
+ const record = value;
38
+ if (record.schemaVersion !== APP_INSTALL_SCHEMA_VERSION)
39
+ throw new AppInstallError("app_manifest_invalid");
40
+ if (typeof record.appVersion !== "string" || typeof record.capsulePath !== "string" || !Number.isSafeInteger(record.protocolVersion)) {
41
+ throw new AppInstallError("app_manifest_invalid");
42
+ }
43
+ return { schemaVersion: APP_INSTALL_SCHEMA_VERSION, appVersion: record.appVersion, capsulePath: record.capsulePath, protocolVersion: record.protocolVersion };
44
+ }
45
+ /** Structural capsule verification: manifest shape, platform match, entrypoints. */
46
+ export async function verifyCapsule(appInstall) {
47
+ let manifestRaw;
48
+ try {
49
+ manifestRaw = await readFile(join(appInstall.capsulePath, CAPSULE_MANIFEST_NAME), "utf8");
50
+ }
51
+ catch {
52
+ throw new AppInstallError("capsule_invalid");
53
+ }
54
+ let manifest;
55
+ try {
56
+ manifest = JSON.parse(manifestRaw);
57
+ }
58
+ catch {
59
+ throw new AppInstallError("capsule_invalid");
60
+ }
61
+ if (manifest.schemaVersion !== 2 || manifest.capsuleKind !== "pi-node-runtime")
62
+ throw new AppInstallError("capsule_invalid");
63
+ if (typeof manifest.sourceCommit !== "string" || !/^[0-9a-f]{40}$/u.test(manifest.sourceCommit))
64
+ throw new AppInstallError("capsule_invalid");
65
+ const platform = process.platform === "win32" ? "win32" : process.platform === "darwin" ? "darwin" : "linux";
66
+ if (manifest.target.platform !== platform)
67
+ throw new AppInstallError("capsule_platform_mismatch");
68
+ const nodeExecutable = join(appInstall.capsulePath, manifest.runtime.executable);
69
+ if (!(await isFile(nodeExecutable)))
70
+ throw new AppInstallError("capsule_invalid");
71
+ const agentHostEntrypoint = manifest.application.agentHostEntrypoint ?? manifest.application.entrypoint;
72
+ const entrypointPath = join(appInstall.capsulePath, agentHostEntrypoint);
73
+ if (!(await isFile(entrypointPath)))
74
+ throw new AppInstallError("capsule_invalid");
75
+ return {
76
+ manifest,
77
+ nodeExecutable,
78
+ agentHostEntrypoint: entrypointPath,
79
+ entrypointIsAgentHost: manifest.application.agentHostEntrypoint !== undefined,
80
+ };
81
+ }
82
+ /**
83
+ * Full integrity walk (sha256 of every payload file against the manifest).
84
+ * Expensive; run once per supervisor lifetime, not on every host restart.
85
+ */
86
+ export async function verifyCapsuleIntegrity(appInstall) {
87
+ const manifest = JSON.parse(await readFile(join(appInstall.capsulePath, CAPSULE_MANIFEST_NAME), "utf8"));
88
+ const integrity = manifest.integrity;
89
+ if (!integrity || integrity.algorithm !== "sha256")
90
+ throw new AppInstallError("capsule_invalid");
91
+ const seen = new Set();
92
+ let totalSize = 0;
93
+ let count = 0;
94
+ for (const entry of integrity.files) {
95
+ if (typeof entry.path !== "string" || entry.path.startsWith("/") || entry.path.includes(".."))
96
+ throw new AppInstallError("capsule_invalid");
97
+ if (seen.has(entry.path))
98
+ throw new AppInstallError("capsule_invalid");
99
+ seen.add(entry.path);
100
+ const full = resolve(appInstall.capsulePath, entry.path);
101
+ if (relative(appInstall.capsulePath, full).startsWith(".."))
102
+ throw new AppInstallError("capsule_invalid");
103
+ const info = await lstat(full).catch(() => null);
104
+ if (!info)
105
+ throw new AppInstallError("capsule_integrity_failed");
106
+ if (entry.symlinkTarget !== undefined) {
107
+ if (!info.isSymbolicLink())
108
+ throw new AppInstallError("capsule_integrity_failed");
109
+ const target = await readlink(full);
110
+ if (target !== entry.symlinkTarget)
111
+ throw new AppInstallError("capsule_integrity_failed");
112
+ continue;
113
+ }
114
+ if (!info.isFile())
115
+ throw new AppInstallError("capsule_integrity_failed");
116
+ const hash = createHash("sha256");
117
+ const content = await readFile(full);
118
+ hash.update(content);
119
+ if (hash.digest("hex") !== entry.sha256)
120
+ throw new AppInstallError("capsule_integrity_failed");
121
+ if (typeof entry.bytes === "number" && entry.bytes !== content.byteLength)
122
+ throw new AppInstallError("capsule_integrity_failed");
123
+ totalSize += content.byteLength;
124
+ count += 1;
125
+ }
126
+ if (count !== integrity.payloadFileCount || totalSize !== integrity.payloadSize)
127
+ throw new AppInstallError("capsule_integrity_failed");
128
+ }
129
+ async function isFile(path) {
130
+ const info = await stat(path).catch(() => null);
131
+ return info !== null && info.isFile();
132
+ }
133
+ //# sourceMappingURL=app-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-install.js","sourceRoot":"","sources":["../../src/agent/app-install.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAmB7D,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACnB;IAArB,YAAqB,IAAiI;QACpJ,KAAK,CAAC,IAAI,CAAC,CAAC;QADO,SAAI,GAAJ,IAAI,CAA6H;QAEpJ,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAa,EAAE,MAAyB,OAAO,CAAC,GAAG;IACtF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CAAC,mBAAmB,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CAAC,sBAAsB,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,MAAM,CAAC,aAAa,KAAK,0BAA0B;QAAE,MAAM,IAAI,eAAe,CAAC,sBAAsB,CAAC,CAAC;IAC3G,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QACrI,MAAM,IAAI,eAAe,CAAC,sBAAsB,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,eAAe,EAAE,MAAM,CAAC,eAAyB,EAAE,CAAC;AAC1K,CAAC;AASD,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAsB;IACxD,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,QAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAoB,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,IAAI,QAAQ,CAAC,WAAW,KAAK,iBAAiB;QAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC7H,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAC9I,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7G,IAAI,QAAQ,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,IAAI,eAAe,CAAC,2BAA2B,CAAC,CAAC;IAElG,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjF,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAElF,MAAM,mBAAmB,GAAG,QAAQ,CAAC,WAAW,CAAC,mBAAmB,IAAI,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC;IACxG,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IACzE,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;IAClF,OAAO;QACL,QAAQ;QACR,cAAc;QACd,mBAAmB,EAAE,cAAc;QACnC,qBAAqB,EAAE,QAAQ,CAAC,WAAW,CAAC,mBAAmB,KAAK,SAAS;KAC9E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,UAAsB;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC,CAEtG,CAAC;IACF,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,QAAQ;QAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;IACjG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAC5I,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;gBAAE,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;YAClF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,MAAM,KAAK,KAAK,CAAC,aAAa;gBAAE,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;YAC1F,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM;YAAE,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;QAC/F,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC,UAAU;YAAE,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;QACjI,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;QAChC,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,CAAC,gBAAgB,IAAI,SAAS,KAAK,SAAS,CAAC,WAAW;QAAE,MAAM,IAAI,eAAe,CAAC,0BAA0B,CAAC,CAAC;AACzI,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const DEFAULT_LIFETIME_USD = 50;
2
+ export declare const MAX_LIFETIME_USD = 500;
3
+ export declare class AppKeyError extends Error {
4
+ readonly code: string;
5
+ readonly status: number;
6
+ constructor(code: string, status: number, message: string);
7
+ }
8
+ export interface ProvisionedAppKey {
9
+ keyId: string;
10
+ rawKey: string;
11
+ name: string;
12
+ lifetimeUsd: number | null;
13
+ }
14
+ export declare function provisionAgentKey(lifetimeUsd?: number): Promise<ProvisionedAppKey>;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * `frely app key`: provision a device-scoped Frely API key for agent tasks
3
+ * (plan frely-app-agent-toolset §9.3). The key is shown once and never stored
4
+ * by the CLI; it is bound to a device the caller owns and capped at a
5
+ * lifetime spend limit enforced by the relay backend.
6
+ */
7
+ import { requireLogin } from "../auth.js";
8
+ import { ensureDevice, relayFetch } from "../device/control.js";
9
+ const ENDPOINT = "/api/user/device-relay/agent-key";
10
+ export const DEFAULT_LIFETIME_USD = 50;
11
+ export const MAX_LIFETIME_USD = 500;
12
+ export class AppKeyError extends Error {
13
+ code;
14
+ status;
15
+ constructor(code, status, message) {
16
+ super(message);
17
+ this.code = code;
18
+ this.status = status;
19
+ this.name = "AppKeyError";
20
+ }
21
+ }
22
+ export async function provisionAgentKey(lifetimeUsd = DEFAULT_LIFETIME_USD) {
23
+ if (!Number.isFinite(lifetimeUsd) || lifetimeUsd <= 0 || lifetimeUsd > MAX_LIFETIME_USD) {
24
+ throw new Error(`--lifetime-usd must be a positive amount of at most ${MAX_LIFETIME_USD}.`);
25
+ }
26
+ const auth = await requireLogin();
27
+ const device = await ensureDevice();
28
+ const response = await relayFetch(auth.config.relayUrl, auth.credential, ENDPOINT, {
29
+ method: "POST",
30
+ body: JSON.stringify({ deviceId: device.deviceId, lifetimeUsd }),
31
+ });
32
+ if (!response.ok) {
33
+ const body = await response.json().catch(() => null);
34
+ throw new AppKeyError(body?.error?.code ?? "agent_key_failed", response.status, body?.error?.message ?? `Agent key provisioning failed (${response.status}).`);
35
+ }
36
+ const created = await response.json();
37
+ if (typeof created.apiKey?.id !== "string" || typeof created.rawKey !== "string" || created.rawKey.length === 0)
38
+ throw new AppKeyError("agent_key_invalid", response.status, "Agent key response was invalid.");
39
+ return {
40
+ keyId: created.apiKey.id,
41
+ rawKey: created.rawKey,
42
+ name: created.apiKey.name ?? `frely-app ${device.deviceId.slice(-8)}`,
43
+ lifetimeUsd: created.limits?.lifetimeAmount ?? null,
44
+ };
45
+ }
46
+ //# sourceMappingURL=app-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-key.js","sourceRoot":"","sources":["../../src/agent/app-key.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,MAAM,OAAO,WAAY,SAAQ,KAAK;IACf;IAAuB;IAA5C,YAAqB,IAAY,EAAW,MAAc,EAAE,OAAe;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,SAAI,GAAJ,IAAI,CAAQ;QAAW,WAAM,GAAN,MAAM,CAAQ;QAExD,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AASD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,cAAsB,oBAAoB;IAChF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACxF,MAAM,IAAI,KAAK,CAAC,uDAAuD,gBAAgB,GAAG,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE;QACjF,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;KACjE,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAA2D,CAAC;QAC/G,MAAM,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,kBAAkB,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,kCAAkC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACjK,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA+G,CAAC;IACnJ,IAAI,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,WAAW,CAAC,mBAAmB,EAAE,QAAQ,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;IAChN,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,aAAa,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QACrE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,cAAc,IAAI,IAAI;KACpD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Composition root for the agent stack: builds an AgentService wired to the
3
+ * real app install, capsule verification, and the agent host supervisor.
4
+ * Failures (e.g. app not installed) surface lazily on first host use so the
5
+ * device relay daemon keeps serving MCP traffic.
6
+ */
7
+ import { AgentService } from "./agent-service.js";
8
+ import { TaskStore } from "./task-store.js";
9
+ import type { DiagnosticLog } from "../runtime/diagnostics.js";
10
+ export type CreateAgentServiceOptions = {
11
+ log?: DiagnosticLog;
12
+ env?: NodeJS.ProcessEnv;
13
+ defaultWorkspace: string;
14
+ modelCredentials?: () => {
15
+ apiKey: string;
16
+ baseUrl: string;
17
+ model: string;
18
+ } | null;
19
+ fullIntegrityVerification?: boolean;
20
+ store?: TaskStore;
21
+ };
22
+ export declare function createAgentService(options: CreateAgentServiceOptions): AgentService;
23
+ export { AgentService };
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Composition root for the agent stack: builds an AgentService wired to the
3
+ * real app install, capsule verification, and the agent host supervisor.
4
+ * Failures (e.g. app not installed) surface lazily on first host use so the
5
+ * device relay daemon keeps serving MCP traffic.
6
+ */
7
+ import { AgentService } from "./agent-service.js";
8
+ import { readAppInstall, verifyCapsule } from "./app-install.js";
9
+ import { AgentHostSupervisor } from "./supervisor.js";
10
+ import { TaskStore } from "./task-store.js";
11
+ export function createAgentService(options) {
12
+ const env = options.env ?? process.env;
13
+ const store = options.store ?? TaskStore.open(undefined, env);
14
+ const resolveFacts = async () => {
15
+ const install = await readAppInstall(undefined, env);
16
+ return verifyCapsule(install);
17
+ };
18
+ let service = null;
19
+ const supervisor = new AgentHostSupervisor({
20
+ resolveFacts,
21
+ fullIntegrityVerification: options.fullIntegrityVerification ?? true,
22
+ appInstall: () => readAppInstall(undefined, env),
23
+ isIdle: () => {
24
+ if (!service)
25
+ return true;
26
+ return service.listTasks().then((tasks) => tasks.every((task) => task.status !== "queued" && task.status !== "running" && task.status !== "waiting_input")).catch(() => true);
27
+ },
28
+ onEvent: (taskId, event) => service?.onTaskEvent(taskId, event),
29
+ onToolRequest: (request, args, taskId) => service.onToolRequest(request, args, taskId),
30
+ onHostLost: (error) => service?.onHostLost(error),
31
+ log: options.log,
32
+ });
33
+ service = new AgentService({
34
+ store,
35
+ resolveSupervisor: () => supervisor,
36
+ ...(options.modelCredentials ? { modelCredentials: options.modelCredentials } : {}),
37
+ ...(options.log ? { log: options.log } : {}),
38
+ });
39
+ return service;
40
+ }
41
+ export { AgentService };
42
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/agent/compose.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAY5C,MAAM,UAAU,kBAAkB,CAAC,OAAkC;IACnE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,KAAK,IAA2B,EAAE;QACrD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACrD,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC;IACF,IAAI,OAAO,GAAwB,IAAI,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,mBAAmB,CAAC;QACzC,YAAY;QACZ,yBAAyB,EAAE,OAAO,CAAC,yBAAyB,IAAI,IAAI;QACpE,UAAU,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC;QAChD,MAAM,EAAE,GAAG,EAAE;YACX,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC1B,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAChL,CAAC;QACD,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC;QAC/D,aAAa,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,OAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC;QACvF,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC;QACjD,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,OAAO,GAAG,IAAI,YAAY,CAAC;QACzB,KAAK;QACL,iBAAiB,EAAE,GAAG,EAAE,CAAC,UAAU;QACnC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AgentService } from "./agent-service.js";
2
+ export interface AgentOpsServer {
3
+ path: string;
4
+ close: () => Promise<void>;
5
+ }
6
+ export interface AgentOpsServerOptions {
7
+ workspace: string;
8
+ socketPath?: string;
9
+ env?: NodeJS.ProcessEnv;
10
+ pollIntervalMs?: number;
11
+ log?: (message: string) => void;
12
+ }
13
+ export declare function startAgentOpsServer(agent: AgentService, options: AgentOpsServerOptions): Promise<AgentOpsServer>;
14
+ export declare function pingAgentOpsSocket(socketPath: string, timeoutMs: number): Promise<{
15
+ running: boolean;
16
+ pid?: number | undefined;
17
+ version?: string | undefined;
18
+ }>;
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Local GUI ops socket (plan §4.2 as amended for M4): a Unix domain socket
3
+ * bound to the current user (0600) exposing the shared agent-op surface plus
4
+ * `config_get`/`config_set`, and pushing `tasks_changed` notifications so the
5
+ * Frely App task panel stays live. The socket lives only as long as the
6
+ * serving process (`frely mcp serve`), which is also the process hosting
7
+ * agent task execution, so remote and GUI views share one task store.
8
+ */
9
+ import { connect, createServer } from "node:net";
10
+ import { chmod, mkdir, rm } from "node:fs/promises";
11
+ import { dirname, join } from "node:path";
12
+ import { loadAgentConfig, saveAgentConfig } from "./agent-service.js";
13
+ import { AGENT_MAX_COST_USD_LIMIT, agentStateDir, TaskStore } from "./task-store.js";
14
+ import { VERSION } from "../version.js";
15
+ import { AGENT_OPS, dispatchAgentOp, isAgentOp } from "./ops.js";
16
+ const MAX_LINE_BYTES = 512 * 1024;
17
+ export async function startAgentOpsServer(agent, options) {
18
+ const env = options.env ?? process.env;
19
+ const socketPath = options.socketPath ?? join(agentStateDir(env), "ops.sock");
20
+ await mkdir(dirname(socketPath), { recursive: true, mode: 0o700 });
21
+ await rm(socketPath, { force: true });
22
+ const sockets = new Set();
23
+ const clients = new Set();
24
+ const store = TaskStore.open(undefined, env);
25
+ const server = createServer((socket) => {
26
+ sockets.add(socket);
27
+ socket.setEncoding("utf8");
28
+ const client = {
29
+ write: (line) => {
30
+ if (!socket.destroyed)
31
+ socket.write(`${line}\n`);
32
+ },
33
+ };
34
+ clients.add(client);
35
+ let buffer = "";
36
+ socket.on("data", (chunk) => {
37
+ buffer += chunk;
38
+ let newline = buffer.indexOf("\n");
39
+ while (newline >= 0) {
40
+ const line = buffer.slice(0, newline).trim();
41
+ buffer = buffer.slice(newline + 1);
42
+ if (line.length > 0)
43
+ void handleLine(line, client);
44
+ if (buffer.length > MAX_LINE_BYTES) {
45
+ client.write(JSON.stringify({ id: null, ok: false, error: { code: "request_too_large", message: "Request line exceeds the 512KB limit." } }));
46
+ socket.destroy();
47
+ return;
48
+ }
49
+ newline = buffer.indexOf("\n");
50
+ }
51
+ });
52
+ socket.on("close", () => { clients.delete(client); sockets.delete(socket); });
53
+ socket.on("error", () => { clients.delete(client); sockets.delete(socket); });
54
+ // Greet the client with a task snapshot so it can render without a leading list call.
55
+ void store.list().then((tasks) => client.write(JSON.stringify({ push: "tasks_changed", tasks })), () => undefined);
56
+ });
57
+ await new Promise((resolve, reject) => {
58
+ server.once("error", reject);
59
+ server.listen(socketPath, () => resolve());
60
+ });
61
+ await chmod(socketPath, 0o600);
62
+ const pollIntervalMs = options.pollIntervalMs ?? 1000;
63
+ // Establish the baseline before accepting changes: any task created after
64
+ // startup (including between a client's welcome snapshot and the first
65
+ // poll tick) must eventually produce a push.
66
+ let fingerprint = fingerprintFor(await store.list());
67
+ const poll = setInterval(() => {
68
+ if (clients.size === 0)
69
+ return;
70
+ void store.list().then((tasks) => {
71
+ const next = fingerprintFor(tasks);
72
+ if (next === fingerprint)
73
+ return;
74
+ fingerprint = next;
75
+ broadcast(JSON.stringify({ push: "tasks_changed", tasks }));
76
+ }, (error) => options.log?.(`agent.ops.poll_failed ${error instanceof Error ? error.message : String(error)}`));
77
+ }, pollIntervalMs);
78
+ poll.unref?.();
79
+ async function handleLine(line, client) {
80
+ let request;
81
+ try {
82
+ const parsed = JSON.parse(line);
83
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
84
+ throw new Error("not an object");
85
+ request = parsed;
86
+ }
87
+ catch {
88
+ client.write(JSON.stringify({ id: null, ok: false, error: { code: "invalid_request", message: "Each line must be a JSON request object." } }));
89
+ return;
90
+ }
91
+ const id = request.id ?? null;
92
+ try {
93
+ const result = await dispatch(request);
94
+ client.write(JSON.stringify({ id, ok: true, result }));
95
+ }
96
+ catch (error) {
97
+ const code = error instanceof Error && "code" in error && typeof error.code === "string" ? error.code : "internal";
98
+ client.write(JSON.stringify({ id, ok: false, error: { code, message: error instanceof Error ? error.message : String(error) } }));
99
+ }
100
+ }
101
+ async function dispatch(request) {
102
+ if (request.op === "ping")
103
+ return { pong: true, pid: process.pid, version: VERSION };
104
+ if (request.op === "config_get")
105
+ return { config: await loadAgentConfig(env) };
106
+ if (request.op === "config_set") {
107
+ const patch = (request.args && typeof request.args === "object" && !Array.isArray(request.args) ? request.args : {});
108
+ const current = await loadAgentConfig(env);
109
+ const next = {
110
+ schemaVersion: 1,
111
+ remoteControlEnabled: typeof patch.remoteControlEnabled === "boolean" ? patch.remoteControlEnabled : current.remoteControlEnabled,
112
+ defaultMaxCostUsd: typeof patch.defaultMaxCostUsd === "number" ? patch.defaultMaxCostUsd : current.defaultMaxCostUsd,
113
+ maxCostUsdLimit: clampCost(patch.maxCostUsdLimit, current.maxCostUsdLimit),
114
+ maxConcurrentTasks: clampConcurrency(patch.maxConcurrentTasks, current.maxConcurrentTasks),
115
+ };
116
+ await saveAgentConfig(next, env);
117
+ return { config: next };
118
+ }
119
+ if (typeof request.op === "string" && isAgentOp(request.op)) {
120
+ const args = (request.args && typeof request.args === "object" && !Array.isArray(request.args) ? request.args : {});
121
+ return dispatchAgentOp(request.op, args, agent, { workspace: options.workspace }, { source: { kind: "gui" }, approvedBy: "gui" });
122
+ }
123
+ throw Object.assign(new Error(`Unknown op. Supported: ping, config_get, config_set, and agent ops (${AGENT_OPS.join(", ")}).`), { code: "unknown_op" });
124
+ }
125
+ function broadcast(line) {
126
+ for (const client of clients)
127
+ client.write(line);
128
+ }
129
+ return {
130
+ path: socketPath,
131
+ close: async () => {
132
+ clearInterval(poll);
133
+ clients.clear();
134
+ for (const socket of sockets)
135
+ socket.destroy();
136
+ await new Promise((resolve) => server.close(() => resolve()));
137
+ await rm(socketPath, { force: true });
138
+ },
139
+ };
140
+ }
141
+ function clampCost(value, fallback) {
142
+ return typeof value === "number" && Number.isFinite(value) && value > 0 && value <= AGENT_MAX_COST_USD_LIMIT ? value : fallback;
143
+ }
144
+ function clampConcurrency(value, fallback) {
145
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 1 && value <= 4 ? value : fallback;
146
+ }
147
+ function fingerprintFor(tasks) {
148
+ return JSON.stringify(tasks.map((task) => [task.id, task.status, task.mergeStatus, task.usage.costUsd, task.updatedAt]));
149
+ }
150
+ export function pingAgentOpsSocket(socketPath, timeoutMs) {
151
+ return new Promise((resolvePing) => {
152
+ const socket = connect(socketPath);
153
+ const finish = (value) => {
154
+ socket.destroy();
155
+ clearTimeout(timer);
156
+ resolvePing(value);
157
+ };
158
+ const timer = setTimeout(() => finish({ running: false }), timeoutMs);
159
+ socket.on("connect", () => socket.write(`${JSON.stringify({ id: 1, op: "ping", args: {} })}\n`));
160
+ socket.on("data", (chunk) => {
161
+ for (const line of chunk.toString("utf8").split("\n")) {
162
+ if (line.trim().length === 0)
163
+ continue;
164
+ try {
165
+ const response = JSON.parse(line);
166
+ if (response.ok && response.result?.pong)
167
+ finish({ running: true, pid: response.result.pid, version: response.result.version });
168
+ }
169
+ catch { /* ignore partial lines */ }
170
+ }
171
+ });
172
+ socket.on("error", () => finish({ running: false }));
173
+ });
174
+ }
175
+ //# sourceMappingURL=ops-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ops-server.js","sourceRoot":"","sources":["../../src/agent/ops-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function runAgentOpsStdioBridge(args: {
2
+ stdout: NodeJS.WriteStream;
3
+ stdin: NodeJS.ReadStream;
4
+ stderr: NodeJS.WriteStream;
5
+ }): Promise<number>;
@@ -0,0 +1,47 @@
1
+ /**
2
+ * `frely app ops`: stdio bridge to the local agent ops socket.
3
+ *
4
+ * The Frely App GUI cannot open Unix domain sockets from Dart, so it spawns
5
+ * this command instead: the process connects to `<state>/agent/ops.sock`,
6
+ * bridges stdin -> socket and socket -> stdout line by line, and exits 1 with
7
+ * a stderr hint when no serving process is running. This keeps the socket's
8
+ * same-user permission boundary (the bridge runs as the current user) while
9
+ * giving the GUI a plain NDJSON stream with tasks_changed pushes.
10
+ */
11
+ import { connect } from "node:net";
12
+ import { createInterface } from "node:readline";
13
+ import { agentStateDir } from "./task-store.js";
14
+ import { pingAgentOpsSocket } from "./ops-server.js";
15
+ export async function runAgentOpsStdioBridge(args) {
16
+ const socketPath = `${agentStateDir()}/ops.sock`;
17
+ const probe = await pingAgentOpsSocket(socketPath, 1000);
18
+ if (!probe.running) {
19
+ args.stderr.write(`Agent ops socket is not reachable at ${socketPath}. Start it with: frely mcp serve\n`);
20
+ return 1;
21
+ }
22
+ await new Promise((resolve) => {
23
+ let settled = false;
24
+ const finish = (code) => {
25
+ if (!settled) {
26
+ settled = true;
27
+ resolve(code);
28
+ }
29
+ };
30
+ const socket = connect(socketPath);
31
+ socket.on("error", (error) => {
32
+ args.stderr.write(`Agent ops socket failed: ${error instanceof Error ? error.message : String(error)}\n`);
33
+ finish(1);
34
+ });
35
+ socket.on("close", () => finish(0));
36
+ socket.pipe(args.stdout);
37
+ const lines = createInterface({ input: args.stdin });
38
+ lines.on("line", (line) => {
39
+ if (line.trim().length > 0 && !socket.destroyed)
40
+ socket.write(`${line}\n`);
41
+ });
42
+ args.stdin.on("close", () => socket.end());
43
+ args.stdin.on("end", () => socket.end());
44
+ });
45
+ return 0;
46
+ }
47
+ //# sourceMappingURL=ops-stdio.js.map