@agimon-ai/po-ui 0.0.0-alpha.2 → 0.0.0-alpha.4

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 (84) hide show
  1. package/dist/config.d.mts +2 -2
  2. package/dist/config.mjs +1 -2
  3. package/dist/extensionName.cjs +66 -16
  4. package/dist/extensionName.cjs.map +1 -1
  5. package/dist/extensionName.d.mts +13 -1
  6. package/dist/extensionName.d.mts.map +1 -1
  7. package/dist/extensionName.mjs +64 -16
  8. package/dist/extensionName.mjs.map +1 -1
  9. package/dist/extensions/mcp-ui.mjs.map +1 -1
  10. package/dist/extensions/mcp.cjs +3 -3
  11. package/dist/extensions/mcp.cjs.map +1 -1
  12. package/dist/extensions/mcp.d.mts +1 -1
  13. package/dist/extensions/mcp.mjs +4 -4
  14. package/dist/extensions/mcp.mjs.map +1 -1
  15. package/dist/extensions/server.cjs +3 -3
  16. package/dist/extensions/server.cjs.map +1 -1
  17. package/dist/extensions/server.d.mts +1 -1
  18. package/dist/extensions/server.mjs +4 -4
  19. package/dist/extensions/server.mjs.map +1 -1
  20. package/dist/extensions/web.mjs +11 -11
  21. package/dist/extensions/web.mjs.map +1 -1
  22. package/dist/footer.d.mts +2 -2
  23. package/dist/footer.mjs +1 -2
  24. package/dist/{harnessMetadata-Dw9Rb1nW.cjs → harnessMetadata-B3mBGrS3.cjs} +4 -4
  25. package/dist/harnessMetadata-B3mBGrS3.cjs.map +1 -0
  26. package/dist/{harnessMetadata-CzsdGAxL.d.mts → harnessMetadata-BzMgOB0W.d.mts} +4 -4
  27. package/dist/harnessMetadata-BzMgOB0W.d.mts.map +1 -0
  28. package/dist/{harnessMetadata-DkMSJutN.mjs → harnessMetadata-Ccv_j7WP.mjs} +3 -3
  29. package/dist/harnessMetadata-Ccv_j7WP.mjs.map +1 -0
  30. package/dist/harnessMetadata.cjs +2 -2
  31. package/dist/harnessMetadata.d.mts +2 -2
  32. package/dist/harnessMetadata.mjs +1 -2
  33. package/dist/{index-Bx49wmE7.d.mts → index-2GW2dj0I.d.mts} +9 -9
  34. package/dist/{index-Bx49wmE7.d.mts.map → index-2GW2dj0I.d.mts.map} +1 -1
  35. package/dist/{index-Dpzvl-vg.d.mts → index-DFSkSBBh.d.mts} +19 -11
  36. package/dist/index-DFSkSBBh.d.mts.map +1 -0
  37. package/dist/index.cjs +6 -6
  38. package/dist/index.d.mts +8 -8
  39. package/dist/index.mjs +5 -5
  40. package/dist/leader.d.mts +2 -2
  41. package/dist/leaderRegistry.cjs +2 -2
  42. package/dist/leaderRegistry.cjs.map +1 -1
  43. package/dist/leaderRegistry.d.mts +15 -15
  44. package/dist/leaderRegistry.d.mts.map +1 -1
  45. package/dist/leaderRegistry.mjs +2 -2
  46. package/dist/leaderRegistry.mjs.map +1 -1
  47. package/dist/logSinkTelemetry.cjs +1 -1
  48. package/dist/logSinkTelemetry.d.mts +1 -1
  49. package/dist/logSinkTelemetry.mjs +1 -2
  50. package/dist/skills.cjs +8 -8
  51. package/dist/skills.d.mts +2 -2
  52. package/dist/skills.mjs +1 -2
  53. package/dist/{telemetry-DMR6cIT1.cjs → telemetry-EXlQc9s0.cjs} +8 -8
  54. package/dist/telemetry-EXlQc9s0.cjs.map +1 -0
  55. package/dist/{telemetry--EgKB9ei.mjs → telemetry-RiFqd0cg.mjs} +9 -9
  56. package/dist/telemetry-RiFqd0cg.mjs.map +1 -0
  57. package/dist/{theme-Byj_dBlT.mjs → theme-BX_hfErv.mjs} +60 -40
  58. package/dist/theme-BX_hfErv.mjs.map +1 -0
  59. package/dist/{theme-2wveit5V.cjs → theme-BfC_GGQ4.cjs} +66 -40
  60. package/dist/theme-BfC_GGQ4.cjs.map +1 -0
  61. package/dist/theme.cjs +2 -1
  62. package/dist/theme.d.mts +2 -2
  63. package/dist/theme.mjs +1 -2
  64. package/dist/toolInventory.mjs +1 -2
  65. package/dist/{uiState-G_Pso-5i.mjs → uiState-C7I5WcMl.mjs} +3 -3
  66. package/dist/uiState-C7I5WcMl.mjs.map +1 -0
  67. package/dist/{uiState-rUwgKslb.cjs → uiState-CCytmxyX.cjs} +4 -4
  68. package/dist/uiState-CCytmxyX.cjs.map +1 -0
  69. package/dist/{uiState-Binu4nUb.d.mts → uiState-DbjaVyxl.d.mts} +3 -3
  70. package/dist/{uiState-Binu4nUb.d.mts.map → uiState-DbjaVyxl.d.mts.map} +1 -1
  71. package/dist/uiState.cjs +2 -2
  72. package/dist/uiState.d.mts +2 -2
  73. package/dist/uiState.mjs +1 -2
  74. package/package.json +15 -15
  75. package/dist/harnessMetadata-CzsdGAxL.d.mts.map +0 -1
  76. package/dist/harnessMetadata-DkMSJutN.mjs.map +0 -1
  77. package/dist/harnessMetadata-Dw9Rb1nW.cjs.map +0 -1
  78. package/dist/index-Dpzvl-vg.d.mts.map +0 -1
  79. package/dist/telemetry--EgKB9ei.mjs.map +0 -1
  80. package/dist/telemetry-DMR6cIT1.cjs.map +0 -1
  81. package/dist/theme-2wveit5V.cjs.map +0 -1
  82. package/dist/theme-Byj_dBlT.mjs.map +0 -1
  83. package/dist/uiState-G_Pso-5i.mjs.map +0 -1
  84. package/dist/uiState-rUwgKslb.cjs.map +0 -1
package/dist/config.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { CONFIG_ACTION, ConfigAction, ConfigActionSchema, ConfigChoice, ConfigChoiceSchema, ConfigField, ConfigFieldKind, ConfigFieldKindSchema, ConfigFieldSchema, ConfigProgress, ConfigProgressSchema, ConfigSection, ConfigSectionSchema, ConfigSnapshot, ConfigSourceRef, ConfigSourceSchema, ConfigStatus, ConfigStatusSchema, ConfigStep, ConfigStepSchema, DoomConfigActionInput, DoomConfigContributionHandle, DoomConfigContributionOptions, DoomConfigInvocation, DoomConfigSectionView, DoomExtensionContext } from "@agimon-ai/po-core/config";
2
- export { CONFIG_ACTION, type ConfigAction, ConfigActionSchema, type ConfigChoice, ConfigChoiceSchema, type ConfigField, type ConfigFieldKind, ConfigFieldKindSchema, ConfigFieldSchema, type ConfigProgress, ConfigProgressSchema, type ConfigSection, ConfigSectionSchema, type ConfigSnapshot, type ConfigSourceRef, ConfigSourceSchema, type ConfigStatus, ConfigStatusSchema, type ConfigStep, ConfigStepSchema, type DoomConfigActionInput, type DoomConfigContributionHandle, type DoomConfigContributionOptions, type DoomConfigInvocation, type DoomConfigSectionView, type DoomExtensionContext };
1
+ import { CONFIG_ACTION, ConfigAction, ConfigActionSchema, ConfigChoice, ConfigChoiceSchema, ConfigField, ConfigFieldKind, ConfigFieldKindSchema, ConfigFieldSchema, ConfigProgress, ConfigProgressSchema, ConfigSection, ConfigSectionSchema, ConfigSnapshot, ConfigSourceRef, ConfigSourceSchema, ConfigStatus, ConfigStatusSchema, ConfigStep, ConfigStepSchema, PoConfigActionInput, PoConfigContributionHandle, PoConfigContributionOptions, PoConfigInvocation, PoConfigSectionView, PoExtensionContext } from "@agimon-ai/po-core/config";
2
+ export { CONFIG_ACTION, type ConfigAction, ConfigActionSchema, type ConfigChoice, ConfigChoiceSchema, type ConfigField, type ConfigFieldKind, ConfigFieldKindSchema, ConfigFieldSchema, type ConfigProgress, ConfigProgressSchema, type ConfigSection, ConfigSectionSchema, type ConfigSnapshot, type ConfigSourceRef, ConfigSourceSchema, type ConfigStatus, ConfigStatusSchema, type ConfigStep, ConfigStepSchema, type PoConfigActionInput, type PoConfigContributionHandle, type PoConfigContributionOptions, type PoConfigInvocation, type PoConfigSectionView, type PoExtensionContext };
package/dist/config.mjs CHANGED
@@ -1,2 +1 @@
1
- import { CONFIG_ACTION, ConfigActionSchema, ConfigChoiceSchema, ConfigFieldKindSchema, ConfigFieldSchema, ConfigProgressSchema, ConfigSectionSchema, ConfigSourceSchema, ConfigStatusSchema, ConfigStepSchema } from "@agimon-ai/po-core/config";
2
- export { CONFIG_ACTION, ConfigActionSchema, ConfigChoiceSchema, ConfigFieldKindSchema, ConfigFieldSchema, ConfigProgressSchema, ConfigSectionSchema, ConfigSourceSchema, ConfigStatusSchema, ConfigStepSchema };
1
+ export { CONFIG_ACTION, ConfigActionSchema, ConfigChoiceSchema, ConfigFieldKindSchema, ConfigFieldSchema, ConfigProgressSchema, ConfigSectionSchema, ConfigSourceSchema, ConfigStatusSchema, ConfigStepSchema } from "@agimon-ai/po-core/config";
@@ -1,10 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("./rolldown-runtime-VH7oDXx4.cjs");
3
- let node_fs = require("node:fs");
4
- node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
5
3
  let node_path = require("node:path");
