@akanjs/cli 3.0.0-beta.2 → 3.0.0-beta.20

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 (187) hide show
  1. package/.build-stamp +1 -1
  2. package/CodeAgent-awv258wb.js +9 -0
  3. package/CodeAgentRpcHost-p7h6n2hp.js +7 -0
  4. package/CodeAgentRpcListener-7p7z5dd7.js +97 -0
  5. package/CodeTui-1nqh35ez.js +1457 -0
  6. package/README.md +3 -0
  7. package/TunnelShare-scf4e4pd.js +9 -0
  8. package/{agent.command-d2gfxfck.js → agent.command-1s9ag7sb.js} +8 -9
  9. package/akanCode.js +102 -0
  10. package/{application.command-pj2m7584.js → application.command-49hwy6va.js} +51 -78
  11. package/{applicationBuildRunner-kxwbssgn.js → applicationBuildRunner-ybyp97pv.js} +63 -64
  12. package/{applicationReleasePackager-4yasxwv9.js → applicationReleasePackager-esnrphw8.js} +40 -60
  13. package/buildBatch.proc.js +19 -24
  14. package/{capacitorApp-36rbr858.js → capacitorApp-1synz4en.js} +3 -4
  15. package/cloud.command-d7rqtzt9.js +94 -0
  16. package/cloud.script-bkbpcr96.js +19 -0
  17. package/code.command-nn48xzej.js +154 -0
  18. package/commandManifest.json +1 -1
  19. package/consoleToStderr-h5bryj94.js +7 -0
  20. package/context.command-s3mcmvpa.js +48 -0
  21. package/context.runner-k99nb5pk.js +21 -0
  22. package/{dependencyScanner-shs82ynp.js → dependencyScanner-ye2e6pdz.js} +2 -2
  23. package/{devTui-40ggmd99.js → devTui-q7k7bakd.js} +122 -40
  24. package/fileSys-5ngz93ga.js +9 -0
  25. package/guideline.command-sct4qnt5.js +42 -0
  26. package/guidelines/agentRule/agentRule.instruction.md +206 -25
  27. package/guidelines/conventions/conventions.instruction.md +79 -24
  28. package/guidelines/fieldRule/fieldRule.instruction.md +1 -0
  29. package/guidelines/mcpRule/mcpRule.instruction.md +7 -5
  30. package/guidelines/queryRule/queryRule.instruction.md +17 -7
  31. package/guidelines/runtimeRule/runtimeRule.instruction.md +74 -0
  32. package/guidelines/ssrRule/ssrRule.instruction.md +4 -2
  33. package/guidelines/transportRule/transportRule.instruction.md +51 -0
  34. package/guidelines/workspaceRecipes/workspaceRecipes.instruction.md +66 -3
  35. package/incrementalBuilder.proc.js +31 -48
  36. package/{index-h7yw2z9n.js → index-0bq14vr1.js} +8 -14
  37. package/index-13ffe9wp.js +69 -0
  38. package/index-22d57v4c.js +266 -0
  39. package/{index-fz5q3gd7.js → index-31yr441d.js} +10 -17
  40. package/index-3hx1z96c.js +87 -0
  41. package/index-3sq321ak.js +53 -0
  42. package/{index-kcxmv48c.js → index-3t7g9e4r.js} +45 -79
  43. package/{index-q0y2jq9j.js → index-5b6tavv3.js} +6 -3
  44. package/{index-47pj3aee.js → index-5e0n4hqx.js} +11 -12
  45. package/{index-259dsnz3.js → index-5pc1qrbv.js} +5 -8
  46. package/index-7md2g9vw.js +6 -0
  47. package/index-8mna0947.js +187 -0
  48. package/{index-zry5nz81.js → index-8sf7wmdr.js} +51 -30
  49. package/{index-2tv3fdx4.js → index-9d9bgcx4.js} +342 -765
  50. package/index-9dp031by.js +12 -0
  51. package/{index-ne2qy0nk.js → index-ahemdr5n.js} +12 -12
  52. package/{index-ws5e0j51.js → index-as7xmyz8.js} +40 -24
  53. package/index-axzjaqve.js +1118 -0
  54. package/{index-3d9y066c.js → index-bjwxs904.js} +9 -8
  55. package/index-c6eggbee.js +123 -0
  56. package/index-d2242ksy.js +99 -0
  57. package/{index-a64esmtb.js → index-ddxvdd1p.js} +169 -305
  58. package/{index-92zztqy1.js → index-dy0jx9ay.js} +2 -17
  59. package/{index-pnqbkf5p.js → index-dzf3r49a.js} +6 -2
  60. package/{index-w8kmx1b6.js → index-fgq75haa.js} +198 -290
  61. package/{index-by5gpp8x.js → index-hj6w4ka1.js} +2 -1
  62. package/{index-hwkygn9s.js → index-khpfpcsd.js} +302 -33
  63. package/{index-wt7qrtd4.js → index-mxav6j3c.js} +93 -232
  64. package/{index-gyd220p2.js → index-myhc3c1j.js} +554 -577
  65. package/{index-600zhnve.js → index-nv5976x3.js} +56 -197
  66. package/index-p6pbz9n5.js +25 -0
  67. package/{index-4edzf1gr.js → index-przybvy5.js} +77 -150
  68. package/index-smme4r47.js +49 -0
  69. package/{index-mak3cd28.js → index-w2zdcw3k.js} +137 -255
  70. package/index-wa5jbxj1.js +760 -0
  71. package/{index-v0qh106m.js → index-ww4z397j.js} +527 -723
  72. package/{index-j9yhg404.js → index-xqjwd384.js} +4 -7
  73. package/{index-7737gxcp.js → index-xqpzbab5.js} +107 -241
  74. package/index-xsjh6nzh.js +2729 -0
  75. package/{index-ktb5njgy.js → index-ygn77a5w.js} +47 -99
  76. package/index-ztp3e73t.js +700 -0
  77. package/index.js +23 -22
  78. package/{library.command-nbsky672.js → library.command-1gx04jgn.js} +4 -5
  79. package/{localRegistry.command-yeq57wjr.js → localRegistry.command-zndxj1q6.js} +22 -42
  80. package/{module.command-29vqzrh8.js → module.command-3waddk95.js} +8 -11
  81. package/{package.command-axv0abmn.js → package.command-zrc7br1y.js} +6 -7
  82. package/package.json +14 -5
  83. package/{page.command-vs9s3zrh.js → page.command-vpjgardh.js} +4 -5
  84. package/{primitive.command-cbxmqbtc.js → primitive.command-sz84tk4t.js} +9 -22
  85. package/prompter-ptaa3nk0.js +8 -0
  86. package/{quality.command-gmbs7nws.js → quality.command-g869hafs.js} +203 -376
  87. package/{recipeScanner-fpagtgc1.js → recipeScanner-4b69ybe0.js} +1 -1
  88. package/{repair.command-bqsjptsj.js → repair.command-chsnjvvv.js} +11 -35
  89. package/{routeSourceValidator-apyqw7wk.js → routeSourceValidator-7ycnfz0e.js} +0 -6
  90. package/{scalar.command-6k1vhe9s.js → scalar.command-2v21newx.js} +7 -10
  91. package/skills/akan-code/SKILL.md +130 -0
  92. package/skills/akan-debug/SKILL.md +42 -0
  93. package/skills/akan-deps/SKILL.md +50 -0
  94. package/skills/akan-err/SKILL.md +39 -0
  95. package/skills/akan-module/SKILL.md +45 -0
  96. package/skills/akan-scaffold/SKILL.md +76 -0
  97. package/skills/akan-scalar/SKILL.md +52 -0
  98. package/skills/akan-service/SKILL.md +34 -0
  99. package/skills/akan-store/SKILL.md +67 -0
  100. package/skills/akan-ui/SKILL.md +63 -0
  101. package/skills/akan-validate/SKILL.md +44 -0
  102. package/{subspace.command-fwjfcts7.js → subspace.command-ckcbwfp1.js} +138 -67
  103. package/templates/__scalar/__model__/__model__.abstract.md.template +8 -0
  104. package/templates/appSample/lib/__scalar/workHistory/workHistory.abstract.ts +8 -39
  105. package/templates/appSample/lib/_noti/noti.abstract.ts +6 -29
  106. package/templates/appSample/lib/task/task.abstract.ts +12 -32
  107. package/templates/appSample/lib/task/task.signal.spec.ts +15 -18
  108. package/templates/appSample/lib/task/task.signal.test.ts +15 -1
  109. package/templates/appSample/lib/task/task.signal.ts +1 -1
  110. package/templates/appSample/srvkit/{AuthGuard.ts → guards.ts} +7 -4
  111. package/templates/appSample/srvkit/{SessionInternalArg.ts → internalArgs.ts} +6 -4
  112. package/templates/client.ts +7 -30
  113. package/templates/crudPages/[__model__Id]/edit/page.tsx +2 -1
  114. package/templates/crudPages/[__model__Id]/page.tsx +2 -1
  115. package/templates/crudPages/new/page.tsx +2 -1
  116. package/templates/crudPages/page.tsx +2 -1
  117. package/templates/crudSinglePage/page.tsx +2 -1
  118. package/templates/lib/__lib/lib.dictionary.ts +0 -2
  119. package/templates/lib/__lib/lib.document.ts +0 -2
  120. package/templates/lib/sig.ts +8 -30
  121. package/templates/localDev/docker-compose.yaml.template +3 -14
  122. package/templates/module/__model__.signal.ts +12 -4
  123. package/templates/pkgRoot/tsconfig.json.template +2 -7
  124. package/templates/server.ts +0 -2
  125. package/templates/service/__model__.abstract.md.template +8 -0
  126. package/tunnel.command-kd2yr4fx.js +129 -0
  127. package/{typeChecker-3xgrzc2v.js → typeChecker-px49mezc.js} +1 -1
  128. package/typecheck.proc.js +1 -1
  129. package/workflow.command-44252cqv.js +79 -0
  130. package/{workspace.command-8s050m0h.js → workspace.command-fqcztt5p.js} +77 -109
  131. package/abstractCompactor-mjh5ppsq.js +0 -101
  132. package/cloud.command-jshwdq22.js +0 -93
  133. package/context.command-ez8a0zyz.js +0 -80
  134. package/devTuiView-c08ccbat.js +0 -9
  135. package/getDirname-dr3jz1xg.js +0 -7
  136. package/guideline.command-xmqwx8zm.js +0 -359
  137. package/guidelines/agentRule/agentRule.generate.json +0 -31
  138. package/guidelines/componentRule/componentRule.generate.json +0 -31
  139. package/guidelines/conventions/conventions.generate.json +0 -25
  140. package/guidelines/cssRule/cssRule.generate.json +0 -31
  141. package/guidelines/docPageRule/docPageRule.generate.json +0 -31
  142. package/guidelines/docPageRule/docPageRule.instruction.md +0 -25
  143. package/guidelines/docSyncRule/docSyncRule.generate.json +0 -31
  144. package/guidelines/docSyncRule/docSyncRule.instruction.md +0 -25
  145. package/guidelines/enumConstant/enumConstant.generate.json +0 -31
  146. package/guidelines/enumConstant/enumConstant.instruction.md +0 -28
  147. package/guidelines/fieldRule/fieldRule.generate.json +0 -31
  148. package/guidelines/framework/framework.generate.json +0 -32
  149. package/guidelines/mcpRule/mcpRule.generate.json +0 -35
  150. package/guidelines/modelConstant/modelConstant.generate.json +0 -32
  151. package/guidelines/modelDictionary/modelDictionary.generate.json +0 -32
  152. package/guidelines/modelDocument/modelDocument.generate.json +0 -31
  153. package/guidelines/modelService/modelService.generate.json +0 -31
  154. package/guidelines/modelSignal/modelSignal.generate.json +0 -31
  155. package/guidelines/modelStore/modelStore.generate.json +0 -31
  156. package/guidelines/modelTemplate/modelTemplate.generate.json +0 -31
  157. package/guidelines/modelUnit/modelUnit.generate.json +0 -31
  158. package/guidelines/modelUtil/modelUtil.generate.json +0 -31
  159. package/guidelines/modelView/modelView.generate.json +0 -31
  160. package/guidelines/modelZone/modelZone.generate.json +0 -31
  161. package/guidelines/moduleCodegen/moduleCodegen.generate.json +0 -31
  162. package/guidelines/moduleCodegen/moduleCodegen.instruction.md +0 -28
  163. package/guidelines/moduleOverview/moduleOverview.generate.json +0 -31
  164. package/guidelines/queryRule/queryRule.generate.json +0 -31
  165. package/guidelines/recipeRule/recipeRule.generate.json +0 -31
  166. package/guidelines/runtimeRule/runtimeRule.generate.json +0 -25
  167. package/guidelines/scalarConstant/scalarConstant.generate.json +0 -32
  168. package/guidelines/scalarDictionary/scalarDictionary.generate.json +0 -32
  169. package/guidelines/scalarModule/scalarModule.generate.json +0 -31
  170. package/guidelines/sharedUiUsage/sharedUiUsage.generate.json +0 -31
  171. package/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +0 -25
  172. package/guidelines/ssrRule/ssrRule.generate.json +0 -31
  173. package/guidelines/transportRule/transportRule.generate.json +0 -31
  174. package/guidelines/utilUiUsage/utilUiUsage.generate.json +0 -31
  175. package/guidelines/utilUiUsage/utilUiUsage.instruction.md +0 -25
  176. package/guidelines/workspaceOnboarding/workspaceOnboarding.generate.json +0 -24
  177. package/guidelines/workspaceRecipes/workspaceRecipes.generate.json +0 -33
  178. package/index-2hq52jq3.js +0 -465
  179. package/index-6wwzs1bc.js +0 -7
  180. package/index-8pm30m73.js +0 -841
  181. package/index-kn1h7p1x.js +0 -560
  182. package/index-meh558jy.js +0 -65
  183. package/index-rwg2aa4f.js +0 -229
  184. package/templates/__scalar/__model__/__model__.abstract.md +0 -28
  185. package/templates/module/__model__.abstract.md +0 -28
  186. package/templates/service/__model__.abstract.md +0 -28
  187. package/workflow.command-nwpcdc8p.js +0 -107