6
4
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
7
- //#region src/services/extensionSource/index.ts
5
+ let node_fs = require("node:fs");
6
+ node_fs = require_rolldown_runtime.__toESM(node_fs, 1);
7
+ //#region src/services/extensionSource/packageName.ts
8
8
  /**
9
9
  * Display name for an extension that Pi could not attribute to a package.
10
10
  *
@@ -14,26 +14,47 @@ node_path = require_rolldown_runtime.__toESM(node_path, 1);
14
14
  * package that registered the tools.
15
15
  */
16
16
  /** Results are stable for the life of a session, and every source hits the same few dirs. */
17
- const cache = /* @__PURE__ */ new Map();
17
+ const nameCache = /* @__PURE__ */ new Map();
18
18
  const packageCache = /* @__PURE__ */ new Map();
19
+ const MANIFEST_FILE = "package.json";
20
+ /** The manifest's non-empty name; undefined for a malformed or nameless manifest. */
21
+ function manifestPackageName(text) {
22
+ try {
23
+ const manifest = JSON.parse(text);
24
+ return typeof manifest.name === "string" && manifest.name.length > 0 ? manifest.name : void 0;
25
+ } catch {
26
+ return;
27
+ }
28
+ }
29
+ /** The next directory to search, or undefined at the filesystem root. */
30
+ function parentDirectory(directory) {
31
+ const parent = node_path.default.dirname(directory);
32
+ return parent === directory ? void 0 : parent;
33
+ }
34
+ /** `@agimon-ai/po-task` reads as `po-task`; the scope is noise in a tree. */
35
+ function displayExtensionName(name, entryPath) {
36
+ return name ? name.split("/").pop() ?? name : node_path.default.basename(entryPath, node_path.default.extname(entryPath));
37
+ }
38
+ //#endregion
39
+ //#region src/services/extensionSource/sync.ts
19
40
  function packageName(directory) {
20
- let current = directory;
21
- for (;;) {
41
+ for (let current = directory; current !== void 0; current = parentDirectory(current)) {
42
+ let text;
22
43
  try {
23
- const manifest = JSON.parse(node_fs.default.readFileSync(node_path.default.join(current, "package.json"), "utf8"));
24
- if (typeof manifest.name === "string" && manifest.name.length > 0) return manifest.name;
25
- } catch {}
26
- const parent = node_path.default.dirname(current);
27
- if (parent === current) return void 0;
28
- current = parent;
44
+ text = node_fs.default.readFileSync(node_path.default.join(current, MANIFEST_FILE), "utf8");
45
+ } catch {
46
+ continue;
47
+ }
48
+ const name = manifestPackageName(text);
49
+ if (name) return name;
29
50
  }
30
51
  }
52
+ /** @deprecated Node-only sync shim; use readExtensionName. Removed in M2. */
31
53
  function extensionName(entryPath) {
32
- const cached = cache.get(entryPath);
54
+ const cached = nameCache.get(entryPath);
33
55
  if (cached !== void 0) return cached;
34
- const name = packageName(node_path.default.dirname(entryPath));
35
- const resolved = name ? name.split("/").pop() ?? name : node_path.default.basename(entryPath, node_path.default.extname(entryPath));
36
- cache.set(entryPath, resolved);
56
+ const resolved = displayExtensionName(packageName(node_path.default.dirname(entryPath)), entryPath);
57
+ nameCache.set(entryPath, resolved);
37
58
  return resolved;
38
59
  }
39
60
  /**
@@ -44,6 +65,8 @@ function extensionName(entryPath) {
44
65
  * `@agimon-ai/po-team`, so joining a registered tool back to the layer that
45
66
  * admitted it needs the unshortened name. Attribution and display are different
46
67
  * jobs, so they get different functions rather than one lossy one.
68
+ *
69
+ * @deprecated Node-only sync shim; use readExtensionPackageName. Removed in M2.
47
70
  */
48
71
  function extensionPackageName(entryPath) {
49
72
  const cached = packageCache.get(entryPath);
@@ -53,7 +76,34 @@ function extensionPackageName(entryPath) {
53
76
  return name;
54
77
  }
55
78
  //#endregion
79
+ //#region src/services/extensionSource/index.ts
80
+ async function readPackageName(fs, directory, context) {
81
+ for (let current = directory; current !== void 0; current = parentDirectory(current)) {
82
+ const text = await fs.readTextFile(node_path.default.join(current, MANIFEST_FILE), context);
83
+ const name = text.ok ? manifestPackageName(text.value) : void 0;
84
+ if (name) return name;
85
+ }
86
+ }
87
+ /** Display name of the package that owns an extension entry, read through `fs`. */
88
+ async function readExtensionName(fs, entryPath, context) {
89
+ const cached = nameCache.get(entryPath);
90
+ if (cached !== void 0) return cached;
91
+ const resolved = displayExtensionName(await readPackageName(fs, node_path.default.dirname(entryPath), context), entryPath);
92
+ nameCache.set(entryPath, resolved);
93
+ return resolved;
94
+ }
95
+ /** The owning package name with its scope, read through `fs`; see `extensionPackageName`. */
96
+ async function readExtensionPackageName(fs, entryPath, context) {
97
+ const cached = packageCache.get(entryPath);
98
+ if (cached !== void 0) return cached.name;
99
+ const name = await readPackageName(fs, node_path.default.dirname(entryPath), context);
100
+ packageCache.set(entryPath, { name });
101
+ return name;
102
+ }
103
+ //#endregion
56
104
  exports.extensionName = extensionName;
57
105
  exports.extensionPackageName = extensionPackageName;
106
+ exports.readExtensionName = readExtensionName;
107
+ exports.readExtensionPackageName = readExtensionPackageName;
58
108
 
59
109
  //# sourceMappingURL=extensionName.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensionName.cjs","names":["fs","path"],"sources":["../src/services/extensionSource/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Display name for an extension that Pi could not attribute to a package.\n *\n * Pi stamps every `--extension <path>` argument with the literal source `cli`,\n * and po launches all of its extensions that way, so the only surviving\n * identity is the entry path. The nearest `package.json` above it names the\n * package that registered the tools.\n */\n\n/** Results are stable for the life of a session, and every source hits the same few dirs. */\nconst cache = new Map<string, string>();\n// Wrapped, because \"no package above this path\" is a real answer worth caching\n// and a bare undefined cannot be told apart from a miss.\nconst packageCache = new Map<string, { readonly name: string | undefined }>();\nfunction packageName(directory: string): string | undefined {\n let current = directory;\n for (;;) {\n try {\n const manifest = JSON.parse(fs.readFileSync(path.join(current, 'package.json'), 'utf8')) as { name?: unknown };\n if (typeof manifest.name === 'string' && manifest.name.length > 0) return manifest.name;\n } catch {\n // No manifest here, or an unreadable one; keep walking up.\n }\n const parent = path.dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\nexport function extensionName(entryPath: string): string {\n const cached = cache.get(entryPath);\n if (cached !== undefined) return cached;\n const name = packageName(path.dirname(entryPath));\n // `@agimon-ai/po-task` reads as `doom-task`; the scope is noise in a tree.\n const resolved = name ? (name.split('/').pop() ?? name) : path.basename(entryPath, path.extname(entryPath));\n cache.set(entryPath, resolved);\n return resolved;\n}\n\n/**\n * The package name exactly as a manifest spells it, scope and all.\n *\n * `extensionName` drops the scope because a tree reads better without it, but\n * that makes it useless as a key: `.po/modes.yaml` names packages as\n * `@agimon-ai/po-team`, so joining a registered tool back to the layer that\n * admitted it needs the unshortened name. Attribution and display are different\n * jobs, so they get different functions rather than one lossy one.\n */\nexport function extensionPackageName(entryPath: string): string | undefined {\n const cached = packageCache.get(entryPath);\n if (cached !== undefined) return cached.name;\n const name = packageName(path.dirname(entryPath));\n packageCache.set(entryPath, { name });\n return name;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAaA,MAAM,wBAAQ,IAAI,IAAoB;AAGtC,MAAM,+BAAe,IAAI,IAAmD;AAC5E,SAAS,YAAY,WAAuC;CAC1D,IAAI,UAAU;CACd,SAAS;EACP,IAAI;GACF,MAAM,WAAW,KAAK,MAAMA,QAAAA,QAAG,aAAaC,UAAAA,QAAK,KAAK,SAAS,cAAc,GAAG,MAAM,CAAC;GACvF,IAAI,OAAO,SAAS,SAAS,YAAY,SAAS,KAAK,SAAS,GAAG,OAAO,SAAS;EACrF,QAAQ,CAER;EACA,MAAM,SAASA,UAAAA,QAAK,QAAQ,OAAO;EACnC,IAAI,WAAW,SAAS,OAAO,KAAA;EAC/B,UAAU;CACZ;AACF;AAEA,SAAgB,cAAc,WAA2B;CACvD,MAAM,SAAS,MAAM,IAAI,SAAS;CAClC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,OAAO,YAAYA,UAAAA,QAAK,QAAQ,SAAS,CAAC;CAEhD,MAAM,WAAW,OAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAAQA,UAAAA,QAAK,SAAS,WAAWA,UAAAA,QAAK,QAAQ,SAAS,CAAC;CAC1G,MAAM,IAAI,WAAW,QAAQ;CAC7B,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,qBAAqB,WAAuC;CAC1E,MAAM,SAAS,aAAa,IAAI,SAAS;CACzC,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO;CACxC,MAAM,OAAO,YAAYA,UAAAA,QAAK,QAAQ,SAAS,CAAC;CAChD,aAAa,IAAI,WAAW,EAAE,KAAK,CAAC;CACpC,OAAO;AACT"}
1
+ {"version":3,"file":"extensionName.cjs","names":["path","fs","path","path"],"sources":["../src/services/extensionSource/packageName.ts","../src/services/extensionSource/sync.ts","../src/services/extensionSource/index.ts"],"sourcesContent":["import path from 'node:path';\n\n/**\n * Display name for an extension that Pi could not attribute to a package.\n *\n * Pi stamps every `--extension <path>` argument with the literal source `cli`,\n * and po launches all of its extensions that way, so the only surviving\n * identity is the entry path. The nearest `package.json` above it names the\n * package that registered the tools.\n */\n\n/** Results are stable for the life of a session, and every source hits the same few dirs. */\nexport const nameCache = new Map<string, string>();\n// Wrapped, because \"no package above this path\" is a real answer worth caching\n// and a bare undefined cannot be told apart from a miss.\nexport const packageCache = new Map<string, { readonly name: string | undefined }>();\n\nexport const MANIFEST_FILE = 'package.json';\n\n/** The manifest's non-empty name; undefined for a malformed or nameless manifest. */\nexport function manifestPackageName(text: string): string | undefined {\n try {\n const manifest = JSON.parse(text) as { name?: unknown };\n return typeof manifest.name === 'string' && manifest.name.length > 0 ? manifest.name : undefined;\n } catch {\n // An unreadable manifest names nothing; keep walking up.\n return undefined;\n }\n}\n\n/** The next directory to search, or undefined at the filesystem root. */\nexport function parentDirectory(directory: string): string | undefined {\n const parent = path.dirname(directory);\n return parent === directory ? undefined : parent;\n}\n\n/** `@agimon-ai/po-task` reads as `po-task`; the scope is noise in a tree. */\nexport function displayExtensionName(name: string | undefined, entryPath: string): string {\n return name ? (name.split('/').pop() ?? name) : path.basename(entryPath, path.extname(entryPath));\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport {\n MANIFEST_FILE,\n displayExtensionName,\n manifestPackageName,\n nameCache,\n packageCache,\n parentDirectory,\n} from './packageName';\n\nfunction packageName(directory: string): string | undefined {\n for (let current: string | undefined = directory; current !== undefined; current = parentDirectory(current)) {\n let text: string;\n try {\n text = fs.readFileSync(path.join(current, MANIFEST_FILE), 'utf8');\n } catch {\n // No manifest here; keep walking up.\n continue;\n }\n const name = manifestPackageName(text);\n if (name) return name;\n }\n return undefined;\n}\n\n/** @deprecated Node-only sync shim; use readExtensionName. Removed in M2. */\nexport function extensionName(entryPath: string): string {\n const cached = nameCache.get(entryPath);\n if (cached !== undefined) return cached;\n const resolved = displayExtensionName(packageName(path.dirname(entryPath)), entryPath);\n nameCache.set(entryPath, resolved);\n return resolved;\n}\n\n/**\n * The package name exactly as a manifest spells it, scope and all.\n *\n * `extensionName` drops the scope because a tree reads better without it, but\n * that makes it useless as a key: `.po/modes.yaml` names packages as\n * `@agimon-ai/po-team`, so joining a registered tool back to the layer that\n * admitted it needs the unshortened name. Attribution and display are different\n * jobs, so they get different functions rather than one lossy one.\n *\n * @deprecated Node-only sync shim; use readExtensionPackageName. Removed in M2.\n */\nexport function extensionPackageName(entryPath: string): string | undefined {\n const cached = packageCache.get(entryPath);\n if (cached !== undefined) return cached.name;\n const name = packageName(path.dirname(entryPath));\n packageCache.set(entryPath, { name });\n return name;\n}\n","import path from 'node:path';\n\nimport type { FileSystem } from '@agimon-ai/po-core/platform';\n\nimport {\n MANIFEST_FILE,\n displayExtensionName,\n manifestPackageName,\n nameCache,\n packageCache,\n parentDirectory,\n} from './packageName';\n\nexport { extensionName, extensionPackageName } from './sync';\n\ntype IoContext = Parameters<FileSystem['readTextFile']>[1];\n\nasync function readPackageName(fs: FileSystem, directory: string, context: IoContext): Promise<string | undefined> {\n for (let current: string | undefined = directory; current !== undefined; current = parentDirectory(current)) {\n const text = await fs.readTextFile(path.join(current, MANIFEST_FILE), context);\n // No readable manifest here; keep walking up.\n const name = text.ok ? manifestPackageName(text.value) : undefined;\n if (name) return name;\n }\n return undefined;\n}\n\n/** Display name of the package that owns an extension entry, read through `fs`. */\nexport async function readExtensionName(fs: FileSystem, entryPath: string, context: IoContext): Promise<string> {\n const cached = nameCache.get(entryPath);\n if (cached !== undefined) return cached;\n const resolved = displayExtensionName(await readPackageName(fs, path.dirname(entryPath), context), entryPath);\n nameCache.set(entryPath, resolved);\n return resolved;\n}\n\n/** The owning package name with its scope, read through `fs`; see `extensionPackageName`. */\nexport async function readExtensionPackageName(\n fs: FileSystem,\n entryPath: string,\n context: IoContext,\n): Promise<string | undefined> {\n const cached = packageCache.get(entryPath);\n if (cached !== undefined) return cached.name;\n const name = await readPackageName(fs, path.dirname(entryPath), context);\n packageCache.set(entryPath, { name });\n return name;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAYA,MAAa,4BAAY,IAAI,IAAoB;AAGjD,MAAa,+BAAe,IAAI,IAAmD;AAEnF,MAAa,gBAAgB;;AAG7B,SAAgB,oBAAoB,MAAkC;CACpE,IAAI;EACF,MAAM,WAAW,KAAK,MAAM,IAAI;EAChC,OAAO,OAAO,SAAS,SAAS,YAAY,SAAS,KAAK,SAAS,IAAI,SAAS,OAAO,KAAA;CACzF,QAAQ;EAEN;CACF;AACF;;AAGA,SAAgB,gBAAgB,WAAuC;CACrE,MAAM,SAASA,UAAAA,QAAK,QAAQ,SAAS;CACrC,OAAO,WAAW,YAAY,KAAA,IAAY;AAC5C;;AAGA,SAAgB,qBAAqB,MAA0B,WAA2B;CACxF,OAAO,OAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAAQA,UAAAA,QAAK,SAAS,WAAWA,UAAAA,QAAK,QAAQ,SAAS,CAAC;AAClG;;;AC3BA,SAAS,YAAY,WAAuC;CAC1D,KAAK,IAAI,UAA8B,WAAW,YAAY,KAAA,GAAW,UAAU,gBAAgB,OAAO,GAAG;EAC3G,IAAI;EACJ,IAAI;GACF,OAAOC,QAAAA,QAAG,aAAaC,UAAAA,QAAK,KAAK,SAAS,aAAa,GAAG,MAAM;EAClE,QAAQ;GAEN;EACF;EACA,MAAM,OAAO,oBAAoB,IAAI;EACrC,IAAI,MAAM,OAAO;CACnB;AAEF;;AAGA,SAAgB,cAAc,WAA2B;CACvD,MAAM,SAAS,UAAU,IAAI,SAAS;CACtC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,WAAW,qBAAqB,YAAYA,UAAAA,QAAK,QAAQ,SAAS,CAAC,GAAG,SAAS;CACrF,UAAU,IAAI,WAAW,QAAQ;CACjC,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,qBAAqB,WAAuC;CAC1E,MAAM,SAAS,aAAa,IAAI,SAAS;CACzC,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO;CACxC,MAAM,OAAO,YAAYA,UAAAA,QAAK,QAAQ,SAAS,CAAC;CAChD,aAAa,IAAI,WAAW,EAAE,KAAK,CAAC;CACpC,OAAO;AACT;;;ACpCA,eAAe,gBAAgB,IAAgB,WAAmB,SAAiD;CACjH,KAAK,IAAI,UAA8B,WAAW,YAAY,KAAA,GAAW,UAAU,gBAAgB,OAAO,GAAG;EAC3G,MAAM,OAAO,MAAM,GAAG,aAAaC,UAAAA,QAAK,KAAK,SAAS,aAAa,GAAG,OAAO;EAE7E,MAAM,OAAO,KAAK,KAAK,oBAAoB,KAAK,KAAK,IAAI,KAAA;EACzD,IAAI,MAAM,OAAO;CACnB;AAEF;;AAGA,eAAsB,kBAAkB,IAAgB,WAAmB,SAAqC;CAC9G,MAAM,SAAS,UAAU,IAAI,SAAS;CACtC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,WAAW,qBAAqB,MAAM,gBAAgB,IAAIA,UAAAA,QAAK,QAAQ,SAAS,GAAG,OAAO,GAAG,SAAS;CAC5G,UAAU,IAAI,WAAW,QAAQ;CACjC,OAAO;AACT;;AAGA,eAAsB,yBACpB,IACA,WACA,SAC6B;CAC7B,MAAM,SAAS,aAAa,IAAI,SAAS;CACzC,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO;CACxC,MAAM,OAAO,MAAM,gBAAgB,IAAIA,UAAAA,QAAK,QAAQ,SAAS,GAAG,OAAO;CACvE,aAAa,IAAI,WAAW,EAAE,KAAK,CAAC;CACpC,OAAO;AACT"}
@@ -1,4 +1,6 @@
1
- //#region src/services/extensionSource/index.d.ts
1
+ import { FileSystem } from "@agimon-ai/po-core/platform";
2
+ //#region src/services/extensionSource/sync.d.ts
3
+ /** @deprecated Node-only sync shim; use readExtensionName. Removed in M2. */
2
4
  export declare function extensionName(entryPath: string): string;
3
5
  /**
4
6
  * The package name exactly as a manifest spells it, scope and all.
@@ -8,7 +10,17 @@ export declare function extensionName(entryPath: string): string;
8
10
  * `@agimon-ai/po-team`, so joining a registered tool back to the layer that
9
11
  * admitted it needs the unshortened name. Attribution and display are different
10
12
  * jobs, so they get different functions rather than one lossy one.
13
+ *
14
+ * @deprecated Node-only sync shim; use readExtensionPackageName. Removed in M2.
11
15
  */
12
16
  export declare function extensionPackageName(entryPath: string): string | undefined;
13
17
  //#endregion
18
+ //#region src/services/extensionSource/index.d.ts
19
+ type IoContext = Parameters<FileSystem['readTextFile']>[1];
20
+ /** Display name of the package that owns an extension entry, read through `fs`. */
21
+ export declare function readExtensionName(fs: FileSystem, entryPath: string, context: IoContext): Promise<string>;
22
+ /** The owning package name with its scope, read through `fs`; see `extensionPackageName`. */
23
+ export declare function readExtensionPackageName(fs: FileSystem, entryPath: string, context: IoContext): Promise<string | undefined>;
24
+ //#endregion
25
+ export {};
14
26
  //# sourceMappingURL=extensionName.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensionName.d.mts","names":[],"sources":["../src/services/extensionSource/index.ts"],"mappings":";wBAgCgB,cAAc;;;;;;;;;;wBAmBd,qBAAqB"}
1
+ {"version":3,"file":"extensionName.d.mts","names":[],"sources":["../src/services/extensionSource/sync.ts","../src/services/extensionSource/index.ts"],"mappings":";;;wBA4BgB,cAAc;;;;;;;;;;;;wBAmBd,qBAAqB;;;KChChC,YAAY,WAAW;;wBAaN,kBAAkB,IAAI,YAAY,mBAAmB,SAAS,YAAY;;wBAS1E,yBACpB,IAAI,YACJ,mBACA,SAAS,YACR"}
@@ -1,6 +1,6 @@
1
- import fs from "node:fs";
2
1
  import path from "node:path";
3
- //#region src/services/extensionSource/index.ts
2
+ import fs from "node:fs";
3
+ //#region src/services/extensionSource/packageName.ts
4
4
  /**
5
5
  * Display name for an extension that Pi could not attribute to a package.
6
6
  *
@@ -10,26 +10,47 @@ import path from "node:path";
10
10
  * package that registered the tools.
11
11
  */
12
12
  /** Results are stable for the life of a session, and every source hits the same few dirs. */
13
- const cache = /* @__PURE__ */ new Map();
13
+ const nameCache = /* @__PURE__ */ new Map();
14
14
  const packageCache = /* @__PURE__ */ new Map();
15
+ const MANIFEST_FILE = "package.json";
16
+ /** The manifest's non-empty name; undefined for a malformed or nameless manifest. */
17
+ function manifestPackageName(text) {
18
+ try {
19
+ const manifest = JSON.parse(text);
20
+ return typeof manifest.name === "string" && manifest.name.length > 0 ? manifest.name : void 0;
21
+ } catch {
22
+ return;
23
+ }
24
+ }
25
+ /** The next directory to search, or undefined at the filesystem root. */
26
+ function parentDirectory(directory) {
27
+ const parent = path.dirname(directory);
28
+ return parent === directory ? void 0 : parent;
29
+ }
30
+ /** `@agimon-ai/po-task` reads as `po-task`; the scope is noise in a tree. */
31
+ function displayExtensionName(name, entryPath) {
32
+ return name ? name.split("/").pop() ?? name : path.basename(entryPath, path.extname(entryPath));
33
+ }
34
+ //#endregion
35
+ //#region src/services/extensionSource/sync.ts
15
36
  function packageName(directory) {
16
- let current = directory;
17
- for (;;) {
37
+ for (let current = directory; current !== void 0; current = parentDirectory(current)) {
38
+ let text;
18
39
  try {
19
- const manifest = JSON.parse(fs.readFileSync(path.join(current, "package.json"), "utf8"));
20
- if (typeof manifest.name === "string" && manifest.name.length > 0) return manifest.name;
21
- } catch {}
22
- const parent = path.dirname(current);
23
- if (parent === current) return void 0;
24
- current = parent;
40
+ text = fs.readFileSync(path.join(current, MANIFEST_FILE), "utf8");
41
+ } catch {
42
+ continue;
43
+ }
44
+ const name = manifestPackageName(text);
45
+ if (name) return name;
25
46
  }
26
47
  }
48
+ /** @deprecated Node-only sync shim; use readExtensionName. Removed in M2. */
27
49
  function extensionName(entryPath) {
28
- const cached = cache.get(entryPath);
50
+ const cached = nameCache.get(entryPath);
29
51
  if (cached !== void 0) return cached;
30
- const name = packageName(path.dirname(entryPath));
31
- const resolved = name ? name.split("/").pop() ?? name : path.basename(entryPath, path.extname(entryPath));
32
- cache.set(entryPath, resolved);
52
+ const resolved = displayExtensionName(packageName(path.dirname(entryPath)), entryPath);
53
+ nameCache.set(entryPath, resolved);
33
54
  return resolved;
34
55
  }
35
56
  /**
@@ -40,6 +61,8 @@ function extensionName(entryPath) {
40
61
  * `@agimon-ai/po-team`, so joining a registered tool back to the layer that
41
62
  * admitted it needs the unshortened name. Attribution and display are different
42
63
  * jobs, so they get different functions rather than one lossy one.
64
+ *
65
+ * @deprecated Node-only sync shim; use readExtensionPackageName. Removed in M2.
43
66
  */
44
67
  function extensionPackageName(entryPath) {
45
68
  const cached = packageCache.get(entryPath);
@@ -49,6 +72,31 @@ function extensionPackageName(entryPath) {
49
72
  return name;
50
73
  }
51
74
  //#endregion
52
- export { extensionName, extensionPackageName };
75
+ //#region src/services/extensionSource/index.ts
76
+ async function readPackageName(fs, directory, context) {
77
+ for (let current = directory; current !== void 0; current = parentDirectory(current)) {
78
+ const text = await fs.readTextFile(path.join(current, MANIFEST_FILE), context);
79
+ const name = text.ok ? manifestPackageName(text.value) : void 0;
80
+ if (name) return name;
81
+ }
82
+ }
83
+ /** Display name of the package that owns an extension entry, read through `fs`. */
84
+ async function readExtensionName(fs, entryPath, context) {
85
+ const cached = nameCache.get(entryPath);
86
+ if (cached !== void 0) return cached;
87
+ const resolved = displayExtensionName(await readPackageName(fs, path.dirname(entryPath), context), entryPath);
88
+ nameCache.set(entryPath, resolved);
89
+ return resolved;
90
+ }
91
+ /** The owning package name with its scope, read through `fs`; see `extensionPackageName`. */
92
+ async function readExtensionPackageName(fs, entryPath, context) {
93
+ const cached = packageCache.get(entryPath);
94
+ if (cached !== void 0) return cached.name;
95
+ const name = await readPackageName(fs, path.dirname(entryPath), context);
96
+ packageCache.set(entryPath, { name });
97
+ return name;
98
+ }
99
+ //#endregion
100
+ export { extensionName, extensionPackageName, readExtensionName, readExtensionPackageName };
53
101
 
54
102
  //# sourceMappingURL=extensionName.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"extensionName.mjs","names":[],"sources":["../src/services/extensionSource/index.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\n/**\n * Display name for an extension that Pi could not attribute to a package.\n *\n * Pi stamps every `--extension <path>` argument with the literal source `cli`,\n * and po launches all of its extensions that way, so the only surviving\n * identity is the entry path. The nearest `package.json` above it names the\n * package that registered the tools.\n */\n\n/** Results are stable for the life of a session, and every source hits the same few dirs. */\nconst cache = new Map<string, string>();\n// Wrapped, because \"no package above this path\" is a real answer worth caching\n// and a bare undefined cannot be told apart from a miss.\nconst packageCache = new Map<string, { readonly name: string | undefined }>();\nfunction packageName(directory: string): string | undefined {\n let current = directory;\n for (;;) {\n try {\n const manifest = JSON.parse(fs.readFileSync(path.join(current, 'package.json'), 'utf8')) as { name?: unknown };\n if (typeof manifest.name === 'string' && manifest.name.length > 0) return manifest.name;\n } catch {\n // No manifest here, or an unreadable one; keep walking up.\n }\n const parent = path.dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\nexport function extensionName(entryPath: string): string {\n const cached = cache.get(entryPath);\n if (cached !== undefined) return cached;\n const name = packageName(path.dirname(entryPath));\n // `@agimon-ai/po-task` reads as `doom-task`; the scope is noise in a tree.\n const resolved = name ? (name.split('/').pop() ?? name) : path.basename(entryPath, path.extname(entryPath));\n cache.set(entryPath, resolved);\n return resolved;\n}\n\n/**\n * The package name exactly as a manifest spells it, scope and all.\n *\n * `extensionName` drops the scope because a tree reads better without it, but\n * that makes it useless as a key: `.po/modes.yaml` names packages as\n * `@agimon-ai/po-team`, so joining a registered tool back to the layer that\n * admitted it needs the unshortened name. Attribution and display are different\n * jobs, so they get different functions rather than one lossy one.\n */\nexport function extensionPackageName(entryPath: string): string | undefined {\n const cached = packageCache.get(entryPath);\n if (cached !== undefined) return cached.name;\n const name = packageName(path.dirname(entryPath));\n packageCache.set(entryPath, { name });\n return name;\n}\n"],"mappings":";;;;;;;;;;;;AAaA,MAAM,wBAAQ,IAAI,IAAoB;AAGtC,MAAM,+BAAe,IAAI,IAAmD;AAC5E,SAAS,YAAY,WAAuC;CAC1D,IAAI,UAAU;CACd,SAAS;EACP,IAAI;GACF,MAAM,WAAW,KAAK,MAAM,GAAG,aAAa,KAAK,KAAK,SAAS,cAAc,GAAG,MAAM,CAAC;GACvF,IAAI,OAAO,SAAS,SAAS,YAAY,SAAS,KAAK,SAAS,GAAG,OAAO,SAAS;EACrF,QAAQ,CAER;EACA,MAAM,SAAS,KAAK,QAAQ,OAAO;EACnC,IAAI,WAAW,SAAS,OAAO,KAAA;EAC/B,UAAU;CACZ;AACF;AAEA,SAAgB,cAAc,WAA2B;CACvD,MAAM,SAAS,MAAM,IAAI,SAAS;CAClC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,OAAO,YAAY,KAAK,QAAQ,SAAS,CAAC;CAEhD,MAAM,WAAW,OAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAAQ,KAAK,SAAS,WAAW,KAAK,QAAQ,SAAS,CAAC;CAC1G,MAAM,IAAI,WAAW,QAAQ;CAC7B,OAAO;AACT;;;;;;;;;;AAWA,SAAgB,qBAAqB,WAAuC;CAC1E,MAAM,SAAS,aAAa,IAAI,SAAS;CACzC,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO;CACxC,MAAM,OAAO,YAAY,KAAK,QAAQ,SAAS,CAAC;CAChD,aAAa,IAAI,WAAW,EAAE,KAAK,CAAC;CACpC,OAAO;AACT"}
1
+ {"version":3,"file":"extensionName.mjs","names":[],"sources":["../src/services/extensionSource/packageName.ts","../src/services/extensionSource/sync.ts","../src/services/extensionSource/index.ts"],"sourcesContent":["import path from 'node:path';\n\n/**\n * Display name for an extension that Pi could not attribute to a package.\n *\n * Pi stamps every `--extension <path>` argument with the literal source `cli`,\n * and po launches all of its extensions that way, so the only surviving\n * identity is the entry path. The nearest `package.json` above it names the\n * package that registered the tools.\n */\n\n/** Results are stable for the life of a session, and every source hits the same few dirs. */\nexport const nameCache = new Map<string, string>();\n// Wrapped, because \"no package above this path\" is a real answer worth caching\n// and a bare undefined cannot be told apart from a miss.\nexport const packageCache = new Map<string, { readonly name: string | undefined }>();\n\nexport const MANIFEST_FILE = 'package.json';\n\n/** The manifest's non-empty name; undefined for a malformed or nameless manifest. */\nexport function manifestPackageName(text: string): string | undefined {\n try {\n const manifest = JSON.parse(text) as { name?: unknown };\n return typeof manifest.name === 'string' && manifest.name.length > 0 ? manifest.name : undefined;\n } catch {\n // An unreadable manifest names nothing; keep walking up.\n return undefined;\n }\n}\n\n/** The next directory to search, or undefined at the filesystem root. */\nexport function parentDirectory(directory: string): string | undefined {\n const parent = path.dirname(directory);\n return parent === directory ? undefined : parent;\n}\n\n/** `@agimon-ai/po-task` reads as `po-task`; the scope is noise in a tree. */\nexport function displayExtensionName(name: string | undefined, entryPath: string): string {\n return name ? (name.split('/').pop() ?? name) : path.basename(entryPath, path.extname(entryPath));\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport {\n MANIFEST_FILE,\n displayExtensionName,\n manifestPackageName,\n nameCache,\n packageCache,\n parentDirectory,\n} from './packageName';\n\nfunction packageName(directory: string): string | undefined {\n for (let current: string | undefined = directory; current !== undefined; current = parentDirectory(current)) {\n let text: string;\n try {\n text = fs.readFileSync(path.join(current, MANIFEST_FILE), 'utf8');\n } catch {\n // No manifest here; keep walking up.\n continue;\n }\n const name = manifestPackageName(text);\n if (name) return name;\n }\n return undefined;\n}\n\n/** @deprecated Node-only sync shim; use readExtensionName. Removed in M2. */\nexport function extensionName(entryPath: string): string {\n const cached = nameCache.get(entryPath);\n if (cached !== undefined) return cached;\n const resolved = displayExtensionName(packageName(path.dirname(entryPath)), entryPath);\n nameCache.set(entryPath, resolved);\n return resolved;\n}\n\n/**\n * The package name exactly as a manifest spells it, scope and all.\n *\n * `extensionName` drops the scope because a tree reads better without it, but\n * that makes it useless as a key: `.po/modes.yaml` names packages as\n * `@agimon-ai/po-team`, so joining a registered tool back to the layer that\n * admitted it needs the unshortened name. Attribution and display are different\n * jobs, so they get different functions rather than one lossy one.\n *\n * @deprecated Node-only sync shim; use readExtensionPackageName. Removed in M2.\n */\nexport function extensionPackageName(entryPath: string): string | undefined {\n const cached = packageCache.get(entryPath);\n if (cached !== undefined) return cached.name;\n const name = packageName(path.dirname(entryPath));\n packageCache.set(entryPath, { name });\n return name;\n}\n","import path from 'node:path';\n\nimport type { FileSystem } from '@agimon-ai/po-core/platform';\n\nimport {\n MANIFEST_FILE,\n displayExtensionName,\n manifestPackageName,\n nameCache,\n packageCache,\n parentDirectory,\n} from './packageName';\n\nexport { extensionName, extensionPackageName } from './sync';\n\ntype IoContext = Parameters<FileSystem['readTextFile']>[1];\n\nasync function readPackageName(fs: FileSystem, directory: string, context: IoContext): Promise<string | undefined> {\n for (let current: string | undefined = directory; current !== undefined; current = parentDirectory(current)) {\n const text = await fs.readTextFile(path.join(current, MANIFEST_FILE), context);\n // No readable manifest here; keep walking up.\n const name = text.ok ? manifestPackageName(text.value) : undefined;\n if (name) return name;\n }\n return undefined;\n}\n\n/** Display name of the package that owns an extension entry, read through `fs`. */\nexport async function readExtensionName(fs: FileSystem, entryPath: string, context: IoContext): Promise<string> {\n const cached = nameCache.get(entryPath);\n if (cached !== undefined) return cached;\n const resolved = displayExtensionName(await readPackageName(fs, path.dirname(entryPath), context), entryPath);\n nameCache.set(entryPath, resolved);\n return resolved;\n}\n\n/** The owning package name with its scope, read through `fs`; see `extensionPackageName`. */\nexport async function readExtensionPackageName(\n fs: FileSystem,\n entryPath: string,\n context: IoContext,\n): Promise<string | undefined> {\n const cached = packageCache.get(entryPath);\n if (cached !== undefined) return cached.name;\n const name = await readPackageName(fs, path.dirname(entryPath), context);\n packageCache.set(entryPath, { name });\n return name;\n}\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,4BAAY,IAAI,IAAoB;AAGjD,MAAa,+BAAe,IAAI,IAAmD;AAEnF,MAAa,gBAAgB;;AAG7B,SAAgB,oBAAoB,MAAkC;CACpE,IAAI;EACF,MAAM,WAAW,KAAK,MAAM,IAAI;EAChC,OAAO,OAAO,SAAS,SAAS,YAAY,SAAS,KAAK,SAAS,IAAI,SAAS,OAAO,KAAA;CACzF,QAAQ;EAEN;CACF;AACF;;AAGA,SAAgB,gBAAgB,WAAuC;CACrE,MAAM,SAAS,KAAK,QAAQ,SAAS;CACrC,OAAO,WAAW,YAAY,KAAA,IAAY;AAC5C;;AAGA,SAAgB,qBAAqB,MAA0B,WAA2B;CACxF,OAAO,OAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,OAAQ,KAAK,SAAS,WAAW,KAAK,QAAQ,SAAS,CAAC;AAClG;;;AC3BA,SAAS,YAAY,WAAuC;CAC1D,KAAK,IAAI,UAA8B,WAAW,YAAY,KAAA,GAAW,UAAU,gBAAgB,OAAO,GAAG;EAC3G,IAAI;EACJ,IAAI;GACF,OAAO,GAAG,aAAa,KAAK,KAAK,SAAS,aAAa,GAAG,MAAM;EAClE,QAAQ;GAEN;EACF;EACA,MAAM,OAAO,oBAAoB,IAAI;EACrC,IAAI,MAAM,OAAO;CACnB;AAEF;;AAGA,SAAgB,cAAc,WAA2B;CACvD,MAAM,SAAS,UAAU,IAAI,SAAS;CACtC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,WAAW,qBAAqB,YAAY,KAAK,QAAQ,SAAS,CAAC,GAAG,SAAS;CACrF,UAAU,IAAI,WAAW,QAAQ;CACjC,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,qBAAqB,WAAuC;CAC1E,MAAM,SAAS,aAAa,IAAI,SAAS;CACzC,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO;CACxC,MAAM,OAAO,YAAY,KAAK,QAAQ,SAAS,CAAC;CAChD,aAAa,IAAI,WAAW,EAAE,KAAK,CAAC;CACpC,OAAO;AACT;;;ACpCA,eAAe,gBAAgB,IAAgB,WAAmB,SAAiD;CACjH,KAAK,IAAI,UAA8B,WAAW,YAAY,KAAA,GAAW,UAAU,gBAAgB,OAAO,GAAG;EAC3G,MAAM,OAAO,MAAM,GAAG,aAAa,KAAK,KAAK,SAAS,aAAa,GAAG,OAAO;EAE7E,MAAM,OAAO,KAAK,KAAK,oBAAoB,KAAK,KAAK,IAAI,KAAA;EACzD,IAAI,MAAM,OAAO;CACnB;AAEF;;AAGA,eAAsB,kBAAkB,IAAgB,WAAmB,SAAqC;CAC9G,MAAM,SAAS,UAAU,IAAI,SAAS;CACtC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,WAAW,qBAAqB,MAAM,gBAAgB,IAAI,KAAK,QAAQ,SAAS,GAAG,OAAO,GAAG,SAAS;CAC5G,UAAU,IAAI,WAAW,QAAQ;CACjC,OAAO;AACT;;AAGA,eAAsB,yBACpB,IACA,WACA,SAC6B;CAC7B,MAAM,SAAS,aAAa,IAAI,SAAS;CACzC,IAAI,WAAW,KAAA,GAAW,OAAO,OAAO;CACxC,MAAM,OAAO,MAAM,gBAAgB,IAAI,KAAK,QAAQ,SAAS,GAAG,OAAO;CACvE,aAAa,IAAI,WAAW,EAAE,KAAK,CAAC;CACpC,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-ui.mjs","names":["Widget0","Widget1","Widget2"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/find.mcp.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/ls.mcp.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/write.mcp.tsx","../../generated/mcp-ui.ts"],"sourcesContent":["import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction FindMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"Find files\">\n <McpToolFields\n fields={[\n ['Pattern', props.args.pattern],\n ['Path', props.args.path],\n ['Limit', props.args.limit],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(FindMcpWidget);\n","import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction LsMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"List directory\">\n <McpToolFields\n fields={[\n ['Path', props.args.path],\n ['Limit', props.args.limit],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(LsMcpWidget);\n","import { defineMcpWidget, type DoomMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction WriteMcpWidget(props: DoomMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"Write file\">\n <McpToolFields\n fields={[\n ['Path', props.args.path],\n ['Characters', typeof props.args.content === 'string' ? props.args.content.length : undefined],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(WriteMcpWidget);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport type { ComponentType } from 'react';\nimport type { DoomMcpWidgetProps } from '@agimon-ai/po-core/mcpWidget';\nimport Widget0 from \"../src/extensions/workspaces/sessions/(frontend)/tool/find.mcp\";\nimport Widget1 from \"../src/extensions/workspaces/sessions/(frontend)/tool/ls.mcp\";\nimport Widget2 from \"../src/extensions/workspaces/sessions/(frontend)/tool/write.mcp\";\n\nexport const widgets: Readonly<Record<string, ComponentType<DoomMcpWidgetProps>>> = {\n \"@agimon-ai/po-ui/find\": Widget0,\n \"@agimon-ai/po-ui/ls\": Widget1,\n \"@agimon-ai/po-ui/write\": Widget2,\n};\n"],"mappings":";;;;AAGA,SAAS,cAAc,OAA2B;CAChD,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ;GACN,CAAC,WAAW,MAAM,KAAK,OAAO;GAC9B,CAAC,QAAQ,MAAM,KAAK,IAAI;GACxB,CAAC,SAAS,MAAM,KAAK,KAAK;EAC5B,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;AAEA,IAAA,mBAAe,gBAAgB,aAAa;;;ACf5C,SAAS,YAAY,OAA2B;CAC9C,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ,CACN,CAAC,QAAQ,MAAM,KAAK,IAAI,GACxB,CAAC,SAAS,MAAM,KAAK,KAAK,CAC5B,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;AAEA,IAAA,iBAAe,gBAAgB,WAAW;;;ACd1C,SAAS,eAAe,OAA2B;CACjD,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ,CACN,CAAC,QAAQ,MAAM,KAAK,IAAI,GACxB,CAAC,cAAc,OAAO,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,QAAQ,SAAS,KAAA,CAAS,CAC/F,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;;;ACRA,MAAa,UAAuE;CAClF,yBAAyBA;CACzB,uBAAuBC;CACvB,0BDOa,gBAAgB,cCPHC;AAC5B"}
1
+ {"version":3,"file":"mcp-ui.mjs","names":["Widget0","Widget1","Widget2"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/tool/find.mcp.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/ls.mcp.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/write.mcp.tsx","../../generated/mcp-ui.ts"],"sourcesContent":["import { defineMcpWidget, type PoMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction FindMcpWidget(props: PoMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"Find files\">\n <McpToolFields\n fields={[\n ['Pattern', props.args.pattern],\n ['Path', props.args.path],\n ['Limit', props.args.limit],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(FindMcpWidget);\n","import { defineMcpWidget, type PoMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction LsMcpWidget(props: PoMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"List directory\">\n <McpToolFields\n fields={[\n ['Path', props.args.path],\n ['Limit', props.args.limit],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(LsMcpWidget);\n","import { defineMcpWidget, type PoMcpWidgetProps } from '@agimon-ai/po-core/web';\nimport { McpToolFrame, McpToolFields, McpToolOutput } from '@agimon-ai/po-web-components';\n\nfunction WriteMcpWidget(props: PoMcpWidgetProps) {\n return (\n <McpToolFrame {...props} title=\"Write file\">\n <McpToolFields\n fields={[\n ['Path', props.args.path],\n ['Characters', typeof props.args.content === 'string' ? props.args.content.length : undefined],\n ]}\n />\n <McpToolOutput result={props.result} />\n </McpToolFrame>\n );\n}\n\nexport default defineMcpWidget(WriteMcpWidget);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport type { ComponentType } from 'react';\nimport type { PoMcpWidgetProps } from '@agimon-ai/po-core/mcpWidget';\nimport Widget0 from \"../src/extensions/workspaces/sessions/(frontend)/tool/find.mcp\";\nimport Widget1 from \"../src/extensions/workspaces/sessions/(frontend)/tool/ls.mcp\";\nimport Widget2 from \"../src/extensions/workspaces/sessions/(frontend)/tool/write.mcp\";\n\nexport const widgets: Readonly<Record<string, ComponentType<PoMcpWidgetProps>>> = {\n \"@agimon-ai/po-ui/find\": Widget0,\n \"@agimon-ai/po-ui/ls\": Widget1,\n \"@agimon-ai/po-ui/write\": Widget2,\n};\n"],"mappings":";;;;AAGA,SAAS,cAAc,OAAyB;CAC9C,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ;GACN,CAAC,WAAW,MAAM,KAAK,OAAO;GAC9B,CAAC,QAAQ,MAAM,KAAK,IAAI;GACxB,CAAC,SAAS,MAAM,KAAK,KAAK;EAC5B,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;AAEA,IAAA,mBAAe,gBAAgB,aAAa;;;ACf5C,SAAS,YAAY,OAAyB;CAC5C,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ,CACN,CAAC,QAAQ,MAAM,KAAK,IAAI,GACxB,CAAC,SAAS,MAAM,KAAK,KAAK,CAC5B,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;AAEA,IAAA,iBAAe,gBAAgB,WAAW;;;ACd1C,SAAS,eAAe,OAAyB;CAC/C,OACE,qBAAC,cAAD;EAAc,GAAI;EAAO,OAAM;EAA/B,UAAA,CACE,oBAAC,eAAD,EACE,QAAQ,CACN,CAAC,QAAQ,MAAM,KAAK,IAAI,GACxB,CAAC,cAAc,OAAO,MAAM,KAAK,YAAY,WAAW,MAAM,KAAK,QAAQ,SAAS,KAAA,CAAS,CAC/F,EACD,CAAA,GACD,oBAAC,eAAD,EAAe,QAAQ,MAAM,OAAS,CAAA,CAC1B;;AAElB;;;ACRA,MAAa,UAAqE;CAChF,yBAAyBA;CACzB,uBAAuBC;CACvB,0BDOa,gBAAgB,cCPHC;AAC5B"}
@@ -13,7 +13,7 @@ function createMcpWriteTool(context) {
13
13
  description: "Create or fully overwrite a file in the Po session's repository on the host machine, creating parent folders. Use this server's edit tool to change part of an existing file.",
14
14
  executionMode: tool.executionMode === "sequential" ? "serial" : tool.executionMode,
15
15
  async execute(toolCallId, parameters, signal, onUpdate) {
16
- return (0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(partial)))));
16
+ return (0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(partial)))));
17
17
  }
18
18
  };