@@ -14,25 +14,26 @@ class LibSource {
14
14
  const relative = file.slice(this.#prefix.length);
15
15
  return !LibSource.unhashedDirs.includes(relative.split("/")[0] ?? "");
16
16
  }
17
- async#hashableContent(file) {
18
- const content = await this.#lib.workspace.readFile(file);
19
- if (file !== `${this.#prefix}package.json`)
20
- return content;
21
- const manifest = JSON.parse(content);
17
+ static unstamped(manifestContent) {
18
+ const manifest = JSON.parse(manifestContent);
22
19
  delete manifest[LibSource.manifestKey];
23
20
  return JSON.stringify(manifest);
24
21
  }
25
- async computeHash() {
26
- const files = (await this.#lib.workspace.listGitFiles([`libs/${this.#lib.name}`], { untracked: true })).filter((file) => this.#isHashed(file));
22
+ static async hashFiles(files, manifestFile, read) {
27
23
  const hasher = new Bun.CryptoHasher("sha256");
28
24
  for (const file of files) {
25
+ const content = await read(file);
29
26
  hasher.update(file);
30
27
  hasher.update("\x00");
31
- hasher.update(await this.#hashableContent(file));
28
+ hasher.update(file === manifestFile ? LibSource.unstamped(content) : content);
32
29
  hasher.update("\x00");
33
30
  }
34
31
  return hasher.digest("hex").slice(0, 32);
35
32
  }
33
+ async computeHash() {
34
+ const files = (await this.#lib.workspace.listGitFiles([`libs/${this.#lib.name}`], { untracked: true })).filter((file) => this.#isHashed(file));
35
+ return await LibSource.hashFiles(files, `${this.#prefix}package.json`, (file) => this.#lib.workspace.readFile(file));
36
+ }
36
37
  async read() {
37
38
  const manifest = await this.#lib.getPackageJson();
38
39
  const akan = manifest[LibSource.manifestKey];
@@ -0,0 +1,123 @@
1
+ // @bun
2
+ // pkgs/@akanjs/devkit/codeAgent/agent/akanCodeModel.ts
3
+ var akanCodeDefaultModel2 = { provider: "deepseek", id: "deepseek-flash" };
4
+ var catalogueMissesImages = new Set(["deepseek/deepseek-v4-flash"]);
5
+ var correctInputs = (model) => {
6
+ if (!model || model.input.includes("image"))
7
+ return model;
8
+ if (!catalogueMissesImages.has(`${model.provider}/${model.id}`))
9
+ return model;
10
+ return { ...model, input: [...model.input, "image"] };
11
+ };
12
+ var akanCodeModel2 = async (runtime, ref) => {
13
+ if (ref) {
14
+ const requested = runtime.getModel(ref.provider, ref.id);
15
+ if (!requested)
16
+ throw new Error(`Unknown model: ${ref.provider}/${ref.id}`);
17
+ if (!runtime.hasConfiguredAuth(ref.provider))
18
+ throw new Error(`No API key configured for ${ref.provider}. Set ${ref.provider.toUpperCase()}_API_KEY.`);
19
+ return correctInputs(requested);
20
+ }
21
+ const fallback = runtime.getModel(akanCodeDefaultModel2.provider, akanCodeDefaultModel2.id);
22
+ if (fallback && runtime.hasConfiguredAuth(fallback.provider))
23
+ return correctInputs(fallback);
24
+ return correctInputs((await runtime.getAvailable())[0]);
25
+ };
26
+ var akanCodeModelSupportsImages2 = (model) => !!model?.input.includes("image");
27
+ var akanCodeModelWarnings2 = (model, compactionFloor) => {
28
+ if (!model)
29
+ return [];
30
+ if (model.contextWindow >= compactionFloor)
31
+ return [];
32
+ return [
33
+ `${model.provider}/${model.id} declares a ${model.contextWindow}-token context window, below the ${compactionFloor} the compaction policy needs, so every turn will compact immediately. Check the model entry in ~/.akan/code/models.json.`
34
+ ];
35
+ };
36
+
37
+ // pkgs/@akanjs/devkit/codeAgent/agent/CodeAgentStreamPrinter.ts
38
+ import { codeAgentEventLabel } from "akanjs/common";
39
+ import chalk from "chalk";
40
+
41
+ class CodeAgentStreamPrinter2 {
42
+ #options;
43
+ #write;
44
+ #streaming = false;
45
+ constructor(options = {}) {
46
+ this.#options = options;
47
+ this.#write = options.write ?? ((text) => process.stdout.write(text));
48
+ }
49
+ print(event) {
50
+ if (this.#options.json)
51
+ return this.#write(`${JSON.stringify(event)}
52
+ `);
53
+ switch (event.type) {
54
+ case "text_delta":
55
+ this.#streaming = true;
56
+ return this.#write(event.text);
57
+ case "thinking_delta":
58
+ if (!this.#options.thinking)
59
+ return;
60
+ this.#streaming = true;
61
+ return this.#write(chalk.dim(event.text));
62
+ case "tool_start":
63
+ return this.#line(chalk.cyan(`\u2192 ${event.tool.title}`));
64
+ case "tool_end":
65
+ return this.#line(CodeAgentStreamPrinter2.#toolEnd(event));
66
+ case "session":
67
+ return this.#line(chalk.dim(codeAgentEventLabel(event)));
68
+ case "turn_end":
69
+ if (event.stopReason === "truncated")
70
+ return this.#line(chalk.yellow(codeAgentEventLabel(event)));
71
+ return;
72
+ case "message":
73
+ case "tool_progress":
74
+ case "turn_start":
75
+ case "idle":
76
+ case "queue":
77
+ case "context":
78
+ case "subagent":
79
+ return;
80
+ case "question":
81
+ return this.#line(chalk.yellow(`? ${event.question.prompt}`));
82
+ case "approval":
83
+ return this.#line(chalk.yellow(`approve? ${event.request.summary}`));
84
+ case "notice":
85
+ return this.#line(CodeAgentStreamPrinter2.#notice(event.level, event.message));
86
+ case "error":
87
+ return this.#line(chalk.red(`error: ${event.message}`));
88
+ default:
89
+ return this.#line(chalk.dim(codeAgentEventLabel(event)));
90
+ }
91
+ }
92
+ finish() {
93
+ if (this.#streaming)
94
+ this.#write(`
95
+ `);
96
+ this.#streaming = false;
97
+ }
98
+ #line(text) {
99
+ if (this.#streaming)
100
+ this.#write(`
101
+ `);
102
+ this.#streaming = false;
103
+ this.#write(`${text}
104
+ `);
105
+ }
106
+ static #toolEnd(event) {
107
+ if (event.outcome === "ok")
108
+ return chalk.green(`\u2713 ${event.tool.title}`);
109
+ if (event.outcome === "blocked")
110
+ return chalk.yellow(`\u29B8 ${event.tool.title} \u2014 ${event.output}`);
111
+ return chalk.red(`\u2717 ${event.tool.title} \u2014 ${event.output.split(`
112
+ `)[0] ?? ""}`);
113
+ }
114
+ static #notice(level, message) {
115
+ if (level === "error")
116
+ return chalk.red(message);
117
+ if (level === "warning")
118
+ return chalk.yellow(message);
119
+ return chalk.dim(message);
120
+ }
121
+ }
122
+
123
+ export { akanCodeDefaultModel2, akanCodeModel2, akanCodeModelSupportsImages2, akanCodeModelWarnings2, CodeAgentStreamPrinter2 };
@@ -0,0 +1,99 @@
1
+ // @bun
2
+ // pkgs/@akanjs/devkit/codeAgent/agent/CodeAgentRpcHost.ts
3
+ class CodeAgentRpcHost2 {
4
+ #agent;
5
+ #write;
6
+ #buffer = "";
7
+ #started = false;
8
+ #resolveShutdown = () => {};
9
+ shutdown = new Promise((resolve) => {
10
+ this.#resolveShutdown = resolve;
11
+ });
12
+ constructor(agent, write = (line) => process.stdout.write(line)) {
13
+ this.#agent = agent;
14
+ this.#write = write;
15
+ }
16
+ async serve(input = process.stdin) {
17
+ this.start();
18
+ const decoder = new TextDecoder;
19
+ for await (const chunk of input)
20
+ await this.feed(decoder.decode(chunk, { stream: true }));
21
+ await this.#agent.abort().catch(() => {});
22
+ }
23
+ start() {
24
+ if (this.#started)
25
+ return;
26
+ this.#started = true;
27
+ this.#agent.on((event) => this.#emit(event));
28
+ this.#agent.announce();
29
+ }
30
+ attach(write) {
31
+ this.#write = write;
32
+ this.#buffer = "";
33
+ }
34
+ async feed(text) {
35
+ this.#buffer += text;
36
+ let index = this.#buffer.indexOf(`
37
+ `);
38
+ while (index >= 0) {
39
+ const line = this.#buffer.slice(0, index).trim();
40
+ this.#buffer = this.#buffer.slice(index + 1);
41
+ if (line)
42
+ await this.#handle(line);
43
+ index = this.#buffer.indexOf(`
44
+ `);
45
+ }
46
+ }
47
+ async#handle(line) {
48
+ let request;
49
+ try {
50
+ request = JSON.parse(line);
51
+ } catch {
52
+ return this.#emit({ type: "error", message: "malformed command frame", fatal: false, seq: -1 });
53
+ }
54
+ try {
55
+ this.#reply({ type: "reply", id: request.id, ok: true, data: await this.#run(request.command) });
56
+ } catch (error) {
57
+ this.#reply({ type: "reply", id: request.id, ok: false, error: String(error) });
58
+ }
59
+ if (request.command?.type === "shutdown")
60
+ this.#resolveShutdown();
61
+ }
62
+ async#run(command) {
63
+ switch (command.type) {
64
+ case "prompt":
65
+ this.#agent.prompt(command.message, command.images);
66
+ return { accepted: true };
67
+ case "answer":
68
+ return { handled: await this.#agent.answer(command.questionId, command.answer) };
69
+ case "approve":
70
+ return { handled: await this.#agent.approve(command.approvalId, command.approved) };
71
+ case "abort":
72
+ await this.#agent.abort();
73
+ return { aborted: true };
74
+ case "compact":
75
+ await this.#agent.compact(command.instructions);
76
+ return { compacted: true };
77
+ case "set_model":
78
+ await this.#agent.setModel({ provider: command.provider, id: command.modelId });
79
+ return await this.#agent.state();
80
+ case "get_state":
81
+ return await this.#agent.state(command.sinceSeq === undefined ? {} : { sinceSeq: command.sinceSeq });
82
+ case "shutdown":
83
+ this.#agent.dispose();
84
+ return { shutdown: true };
85
+ default:
86
+ throw new Error(`Unsupported command: ${command.type}`);
87
+ }
88
+ }
89
+ #emit(event) {
90
+ this.#write?.(`${JSON.stringify({ type: "event", event })}
91
+ `);
92
+ }
93
+ #reply(reply) {
94
+ this.#write?.(`${JSON.stringify(reply)}
95
+ `);
96
+ }
97
+ }
98
+
99
+ export { CodeAgentRpcHost2 };