19
19
  }
@@ -24,7 +24,7 @@ function createMcpFindTool(context) {
24
24
  description: "Find files by name or glob pattern in the Po session's repository on the host machine (locate paths). Respects .gitignore. Up to 1000 results by default, with output capped at 50KB.",
25
25
  executionMode: tool.executionMode === "sequential" ? "serial" : tool.executionMode,
26
26
  async execute(toolCallId, parameters, signal, onUpdate) {
27
- return (0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(partial)))));
27
+ return (0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(partial)))));
28
28
  }
29
29
  };
30
30
  }
@@ -35,7 +35,7 @@ function createMcpLsTool(context) {
35
35
  description: "List a directory in the Po session's repository on the host machine (folder contents). Sorted, directories end with '/', dotfiles included. Up to 500 entries by default, with output capped at 50KB.",
36
36
  executionMode: tool.executionMode === "sequential" ? "serial" : tool.executionMode,
37
37
  async execute(toolCallId, parameters, signal, onUpdate) {
38
- return (0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(partial)))));
38
+ return (0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(partial)))));
39
39
  }
40
40
  };
41
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.cjs","names":["createWriteTool","toDoomHeadlessToolResult","createFindTool","createLsTool","defineMcpTool","defineMcpTool","defineMcpTool","defineMcpPlugin","toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { toDoomHeadlessToolResult, type DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\nimport { createFindTool, createLsTool, createWriteTool } from '@earendil-works/pi-coding-agent';\n\n// Pi's `outputSchema` is a TypeBox schema, not an MCP output schema, so it stays off the MCP surface.\n\nexport function createMcpWriteTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createWriteTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createWriteTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"Create or fully overwrite a file in the Po session's repository on the host machine, creating parent folders. Use this server's edit tool to change part of an existing file.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toDoomHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n\nexport function createMcpFindTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createFindTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createFindTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"Find files by name or glob pattern in the Po session's repository on the host machine (locate paths). Respects .gitignore. Up to 1000 results by default, with output capped at 50KB.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toDoomHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n\nexport function createMcpLsTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createLsTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createLsTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"List a directory in the Po session's repository on the host machine (folder contents). Sorted, directories end with '/', dotfiles included. Up to 500 entries by default, with output capped at 50KB.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toDoomHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpFindTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpFindTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpLsTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpLsTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpWriteTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpWriteTool);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.mcp';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-ui',\n session: (context) => ({\n get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-ui/find\", via({ name: 'find' }, at(toolFind, context))), withWidget(\"@agimon-ai/po-ui/ls\", via({ name: 'ls' }, at(toolLs, context))), withWidget(\"@agimon-ai/po-ui/write\", via({ name: 'write' }, at(toolWrite, context)))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;;AAMA,SAAgB,mBACd,SACoE;CACpE,MAAM,EAAE,cAAc,eAAe,GAAG,UAAA,GAASA,gCAAAA,gBAAAA,CAAgB,QAAQ,UAAU,GAAG;CACtF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,QAAA,GAAOC,4BAAAA,yBAAAA,CACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,UAAA,GAASA,4BAAAA,yBAAAA,CAAyB,OAAO,CAAC,EACtE,CACF;EACF;CACF;AACF;AAEA,SAAgB,kBACd,SACmE;CACnE,MAAM,EAAE,cAAc,eAAe,GAAG,UAAA,GAASC,gCAAAA,eAAAA,CAAe,QAAQ,UAAU,GAAG;CACrF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,QAAA,GAAOD,4BAAAA,yBAAAA,CACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,UAAA,GAASA,4BAAAA,yBAAAA,CAAyB,OAAO,CAAC,EACtE,CACF;EACF;CACF;AACF;AAEA,SAAgB,gBACd,SACiE;CACjE,MAAM,EAAE,cAAc,eAAe,GAAG,UAAA,GAASE,gCAAAA,aAAAA,CAAa,QAAQ,UAAU,GAAG;CACnF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,QAAA,GAAOF,4BAAAA,yBAAAA,CACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,UAAA,GAASA,4BAAAA,yBAAAA,CAAyB,OAAO,CAAC,EACtE,CACF;EACF;CACF;AACF;;;ACjEA,IAAA,oBAAA,GAAeG,4BAAAA,cAAAA,CAAoE,iBAAiB;;;ACApG,IAAA,kBAAA,GAAeC,4BAAAA,cAAAA,CAAoE,eAAe;;;ACAlG,IAAA,qBAAA,GAAeC,4BAAAA,cAAAA,CAAoE,kBAAkB;;;ACGrG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAM,cAAiB,KAAa,UAAgB,UAAU,KAAA,IAAY,QAAS;CACjF,GAAG;CAAO,OAAO;EAAE,GAAI,MAA6B;GAAQ,cAAc;CAAI;AAChF;AAEA,MAAa,OAAA,GAAMC,4BAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,QAAuC;EAAE,OAAO;GAAC,WAAW,yBAAyB,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,kBAAU,OAAO,CAAC,CAAC;GAAG,WAAW,uBAAuB,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,OAAO,CAAC,CAAC;GAAG,WAAW,0BAA0B,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,OAAO,CAAC,CAAC;EAAC;CAAG,EAC9S;AACF,CAAC"}
1
+ {"version":3,"file":"mcp.cjs","names":["createWriteTool","toPoHeadlessToolResult","createFindTool","createLsTool","defineMcpTool","defineMcpTool","defineMcpTool","defineMcpPlugin","toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { toPoHeadlessToolResult, type PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\nimport { createFindTool, createLsTool, createWriteTool } from '@earendil-works/pi-coding-agent';\n\n// Pi's `outputSchema` is a TypeBox schema, not an MCP output schema, so it stays off the MCP surface.\n\nexport function createMcpWriteTool(\n context: PoMcpPluginContext,\n): PoHeadlessTool<ReturnType<typeof createWriteTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createWriteTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"Create or fully overwrite a file in the Po session's repository on the host machine, creating parent folders. Use this server's edit tool to change part of an existing file.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toPoHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n\nexport function createMcpFindTool(\n context: PoMcpPluginContext,\n): PoHeadlessTool<ReturnType<typeof createFindTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createFindTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"Find files by name or glob pattern in the Po session's repository on the host machine (locate paths). Respects .gitignore. Up to 1000 results by default, with output capped at 50KB.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toPoHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n\nexport function createMcpLsTool(\n context: PoMcpPluginContext,\n): PoHeadlessTool<ReturnType<typeof createLsTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createLsTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"List a directory in the Po session's repository on the host machine (folder contents). Sorted, directories end with '/', dotfiles included. Up to 500 entries by default, with output capped at 50KB.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toPoHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpFindTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<PoHeadlessTool['parameters'], PoMcpPluginContext>(createMcpFindTool);\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpLsTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<PoHeadlessTool['parameters'], PoMcpPluginContext>(createMcpLsTool);\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpWriteTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<PoHeadlessTool['parameters'], PoMcpPluginContext>(createMcpWriteTool);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.mcp';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-ui',\n session: (context) => ({\n get tools(): PoMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-ui/find\", via({ name: 'find' }, at(toolFind, context))), withWidget(\"@agimon-ai/po-ui/ls\", via({ name: 'ls' }, at(toolLs, context))), withWidget(\"@agimon-ai/po-ui/write\", via({ name: 'write' }, at(toolWrite, context)))]; },\n }) satisfies PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;;AAMA,SAAgB,mBACd,SACkE;CAClE,MAAM,EAAE,cAAc,eAAe,GAAG,UAAA,GAASA,gCAAAA,gBAAAA,CAAgB,QAAQ,UAAU,GAAG;CACtF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,QAAA,GAAOC,4BAAAA,uBAAAA,CACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,UAAA,GAASA,4BAAAA,uBAAAA,CAAuB,OAAO,CAAC,EACpE,CACF;EACF;CACF;AACF;AAEA,SAAgB,kBACd,SACiE;CACjE,MAAM,EAAE,cAAc,eAAe,GAAG,UAAA,GAASC,gCAAAA,eAAAA,CAAe,QAAQ,UAAU,GAAG;CACrF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,QAAA,GAAOD,4BAAAA,uBAAAA,CACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,UAAA,GAASA,4BAAAA,uBAAAA,CAAuB,OAAO,CAAC,EACpE,CACF;EACF;CACF;AACF;AAEA,SAAgB,gBACd,SAC+D;CAC/D,MAAM,EAAE,cAAc,eAAe,GAAG,UAAA,GAASE,gCAAAA,aAAAA,CAAa,QAAQ,UAAU,GAAG;CACnF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,QAAA,GAAOF,4BAAAA,uBAAAA,CACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,UAAA,GAASA,4BAAAA,uBAAAA,CAAuB,OAAO,CAAC,EACpE,CACF;EACF;CACF;AACF;;;ACjEA,IAAA,oBAAA,GAAeG,4BAAAA,cAAAA,CAAgE,iBAAiB;;;ACAhG,IAAA,kBAAA,GAAeC,4BAAAA,cAAAA,CAAgE,eAAe;;;ACA9F,IAAA,qBAAA,GAAeC,4BAAAA,cAAAA,CAAgE,kBAAkB;;;ACGjG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAM,cAAiB,KAAa,UAAgB,UAAU,KAAA,IAAY,QAAS;CACjF,GAAG;CAAO,OAAO;EAAE,GAAI,MAA6B;GAAQ,cAAc;CAAI;AAChF;AAEA,MAAa,OAAA,GAAMC,4BAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,QAAqC;EAAE,OAAO;GAAC,WAAW,yBAAyB,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGC,kBAAU,OAAO,CAAC,CAAC;GAAG,WAAW,uBAAuB,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,OAAO,CAAC,CAAC;GAAG,WAAW,0BAA0B,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,OAAO,CAAC,CAAC;EAAC;CAAG,EAC5S;AACF,CAAC"}
@@ -1,5 +1,5 @@
1
1
  //#region generated/mcp.d.ts
2
- export declare const mcp: import("@agimon-ai/po-core/mcpFacet").DoomMcpPluginDefinition;
2
+ export declare const mcp: import("@agimon-ai/po-core/mcpFacet").PoMcpPluginDefinition;
3
3
  //#endregion
4
4
  export { mcp as default };
5
5
  //# sourceMappingURL=mcp.d.mts.map
@@ -1,5 +1,5 @@
1
1
  import { defineMcpPlugin, defineMcpTool } from "@agimon-ai/po-core/mcpFacet";
2
- import { toDoomHeadlessToolResult } from "@agimon-ai/po-core/headless";
2
+ import { toPoHeadlessToolResult } from "@agimon-ai/po-core/headless";
3
3
  import { createFindTool, createLsTool, createWriteTool } from "@earendil-works/pi-coding-agent";
4
4
  //#region src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts
5
5
  function createMcpWriteTool(context) {
@@ -9,7 +9,7 @@ function createMcpWriteTool(context) {
9
9
  description: "Create or fully overwrite a file in the Po session's repository on the host machine, creating parent folders. Use this server's edit tool to change part of an existing file.",
10
10
  executionMode: tool.executionMode === "sequential" ? "serial" : tool.executionMode,
11
11
  async execute(toolCallId, parameters, signal, onUpdate) {
12
- return toDoomHeadlessToolResult(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial)))));
12
+ return toPoHeadlessToolResult(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial)))));
13
13
  }
14
14
  };
15
15
  }
@@ -20,7 +20,7 @@ function createMcpFindTool(context) {
20
20
  description: "Find files by name or glob pattern in the Po session's repository on the host machine (locate paths). Respects .gitignore. Up to 1000 results by default, with output capped at 50KB.",
21
21
  executionMode: tool.executionMode === "sequential" ? "serial" : tool.executionMode,
22
22
  async execute(toolCallId, parameters, signal, onUpdate) {
23
- return toDoomHeadlessToolResult(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial)))));
23
+ return toPoHeadlessToolResult(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial)))));
24
24
  }
25
25
  };
26
26
  }
@@ -31,7 +31,7 @@ function createMcpLsTool(context) {
31
31
  description: "List a directory in the Po session's repository on the host machine (folder contents). Sorted, directories end with '/', dotfiles included. Up to 500 entries by default, with output capped at 50KB.",
32
32
  executionMode: tool.executionMode === "sequential" ? "serial" : tool.executionMode,
33
33
  async execute(toolCallId, parameters, signal, onUpdate) {
34
- return toDoomHeadlessToolResult(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial)))));
34
+ return toPoHeadlessToolResult(await tool.execute(toolCallId, parameters, AbortSignal.any([context.signal, signal ?? context.signal]), onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial)))));
35
35
  }
36
36
  };
37
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.mjs","names":["toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { toDoomHeadlessToolResult, type DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\nimport { createFindTool, createLsTool, createWriteTool } from '@earendil-works/pi-coding-agent';\n\n// Pi's `outputSchema` is a TypeBox schema, not an MCP output schema, so it stays off the MCP surface.\n\nexport function createMcpWriteTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createWriteTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createWriteTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"Create or fully overwrite a file in the Po session's repository on the host machine, creating parent folders. Use this server's edit tool to change part of an existing file.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toDoomHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n\nexport function createMcpFindTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createFindTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createFindTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"Find files by name or glob pattern in the Po session's repository on the host machine (locate paths). Respects .gitignore. Up to 1000 results by default, with output capped at 50KB.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toDoomHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n\nexport function createMcpLsTool(\n context: DoomMcpPluginContext,\n): DoomHeadlessTool<ReturnType<typeof createLsTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createLsTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"List a directory in the Po session's repository on the host machine (folder contents). Sorted, directories end with '/', dotfiles included. Up to 500 entries by default, with output capped at 50KB.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toDoomHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toDoomHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n","import type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpFindTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpFindTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpLsTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpLsTool);\n","import type { DoomHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type DoomMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpWriteTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<DoomHeadlessTool['parameters'], DoomMcpPluginContext>(createMcpWriteTool);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.mcp';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-ui',\n session: (context) => ({\n get tools(): DoomMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-ui/find\", via({ name: 'find' }, at(toolFind, context))), withWidget(\"@agimon-ai/po-ui/ls\", via({ name: 'ls' }, at(toolLs, context))), withWidget(\"@agimon-ai/po-ui/write\", via({ name: 'write' }, at(toolWrite, context)))]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;AAMA,SAAgB,mBACd,SACoE;CACpE,MAAM,EAAE,cAAc,eAAe,GAAG,SAAS,gBAAgB,QAAQ,UAAU,GAAG;CACtF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,OAAO,yBACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,SAAS,yBAAyB,OAAO,CAAC,EACtE,CACF;EACF;CACF;AACF;AAEA,SAAgB,kBACd,SACmE;CACnE,MAAM,EAAE,cAAc,eAAe,GAAG,SAAS,eAAe,QAAQ,UAAU,GAAG;CACrF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,OAAO,yBACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,SAAS,yBAAyB,OAAO,CAAC,EACtE,CACF;EACF;CACF;AACF;AAEA,SAAgB,gBACd,SACiE;CACjE,MAAM,EAAE,cAAc,eAAe,GAAG,SAAS,aAAa,QAAQ,UAAU,GAAG;CACnF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,OAAO,yBACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,SAAS,yBAAyB,OAAO,CAAC,EACtE,CACF;EACF;CACF;AACF;;;ACjEA,IAAA,mBAAe,cAAoE,iBAAiB;;;ACApG,IAAA,iBAAe,cAAoE,eAAe;;;ACAlG,IAAA,oBAAe,cAAoE,kBAAkB;;;ACGrG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAM,cAAiB,KAAa,UAAgB,UAAU,KAAA,IAAY,QAAS;CACjF,GAAG;CAAO,OAAO;EAAE,GAAI,MAA6B;GAAQ,cAAc;CAAI;AAChF;AAEA,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,QAAuC;EAAE,OAAO;GAAC,WAAW,yBAAyB,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGA,kBAAU,OAAO,CAAC,CAAC;GAAG,WAAW,uBAAuB,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,OAAO,CAAC,CAAC;GAAG,WAAW,0BAA0B,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,OAAO,CAAC,CAAC;EAAC;CAAG,EAC9S;AACF,CAAC"}
1
+ {"version":3,"file":"mcp.mjs","names":["toolFind","toolLs","toolWrite"],"sources":["../../src/extensions/workspaces/sessions/(backend)/_lib/mcpFileTools.ts","../../src/extensions/workspaces/sessions/(backend)/tool/find.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp.ts","../../src/extensions/workspaces/sessions/(backend)/tool/write.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { toPoHeadlessToolResult, type PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport type { PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\nimport { createFindTool, createLsTool, createWriteTool } from '@earendil-works/pi-coding-agent';\n\n// Pi's `outputSchema` is a TypeBox schema, not an MCP output schema, so it stays off the MCP surface.\n\nexport function createMcpWriteTool(\n context: PoMcpPluginContext,\n): PoHeadlessTool<ReturnType<typeof createWriteTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createWriteTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"Create or fully overwrite a file in the Po session's repository on the host machine, creating parent folders. Use this server's edit tool to change part of an existing file.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toPoHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n\nexport function createMcpFindTool(\n context: PoMcpPluginContext,\n): PoHeadlessTool<ReturnType<typeof createFindTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createFindTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"Find files by name or glob pattern in the Po session's repository on the host machine (locate paths). Respects .gitignore. Up to 1000 results by default, with output capped at 50KB.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toPoHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n\nexport function createMcpLsTool(\n context: PoMcpPluginContext,\n): PoHeadlessTool<ReturnType<typeof createLsTool>['parameters']> {\n const { outputSchema: _outputSchema, ...tool } = createLsTool(context.execution.cwd);\n return {\n ...tool,\n description:\n \"List a directory in the Po session's repository on the host machine (folder contents). Sorted, directories end with '/', dotfiles included. Up to 500 entries by default, with output capped at 50KB.\",\n executionMode: tool.executionMode === 'sequential' ? 'serial' : tool.executionMode,\n async execute(toolCallId, parameters, signal, onUpdate) {\n return toPoHeadlessToolResult(\n await tool.execute(\n toolCallId,\n parameters,\n AbortSignal.any([context.signal, signal ?? context.signal]),\n onUpdate && ((partial) => onUpdate(toPoHeadlessToolResult(partial))),\n ),\n );\n },\n };\n}\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpFindTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<PoHeadlessTool['parameters'], PoMcpPluginContext>(createMcpFindTool);\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpLsTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<PoHeadlessTool['parameters'], PoMcpPluginContext>(createMcpLsTool);\n","import type { PoHeadlessTool } from '@agimon-ai/po-core/headless';\nimport { defineMcpTool, type PoMcpPluginContext } from '@agimon-ai/po-core/mcpFacet';\n\nimport { createMcpWriteTool } from '../_lib/mcpFileTools';\n\nexport default defineMcpTool<PoHeadlessTool['parameters'], PoMcpPluginContext>(createMcpWriteTool);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport toolFind from '../src/extensions/workspaces/sessions/(backend)/tool/find.mcp';\nimport toolLs from '../src/extensions/workspaces/sessions/(backend)/tool/ls.mcp';\nimport toolWrite from '../src/extensions/workspaces/sessions/(backend)/tool/write.mcp';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nconst withWidget = <T>(key: string, value: T): T => value === undefined ? value : ({\n ...value, _meta: { ...(value as { _meta?: object })._meta, [\"po/widget\"]: key },\n});\n\nexport const mcp = defineMcpPlugin({\n name: '@agimon-ai/po-ui',\n session: (context) => ({\n get tools(): PoMcpSessionPlugin['tools'] { return [withWidget(\"@agimon-ai/po-ui/find\", via({ name: 'find' }, at(toolFind, context))), withWidget(\"@agimon-ai/po-ui/ls\", via({ name: 'ls' }, at(toolLs, context))), withWidget(\"@agimon-ai/po-ui/write\", via({ name: 'write' }, at(toolWrite, context)))]; },\n }) satisfies PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;AAMA,SAAgB,mBACd,SACkE;CAClE,MAAM,EAAE,cAAc,eAAe,GAAG,SAAS,gBAAgB,QAAQ,UAAU,GAAG;CACtF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,OAAO,uBACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,SAAS,uBAAuB,OAAO,CAAC,EACpE,CACF;EACF;CACF;AACF;AAEA,SAAgB,kBACd,SACiE;CACjE,MAAM,EAAE,cAAc,eAAe,GAAG,SAAS,eAAe,QAAQ,UAAU,GAAG;CACrF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,OAAO,uBACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,SAAS,uBAAuB,OAAO,CAAC,EACpE,CACF;EACF;CACF;AACF;AAEA,SAAgB,gBACd,SAC+D;CAC/D,MAAM,EAAE,cAAc,eAAe,GAAG,SAAS,aAAa,QAAQ,UAAU,GAAG;CACnF,OAAO;EACL,GAAG;EACH,aACE;EACF,eAAe,KAAK,kBAAkB,eAAe,WAAW,KAAK;EACrE,MAAM,QAAQ,YAAY,YAAY,QAAQ,UAAU;GACtD,OAAO,uBACL,MAAM,KAAK,QACT,YACA,YACA,YAAY,IAAI,CAAC,QAAQ,QAAQ,UAAU,QAAQ,MAAM,CAAC,GAC1D,cAAc,YAAY,SAAS,uBAAuB,OAAO,CAAC,EACpE,CACF;EACF;CACF;AACF;;;ACjEA,IAAA,mBAAe,cAAgE,iBAAiB;;;ACAhG,IAAA,iBAAe,cAAgE,eAAe;;;ACA9F,IAAA,oBAAe,cAAgE,kBAAkB;;;ACGjG,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAM,cAAiB,KAAa,UAAgB,UAAU,KAAA,IAAY,QAAS;CACjF,GAAG;CAAO,OAAO;EAAE,GAAI,MAA6B;GAAQ,cAAc;CAAI;AAChF;AAEA,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,QAAqC;EAAE,OAAO;GAAC,WAAW,yBAAyB,IAAI,EAAE,MAAM,OAAO,GAAG,GAAGA,kBAAU,OAAO,CAAC,CAAC;GAAG,WAAW,uBAAuB,IAAI,EAAE,MAAM,KAAK,GAAG,GAAGC,gBAAQ,OAAO,CAAC,CAAC;GAAG,WAAW,0BAA0B,IAAI,EAAE,MAAM,QAAQ,GAAG,GAAGC,mBAAW,OAAO,CAAC,CAAC;EAAC;CAAG,EAC5S;AACF,CAAC"}
@@ -65,7 +65,7 @@ function createServerWriteTool() {
65
65
  promptGuidelines,
66
66
  async execute(toolCallId, parameters, signal, onUpdate, execution) {
67
67
  const tool = (0, _earendil_works_pi_coding_agent.createWriteTool)(execution.cwd);
68
- return (0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(await tool.execute(toolCallId, parameters, signal, onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(partial)))));
68
+ return (0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(await tool.execute(toolCallId, parameters, signal, onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(partial)))));
69
69
  }
70
70
  };
71
71
  }
@@ -80,7 +80,7 @@ function createServerFindTool() {
80
80
  promptGuidelines,
81
81
  async execute(toolCallId, parameters, signal, onUpdate, execution) {
82
82
  const tool = (0, _earendil_works_pi_coding_agent.createFindTool)(execution.cwd);
83
- return (0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(await tool.execute(toolCallId, parameters, signal, onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(partial)))));
83
+ return (0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(await tool.execute(toolCallId, parameters, signal, onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(partial)))));
84
84
  }
85
85
  };
86
86
  }
@@ -95,7 +95,7 @@ function createServerLsTool() {
95
95
  promptGuidelines,
96
96
  async execute(toolCallId, parameters, signal, onUpdate, execution) {
97
97
  const tool = (0, _earendil_works_pi_coding_agent.createLsTool)(execution.cwd);
98
- return (0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(await tool.execute(toolCallId, parameters, signal, onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toDoomHeadlessToolResult)(partial)))));
98
+ return (0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(await tool.execute(toolCallId, parameters, signal, onUpdate && ((partial) => onUpdate((0, _agimon_ai_po_core_headless.toPoHeadlessToolResult)(partial)))));
99
99
  }
100
100
  };
101
101
  }