@agimon-ai/po-core 0.0.0-alpha.120 → 0.0.0-alpha.121

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 (72) hide show
  1. package/dist/headlessSessionHost.d.mts +2 -0
  2. package/dist/headlessSessionHost.d.mts.map +1 -1
  3. package/dist/machineApi.cjs +8 -36
  4. package/dist/machineApi.cjs.map +1 -1
  5. package/dist/machineApi.d.mts +1 -1
  6. package/dist/machineApi.d.mts.map +1 -1
  7. package/dist/machineApi.mjs +8 -34
  8. package/dist/machineApi.mjs.map +1 -1
  9. package/dist/modelGateway.cjs +25 -5
  10. package/dist/modelGateway.d.mts +7 -1
  11. package/dist/modelGateway.mjs +6 -1
  12. package/dist/remoteRuntime.cjs +13 -2
  13. package/dist/remoteRuntime.cjs.map +1 -1
  14. package/dist/remoteRuntime.d.mts +2 -0
  15. package/dist/remoteRuntime.d.mts.map +1 -1
  16. package/dist/remoteRuntime.mjs +13 -2
  17. package/dist/remoteRuntime.mjs.map +1 -1
  18. package/dist/src/schemas/sharedModels.cjs +9 -0
  19. package/dist/src/schemas/sharedModels.cjs.map +1 -0
  20. package/dist/src/schemas/sharedModels.d.mts +33 -0
  21. package/dist/src/schemas/sharedModels.d.mts.map +1 -0
  22. package/dist/src/schemas/sharedModels.mjs +8 -0
  23. package/dist/src/schemas/sharedModels.mjs.map +1 -0
  24. package/dist/src/server/providerRuntime.cjs +41 -0
  25. package/dist/src/server/providerRuntime.cjs.map +1 -0
  26. package/dist/src/server/providerRuntime.d.mts +12 -0
  27. package/dist/src/server/providerRuntime.d.mts.map +1 -0
  28. package/dist/src/server/providerRuntime.mjs +39 -0
  29. package/dist/src/server/providerRuntime.mjs.map +1 -0
  30. package/dist/src/services/federationAccess/type.d.mts +2 -0
  31. package/dist/src/services/federationAccess/type.d.mts.map +1 -1
  32. package/dist/src/services/hubFederation/index.cjs +16 -0
  33. package/dist/src/services/hubFederation/index.cjs.map +1 -1
  34. package/dist/src/services/hubFederation/index.d.mts +2 -0
  35. package/dist/src/services/hubFederation/index.d.mts.map +1 -1
  36. package/dist/src/services/hubFederation/index.mjs +16 -0
  37. package/dist/src/services/hubFederation/index.mjs.map +1 -1
  38. package/dist/src/services/modelGatewayExecutor/index.cjs +160 -0
  39. package/dist/src/services/modelGatewayExecutor/index.cjs.map +1 -0
  40. package/dist/src/services/modelGatewayExecutor/index.d.mts +18 -0
  41. package/dist/src/services/modelGatewayExecutor/index.d.mts.map +1 -0
  42. package/dist/src/services/modelGatewayExecutor/index.mjs +160 -0
  43. package/dist/src/services/modelGatewayExecutor/index.mjs.map +1 -0
  44. package/dist/src/services/modelGatewayExecutor/type.d.mts +36 -0
  45. package/dist/src/services/modelGatewayExecutor/type.d.mts.map +1 -0
  46. package/dist/src/services/modelGatewayHost/index.cjs +19 -98
  47. package/dist/src/services/modelGatewayHost/index.cjs.map +1 -1
  48. package/dist/src/services/modelGatewayHost/index.d.mts.map +1 -1
  49. package/dist/src/services/modelGatewayHost/index.mjs +21 -100
  50. package/dist/src/services/modelGatewayHost/index.mjs.map +1 -1
  51. package/dist/src/services/modelGatewayHost/type.d.mts +2 -0
  52. package/dist/src/services/modelGatewayHost/type.d.mts.map +1 -1
  53. package/dist/src/services/modelGatewayWire/index.d.mts +30 -0
  54. package/dist/src/services/modelGatewayWire/index.d.mts.map +1 -0
  55. package/dist/src/services/nativeChildTools/index.cjs +1 -1
  56. package/dist/src/services/nativeChildTools/index.mjs +1 -1
  57. package/dist/src/services/piExtensionHost/index.cjs +36 -1
  58. package/dist/src/services/piExtensionHost/index.cjs.map +1 -1
  59. package/dist/src/services/piExtensionHost/index.d.mts.map +1 -1
  60. package/dist/src/services/piExtensionHost/index.mjs +36 -1
  61. package/dist/src/services/piExtensionHost/index.mjs.map +1 -1
  62. package/dist/src/services/platformFiles/rootBoundReplace.cjs.map +1 -1
  63. package/dist/src/services/platformFiles/rootBoundReplace.d.mts +3 -0
  64. package/dist/src/services/platformFiles/rootBoundReplace.d.mts.map +1 -1
  65. package/dist/src/services/platformFiles/rootBoundReplace.mjs.map +1 -1
  66. package/dist/src/systems/main/adapters/headlessSessionHost.cjs +5 -0
  67. package/dist/src/systems/main/adapters/headlessSessionHost.cjs.map +1 -1
  68. package/dist/src/systems/main/adapters/headlessSessionHost.mjs +5 -0
  69. package/dist/src/systems/main/adapters/headlessSessionHost.mjs.map +1 -1
  70. package/dist/src/web/types/webPlugin.d.mts +4 -0
  71. package/dist/src/web/types/webPlugin.d.mts.map +1 -1
  72. package/package.json +4 -4
@@ -85,6 +85,8 @@ export interface HeadlessSessionHostOptions {
85
85
  requiredServerPackages?: () => Promise<readonly string[]>;
86
86
  /** Pure, selected native package overrides, applied to this session's private registry. */
87
87
  providerOverrides?: () => readonly PoServerProviderOverride[];
88
+ /** Registers consumer providers after extension preload and provider overrides, before model resolution. Failures are advisory. */
89
+ registerModelProviders?(runtime: PoModelRuntime): Promise<void>;
88
90
  /** Explicit remote-only plugins loaded from the admitted MCP bundle. */
89
91
  mcpPlugins?: readonly LoadedMcpPlugin[];
90
92
  resolveSelection?: HeadlessHostOptions['resolveSelection'];
@@ -1 +1 @@
1
- {"version":3,"file":"headlessSessionHost.d.mts","names":[],"sources":["../src/systems/main/types/headlessSessionHost.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;YAwBY,iBAAiB,SAC3B,KACE;;YAYQ,4BAA4B,KACtC;;iBAKe;;WAEN;WACA,cAAc;;WAEd;aAAyC;aAAuB;;;EAEzE,aAAa,QAAQ,OAAO;IAAU,OAAO,MAAM;IAAM,gBAAgB;;;WAEhE,gBAAgB,OAAO,8BAA8B;;iBAE/C;EACf;;EAEA,UAAU;EACV;EACA;;EAEA;EACA;;EAEA;EACA,iBAAiB;EACjB,oBAAoB;EACpB;;EAEA;;EAEA;EACA;EACA;;EAEA;;WAES,kBAAkB;EAC3B;EACA,aAAa,SAAS;EACtB,WAAW;EACX;;EAEA;;EAEA;EACA,2BAA2B,QAAQ,uBAAuB,QAAQ,QAAQ;EAC1E,qBAAqB;;EAErB,+BAA+B;;EAE/B,mCAAmC;;EAEnC,sBAAsB;EACtB,mBAAmB;EACnB,0BACE,YAAY,gBAAgB,mCAC5B,WAAW;EAEb,iBAAiB,SAAS,SAAS,WAAW,wBAAwB;EACtE,YAAY;;EAEZ;EACA,YAAY,KAAK,kCAAkC,QAAQ,KAAK;;EAEhE;;EAEA,qBAAqB,SAAS,+BAA+B,QAAQ;;iBAKtD;WACN,SAAS;;;;;WAKT,eAAe;EACxB,uBAAuB,QAAQ;;EAE/B,WAAW,qBAAqB;;WAEvB,iBAAiB;WACjB,MAAM;WACN,aAAa;WACb,YAAY;;WAEZ,kBAAkB,MAAM;;WAExB,mBAAmB,yCAAyC;;EAErE,gBAAgB,qBAAqB,uBAAuB,uCAAuC;;EAEnG,kBAAkB,eAAe,0BAA0B;WAClD;;EAET,aAAa,gBAAgB;EAC7B,oBAAoB,WAAW,OAAO;;EAEtC,aAAa,WAAW,WAAW;;EAEnC,kBAAkB,WAAW;EAC7B,qBAAqB,OAAO;;EAE5B,mBAAmB;EACnB,QAAQ,UAAU,8BAA8B"}
1
+ {"version":3,"file":"headlessSessionHost.d.mts","names":[],"sources":["../src/systems/main/types/headlessSessionHost.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;YAwBY,iBAAiB,SAC3B,KACE;;YAYQ,4BAA4B,KACtC;;iBAKe;;WAEN;WACA,cAAc;;WAEd;aAAyC;aAAuB;;;EAEzE,aAAa,QAAQ,OAAO;IAAU,OAAO,MAAM;IAAM,gBAAgB;;;WAEhE,gBAAgB,OAAO,8BAA8B;;iBAE/C;EACf;;EAEA,UAAU;EACV;EACA;;EAEA;EACA;;EAEA;EACA,iBAAiB;EACjB,oBAAoB;EACpB;;EAEA;;EAEA;EACA;EACA;;EAEA;;WAES,kBAAkB;EAC3B;EACA,aAAa,SAAS;EACtB,WAAW;EACX;;EAEA;;EAEA;EACA,2BAA2B,QAAQ,uBAAuB,QAAQ,QAAQ;EAC1E,qBAAqB;;EAErB,+BAA+B;;EAE/B,mCAAmC;;EAEnC,wBAAwB,SAAS,iBAAiB;;EAElD,sBAAsB;EACtB,mBAAmB;EACnB,0BACE,YAAY,gBAAgB,mCAC5B,WAAW;EAEb,iBAAiB,SAAS,SAAS,WAAW,wBAAwB;EACtE,YAAY;;EAEZ;EACA,YAAY,KAAK,kCAAkC,QAAQ,KAAK;;EAEhE;;EAEA,qBAAqB,SAAS,+BAA+B,QAAQ;;iBAKtD;WACN,SAAS;;;;;WAKT,eAAe;EACxB,uBAAuB,QAAQ;;EAE/B,WAAW,qBAAqB;;WAEvB,iBAAiB;WACjB,MAAM;WACN,aAAa;WACb,YAAY;;WAEZ,kBAAkB,MAAM;;WAExB,mBAAmB,yCAAyC;;EAErE,gBAAgB,qBAAqB,uBAAuB,uCAAuC;;EAEnG,kBAAkB,eAAe,0BAA0B;WAClD;;EAET,aAAa,gBAAgB;EAC7B,oBAAoB,WAAW,OAAO;;EAEtC,aAAa,WAAW,WAAW;;EAEnC,kBAAkB,WAAW;EAC7B,qBAAqB,OAAO;;EAE5B,mBAAmB;EACnB,QAAQ,UAAU,8BAA8B"}
@@ -1,18 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_runtime = require("./_virtual/_rolldown/runtime.cjs");
3
2
  const require_index = require("./src/services/nodeHost/index.cjs");
4
- const require_core = require("./src/services/piSettings/core.cjs");
5
- const require_sync = require("./src/services/piSettings/sync.cjs");
6
- require("./runtimePiSettings.cjs");
7
- const require_index$1 = require("./src/services/chatgptLogin/index.cjs");
8
- const require_index$2 = require("./src/services/piExtensionHost/index.cjs");
3
+ const require_providerRuntime = require("./src/server/providerRuntime.cjs");
9
4
  const require_providerRoutes = require("./src/server/providerRoutes.cjs");
10
- let node_path = require("node:path");
11
- node_path = require_runtime.__toESM(node_path, 1);
12
- let dist_interop_piCodingAgent_mjs = require("../dist/interop/piCodingAgent.mjs");
13
5
  //#region src/server/machineApi.ts
14
6
  /** Machine-owned provider credentials and model catalog, available without a session. */
15
- function createMachineApi(_options) {
7
+ function createMachineApi(options) {
16
8
  return {
17
9
  basePath: "po",
18
10
  start(context) {
@@ -20,32 +12,12 @@ function createMachineApi(_options) {
20
12
  return require_providerRoutes.createProviderRoutes({
21
13
  onChange: () => context.bumpRevision?.("providers"),
22
14
  onNotice: (message) => context.onNotice(message),
23
- runtime: async () => {
24
- const directory = require_core.piAgentDirectory(context.environment, context.homeDirectory);
25
- const modelDir = require_sync.modelConfigDirectory(directory, context.homeDirectory);
26
- const runtime = await dist_interop_piCodingAgent_mjs.ModelRuntime.create({
27
- authPath: node_path.default.join(modelDir, "auth.json"),
28
- modelsPath: node_path.default.join(modelDir, "models.json")
29
- });
30
- require_index$1.registerChatgptAuthProvider(runtime);
31
- const onNotice = (message) => context.onNotice(message);
32
- const cwd = context.homeDirectory ?? require_index.nodeHost.homeDirectory();
33
- const settings = dist_interop_piCodingAgent_mjs.SettingsManager.create(cwd, directory);
34
- await require_index$2.preloadPiExtensions({
35
- cwd,
36
- agentDir: directory,
37
- models: runtime,
38
- extensionPaths: await require_index$2.resolvePiSettingsPackageEntries({
39
- cwd,
40
- agentDir: directory,
41
- settings,
42
- homeDirectory: context.homeDirectory,
43
- onNotice
44
- }),
45
- onNotice
46
- });
47
- return runtime;
48
- }
15
+ runtime: () => require_providerRuntime.createHostProviderRuntime({
16
+ fs: options.fs,
17
+ homeDirectory: context.homeDirectory ?? require_index.nodeHost.homeDirectory(),
18
+ environment: context.environment ?? require_index.nodeHost.environment(),
19
+ onNotice: (message) => context.onNotice(message)
20
+ })
49
21
  });
50
22
  }
51
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"machineApi.cjs","names":["createProviderRoutes","piAgentDirectory","modelConfigDirectory","ModelRuntime","path","nodeHost","SettingsManager","preloadPiExtensions","resolvePiSettingsPackageEntries"],"sources":["../src/server/machineApi.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { ModelRuntime, SettingsManager } from '@earendil-works/pi-coding-agent';\nimport type { FileSystem } from '@earendil-works/pi-durable/env';\n\nimport type { PoApi } from '../exports/packageApi';\nimport { registerChatgptAuthProvider } from '../services/chatgptLogin';\nimport { nodeHost } from '../services/nodeHost';\nimport { preloadPiExtensions, resolvePiSettingsPackageEntries } from '../services/piExtensionHost';\nimport { modelConfigDirectory, piAgentDirectory } from '../services/piSettings';\nimport { createProviderRoutes } from './providerRoutes';\n/** Machine-owned provider credentials and model catalog, available without a session. */\nexport function createMachineApi(_options: { fs: FileSystem }): PoApi {\n return {\n basePath: 'po',\n start(context) {\n if (context.scope !== 'global') throw new Error('Provider authentication requires the global mount.');\n return createProviderRoutes({\n onChange: () => context.bumpRevision?.('providers'),\n onNotice: (message) => context.onNotice(message),\n runtime: async () => {\n const directory = piAgentDirectory(context.environment, context.homeDirectory);\n // Resolved as sessions resolve it (headlessSessionHost): with no model config of its\n // own, Po falls back to plain Pi's ~/.pi/agent, so this catalog matches the session picker.\n const modelDir = modelConfigDirectory(directory, context.homeDirectory);\n const runtime = await ModelRuntime.create({\n authPath: path.join(modelDir, 'auth.json'),\n modelsPath: path.join(modelDir, 'models.json'),\n });\n registerChatgptAuthProvider(runtime);\n // Providers registered by Pi settings packages (a Claude Code bridge, say) are\n // listed and pickable here as they are in sessions, which load the same packages.\n const onNotice = (message: string): void => context.onNotice(message);\n // Machine scope has no project, so the home directory stands in for Pi's cwd.\n const cwd = context.homeDirectory ?? nodeHost.homeDirectory();\n const settings = SettingsManager.create(cwd, directory);\n await preloadPiExtensions({\n cwd,\n agentDir: directory,\n models: runtime,\n extensionPaths: await resolvePiSettingsPackageEntries({\n cwd,\n agentDir: directory,\n settings,\n homeDirectory: context.homeDirectory,\n onNotice,\n }),\n onNotice,\n });\n return runtime;\n },\n });\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAYA,SAAgB,iBAAiB,UAAqC;CACpE,OAAO;EACL,UAAU;EACV,MAAM,SAAS;GACb,IAAI,QAAQ,UAAU,UAAU,MAAM,IAAI,MAAM,oDAAoD;GACpG,OAAOA,uBAAAA,qBAAqB;IAC1B,gBAAgB,QAAQ,eAAe,WAAW;IAClD,WAAW,YAAY,QAAQ,SAAS,OAAO;IAC/C,SAAS,YAAY;KACnB,MAAM,YAAYC,aAAAA,iBAAiB,QAAQ,aAAa,QAAQ,aAAa;KAG7E,MAAM,WAAWC,aAAAA,qBAAqB,WAAW,QAAQ,aAAa;KACtE,MAAM,UAAU,MAAMC,+BAAAA,aAAa,OAAO;MACxC,UAAUC,UAAAA,QAAK,KAAK,UAAU,WAAW;MACzC,YAAYA,UAAAA,QAAK,KAAK,UAAU,aAAa;KAC/C,CAAC;KACD,gBAAA,4BAA4B,OAAO;KAGnC,MAAM,YAAY,YAA0B,QAAQ,SAAS,OAAO;KAEpE,MAAM,MAAM,QAAQ,iBAAiBC,cAAAA,SAAS,cAAc;KAC5D,MAAM,WAAWC,+BAAAA,gBAAgB,OAAO,KAAK,SAAS;KACtD,MAAMC,gBAAAA,oBAAoB;MACxB;MACA,UAAU;MACV,QAAQ;MACR,gBAAgB,MAAMC,gBAAAA,gCAAgC;OACpD;OACA,UAAU;OACV;OACA,eAAe,QAAQ;OACvB;MACF,CAAC;MACD;KACF,CAAC;KACD,OAAO;IACT;GACF,CAAC;EACH;CACF;AACF"}
1
+ {"version":3,"file":"machineApi.cjs","names":["createProviderRoutes","createHostProviderRuntime","nodeHost"],"sources":["../src/server/machineApi.ts"],"sourcesContent":["import type { FileSystem } from '@earendil-works/pi-durable/env';\n\nimport type { PoApi } from '../exports/packageApi';\nimport { nodeHost } from '../services/nodeHost';\nimport { createProviderRoutes } from './providerRoutes';\nimport { createHostProviderRuntime } from './providerRuntime';\n\n/** Machine-owned provider credentials and model catalog, available without a session. */\nexport function createMachineApi(options: { fs: FileSystem }): PoApi {\n return {\n basePath: 'po',\n start(context) {\n if (context.scope !== 'global') throw new Error('Provider authentication requires the global mount.');\n return createProviderRoutes({\n onChange: () => context.bumpRevision?.('providers'),\n onNotice: (message) => context.onNotice(message),\n runtime: () =>\n createHostProviderRuntime({\n fs: options.fs,\n homeDirectory: context.homeDirectory ?? nodeHost.homeDirectory(),\n environment: context.environment ?? nodeHost.environment(),\n onNotice: (message) => context.onNotice(message),\n }),\n });\n },\n };\n}\n"],"mappings":";;;;;;AAQA,SAAgB,iBAAiB,SAAoC;CACnE,OAAO;EACL,UAAU;EACV,MAAM,SAAS;GACb,IAAI,QAAQ,UAAU,UAAU,MAAM,IAAI,MAAM,oDAAoD;GACpG,OAAOA,uBAAAA,qBAAqB;IAC1B,gBAAgB,QAAQ,eAAe,WAAW;IAClD,WAAW,YAAY,QAAQ,SAAS,OAAO;IAC/C,eACEC,wBAAAA,0BAA0B;KACxB,IAAI,QAAQ;KACZ,eAAe,QAAQ,iBAAiBC,cAAAA,SAAS,cAAc;KAC/D,aAAa,QAAQ,eAAeA,cAAAA,SAAS,YAAY;KACzD,WAAW,YAAY,QAAQ,SAAS,OAAO;IACjD,CAAC;GACL,CAAC;EACH;CACF;AACF"}
@@ -3,7 +3,7 @@ import "./packageApi.mjs";
3
3
  import { FileSystem } from "@earendil-works/pi-durable/env";
4
4
  //#region src/server/machineApi.d.ts
5
5
  /** Machine-owned provider credentials and model catalog, available without a session. */
6
- export declare function createMachineApi(_options: {
6
+ export declare function createMachineApi(options: {
7
7
  fs: FileSystem;
8
8
  }): PoApi;
9
9
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"machineApi.d.mts","names":[],"sources":["../src/server/machineApi.ts"],"mappings":";;;;;wBAYgB,iBAAiB;EAAY,IAAI;IAAe"}
1
+ {"version":3,"file":"machineApi.d.mts","names":[],"sources":["../src/server/machineApi.ts"],"mappings":";;;;;wBAQgB,iBAAiB;EAAW,IAAI;IAAe"}
@@ -1,15 +1,9 @@
1
1
  import { nodeHost } from "./src/services/nodeHost/index.mjs";
2
- import { piAgentDirectory } from "./src/services/piSettings/core.mjs";
3
- import { modelConfigDirectory } from "./src/services/piSettings/sync.mjs";
4
- import "./runtimePiSettings.mjs";
5
- import { registerChatgptAuthProvider } from "./src/services/chatgptLogin/index.mjs";
6
- import { preloadPiExtensions, resolvePiSettingsPackageEntries } from "./src/services/piExtensionHost/index.mjs";
2
+ import { createHostProviderRuntime } from "./src/server/providerRuntime.mjs";
7
3
  import { createProviderRoutes } from "./src/server/providerRoutes.mjs";
8
- import path from "node:path";
9
- import { ModelRuntime, SettingsManager } from "@earendil-works/pi-coding-agent";
10
4
  //#region src/server/machineApi.ts
11
5
  /** Machine-owned provider credentials and model catalog, available without a session. */
12
- function createMachineApi(_options) {
6
+ function createMachineApi(options) {
13
7
  return {
14
8
  basePath: "po",
15
9
  start(context) {
@@ -17,32 +11,12 @@ function createMachineApi(_options) {
17
11
  return createProviderRoutes({
18
12
  onChange: () => context.bumpRevision?.("providers"),
19
13
  onNotice: (message) => context.onNotice(message),
20
- runtime: async () => {
21
- const directory = piAgentDirectory(context.environment, context.homeDirectory);
22
- const modelDir = modelConfigDirectory(directory, context.homeDirectory);
23
- const runtime = await ModelRuntime.create({
24
- authPath: path.join(modelDir, "auth.json"),
25
- modelsPath: path.join(modelDir, "models.json")
26
- });
27
- registerChatgptAuthProvider(runtime);
28
- const onNotice = (message) => context.onNotice(message);
29
- const cwd = context.homeDirectory ?? nodeHost.homeDirectory();
30
- const settings = SettingsManager.create(cwd, directory);
31
- await preloadPiExtensions({
32
- cwd,
33
- agentDir: directory,
34
- models: runtime,
35
- extensionPaths: await resolvePiSettingsPackageEntries({
36
- cwd,
37
- agentDir: directory,
38
- settings,
39
- homeDirectory: context.homeDirectory,
40
- onNotice
41
- }),
42
- onNotice
43
- });
44
- return runtime;
45
- }
14
+ runtime: () => createHostProviderRuntime({
15
+ fs: options.fs,
16
+ homeDirectory: context.homeDirectory ?? nodeHost.homeDirectory(),
17
+ environment: context.environment ?? nodeHost.environment(),
18
+ onNotice: (message) => context.onNotice(message)
19
+ })
46
20
  });
47
21
  }
48
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"machineApi.mjs","names":[],"sources":["../src/server/machineApi.ts"],"sourcesContent":["import path from 'node:path';\n\nimport { ModelRuntime, SettingsManager } from '@earendil-works/pi-coding-agent';\nimport type { FileSystem } from '@earendil-works/pi-durable/env';\n\nimport type { PoApi } from '../exports/packageApi';\nimport { registerChatgptAuthProvider } from '../services/chatgptLogin';\nimport { nodeHost } from '../services/nodeHost';\nimport { preloadPiExtensions, resolvePiSettingsPackageEntries } from '../services/piExtensionHost';\nimport { modelConfigDirectory, piAgentDirectory } from '../services/piSettings';\nimport { createProviderRoutes } from './providerRoutes';\n/** Machine-owned provider credentials and model catalog, available without a session. */\nexport function createMachineApi(_options: { fs: FileSystem }): PoApi {\n return {\n basePath: 'po',\n start(context) {\n if (context.scope !== 'global') throw new Error('Provider authentication requires the global mount.');\n return createProviderRoutes({\n onChange: () => context.bumpRevision?.('providers'),\n onNotice: (message) => context.onNotice(message),\n runtime: async () => {\n const directory = piAgentDirectory(context.environment, context.homeDirectory);\n // Resolved as sessions resolve it (headlessSessionHost): with no model config of its\n // own, Po falls back to plain Pi's ~/.pi/agent, so this catalog matches the session picker.\n const modelDir = modelConfigDirectory(directory, context.homeDirectory);\n const runtime = await ModelRuntime.create({\n authPath: path.join(modelDir, 'auth.json'),\n modelsPath: path.join(modelDir, 'models.json'),\n });\n registerChatgptAuthProvider(runtime);\n // Providers registered by Pi settings packages (a Claude Code bridge, say) are\n // listed and pickable here as they are in sessions, which load the same packages.\n const onNotice = (message: string): void => context.onNotice(message);\n // Machine scope has no project, so the home directory stands in for Pi's cwd.\n const cwd = context.homeDirectory ?? nodeHost.homeDirectory();\n const settings = SettingsManager.create(cwd, directory);\n await preloadPiExtensions({\n cwd,\n agentDir: directory,\n models: runtime,\n extensionPaths: await resolvePiSettingsPackageEntries({\n cwd,\n agentDir: directory,\n settings,\n homeDirectory: context.homeDirectory,\n onNotice,\n }),\n onNotice,\n });\n return runtime;\n },\n });\n },\n };\n}\n"],"mappings":";;;;;;;;;;;AAYA,SAAgB,iBAAiB,UAAqC;CACpE,OAAO;EACL,UAAU;EACV,MAAM,SAAS;GACb,IAAI,QAAQ,UAAU,UAAU,MAAM,IAAI,MAAM,oDAAoD;GACpG,OAAO,qBAAqB;IAC1B,gBAAgB,QAAQ,eAAe,WAAW;IAClD,WAAW,YAAY,QAAQ,SAAS,OAAO;IAC/C,SAAS,YAAY;KACnB,MAAM,YAAY,iBAAiB,QAAQ,aAAa,QAAQ,aAAa;KAG7E,MAAM,WAAW,qBAAqB,WAAW,QAAQ,aAAa;KACtE,MAAM,UAAU,MAAM,aAAa,OAAO;MACxC,UAAU,KAAK,KAAK,UAAU,WAAW;MACzC,YAAY,KAAK,KAAK,UAAU,aAAa;KAC/C,CAAC;KACD,4BAA4B,OAAO;KAGnC,MAAM,YAAY,YAA0B,QAAQ,SAAS,OAAO;KAEpE,MAAM,MAAM,QAAQ,iBAAiB,SAAS,cAAc;KAC5D,MAAM,WAAW,gBAAgB,OAAO,KAAK,SAAS;KACtD,MAAM,oBAAoB;MACxB;MACA,UAAU;MACV,QAAQ;MACR,gBAAgB,MAAM,gCAAgC;OACpD;OACA,UAAU;OACV;OACA,eAAe,QAAQ;OACvB;MACF,CAAC;MACD;KACF,CAAC;KACD,OAAO;IACT;GACF,CAAC;EACH;CACF;AACF"}
1
+ {"version":3,"file":"machineApi.mjs","names":[],"sources":["../src/server/machineApi.ts"],"sourcesContent":["import type { FileSystem } from '@earendil-works/pi-durable/env';\n\nimport type { PoApi } from '../exports/packageApi';\nimport { nodeHost } from '../services/nodeHost';\nimport { createProviderRoutes } from './providerRoutes';\nimport { createHostProviderRuntime } from './providerRuntime';\n\n/** Machine-owned provider credentials and model catalog, available without a session. */\nexport function createMachineApi(options: { fs: FileSystem }): PoApi {\n return {\n basePath: 'po',\n start(context) {\n if (context.scope !== 'global') throw new Error('Provider authentication requires the global mount.');\n return createProviderRoutes({\n onChange: () => context.bumpRevision?.('providers'),\n onNotice: (message) => context.onNotice(message),\n runtime: () =>\n createHostProviderRuntime({\n fs: options.fs,\n homeDirectory: context.homeDirectory ?? nodeHost.homeDirectory(),\n environment: context.environment ?? nodeHost.environment(),\n onNotice: (message) => context.onNotice(message),\n }),\n });\n },\n };\n}\n"],"mappings":";;;;;AAQA,SAAgB,iBAAiB,SAAoC;CACnE,OAAO;EACL,UAAU;EACV,MAAM,SAAS;GACb,IAAI,QAAQ,UAAU,UAAU,MAAM,IAAI,MAAM,oDAAoD;GACpG,OAAO,qBAAqB;IAC1B,gBAAgB,QAAQ,eAAe,WAAW;IAClD,WAAW,YAAY,QAAQ,SAAS,OAAO;IAC/C,eACE,0BAA0B;KACxB,IAAI,QAAQ;KACZ,eAAe,QAAQ,iBAAiB,SAAS,cAAc;KAC/D,aAAa,QAAQ,eAAe,SAAS,YAAY;KACzD,WAAW,YAAY,QAAQ,SAAS,OAAO;IACjD,CAAC;GACL,CAAC;EACH;CACF;AACF"}
@@ -1,13 +1,33 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_modelGateway = require("./src/constants/modelGateway.cjs");
3
3
  const require_modelGateway$1 = require("./src/schemas/modelGateway.cjs");
4
- const require_index = require("./src/services/modelGatewayContainer/index.cjs");
5
- const require_index$1 = require("./src/services/modelGatewayHost/index.cjs");
4
+ const require_index = require("./src/services/modelGatewayWire/index.cjs");
5
+ const require_index$1 = require("./src/services/modelGatewayContainer/index.cjs");
6
+ const require_index$2 = require("./src/services/modelGatewayExecutor/index.cjs");
7
+ const require_index$3 = require("./src/services/modelGatewayHost/index.cjs");
8
+ const require_sharedModels = require("./src/schemas/sharedModels.cjs");
9
+ const require_providerRuntime = require("./src/server/providerRuntime.cjs");
10
+ let _earendil_works_pi_ai = require("@earendil-works/pi-ai");
6
11
  exports.MODEL_GATEWAY_CATALOG_TIMEOUT_MS = require_modelGateway.MODEL_GATEWAY_CATALOG_TIMEOUT_MS;
7
12
  exports.MODEL_GATEWAY_DEFAULT_CAPS = require_modelGateway.MODEL_GATEWAY_DEFAULT_CAPS;
13
+ exports.MODEL_GATEWAY_ERROR_EVENT = require_index.MODEL_GATEWAY_ERROR_EVENT;
8
14
  exports.MODEL_GATEWAY_FRAME_TYPE = require_modelGateway.MODEL_GATEWAY_FRAME_TYPE;
9
15
  exports.MODEL_GATEWAY_METHODS = require_modelGateway$1.MODEL_GATEWAY_METHODS;
10
16
  exports.MODEL_GATEWAY_SERVICE = require_modelGateway.MODEL_GATEWAY_SERVICE;
11
- exports.ModelGatewayError = require_index.ModelGatewayError;
12
- exports.createModelGatewayContainer = require_index.createModelGatewayContainer;
13
- exports.runModelGateway = require_index$1.runModelGateway;
17
+ exports.ModelGatewayError = require_index$1.ModelGatewayError;
18
+ exports.PO_HOST_REQUESTS_CONTRACT = require_sharedModels.PO_HOST_REQUESTS_CONTRACT;
19
+ exports.PO_SHARED_MODELS_CONTRACT = require_sharedModels.PO_SHARED_MODELS_CONTRACT;
20
+ Object.defineProperty(exports, "createAssistantMessageEventStream", {
21
+ enumerable: true,
22
+ get: function() {
23
+ return _earendil_works_pi_ai.createAssistantMessageEventStream;
24
+ }
25
+ });
26
+ exports.createHostProviderRuntime = require_providerRuntime.createHostProviderRuntime;
27
+ exports.createModelGatewayContainer = require_index$1.createModelGatewayContainer;
28
+ exports.createModelGatewayDecoder = require_index.createModelGatewayDecoder;
29
+ exports.createModelGatewayEncoder = require_index.createModelGatewayEncoder;
30
+ exports.createModelGatewayExecutor = require_index$2.createModelGatewayExecutor;
31
+ exports.failedAssistantMessage = require_index.failedAssistantMessage;
32
+ exports.modelGatewayOptions = require_index.modelGatewayOptions;
33
+ exports.runModelGateway = require_index$3.runModelGateway;
@@ -1,7 +1,13 @@
1
+ import { HostRequests, PO_HOST_REQUESTS_CONTRACT, PO_SHARED_MODELS_CONTRACT, SharedModels } from "./src/schemas/sharedModels.mjs";
1
2
  import { MODEL_GATEWAY_CATALOG_TIMEOUT_MS, MODEL_GATEWAY_DEFAULT_CAPS, MODEL_GATEWAY_FRAME_TYPE, MODEL_GATEWAY_SERVICE } from "./src/constants/modelGateway.mjs";
2
3
  import { MODEL_GATEWAY_METHODS, ModelGatewayCatalog, ModelGatewayChannelPayload, ModelGatewayDefaultModel, ModelGatewayPending, ModelGatewayRequest, ModelGatewayWireEvent } from "./src/schemas/modelGateway.mjs";
3
4
  import { ModelGatewayContainer, ModelGatewayContainerOptions } from "./src/services/modelGatewayContainer/type.mjs";
4
5
  import { ModelGatewayError, createModelGatewayContainer } from "./src/services/modelGatewayContainer/index.mjs";
5
6
  import { ModelGatewayCaps, ModelGatewayHostRuntime, ModelGatewayRunner, RunModelGatewayOptions } from "./src/services/modelGatewayHost/type.mjs";
6
7
  import { runModelGateway } from "./src/services/modelGatewayHost/index.mjs";
7
- export { MODEL_GATEWAY_CATALOG_TIMEOUT_MS, MODEL_GATEWAY_DEFAULT_CAPS, MODEL_GATEWAY_FRAME_TYPE, MODEL_GATEWAY_METHODS, MODEL_GATEWAY_SERVICE, type ModelGatewayCaps, type ModelGatewayCatalog, type ModelGatewayChannelPayload, type ModelGatewayContainer, type ModelGatewayContainerOptions, type ModelGatewayDefaultModel, ModelGatewayError, type ModelGatewayHostRuntime, type ModelGatewayPending, type ModelGatewayRequest, type ModelGatewayRunner, type ModelGatewayWireEvent, type RunModelGatewayOptions, createModelGatewayContainer, runModelGateway };
8
+ import { ModelGatewayAdmission, ModelGatewayExecutionOptions, ModelGatewayExecutorCaps, ModelGatewayExecutorOptions } from "./src/services/modelGatewayExecutor/type.mjs";
9
+ import { createModelGatewayExecutor } from "./src/services/modelGatewayExecutor/index.mjs";
10
+ import { MODEL_GATEWAY_ERROR_EVENT, createModelGatewayDecoder, createModelGatewayEncoder, failedAssistantMessage, modelGatewayOptions } from "./src/services/modelGatewayWire/index.mjs";
11
+ import { createHostProviderRuntime } from "./src/server/providerRuntime.mjs";
12
+ import { createAssistantMessageEventStream } from "@earendil-works/pi-ai";
13
+ export { type HostRequests, MODEL_GATEWAY_CATALOG_TIMEOUT_MS, MODEL_GATEWAY_DEFAULT_CAPS, MODEL_GATEWAY_ERROR_EVENT, MODEL_GATEWAY_FRAME_TYPE, MODEL_GATEWAY_METHODS, MODEL_GATEWAY_SERVICE, type ModelGatewayAdmission, type ModelGatewayCaps, type ModelGatewayCatalog, type ModelGatewayChannelPayload, type ModelGatewayContainer, type ModelGatewayContainerOptions, type ModelGatewayDefaultModel, ModelGatewayError, type ModelGatewayExecutionOptions, type ModelGatewayExecutorCaps, type ModelGatewayExecutorOptions, type ModelGatewayHostRuntime, type ModelGatewayPending, type ModelGatewayRequest, type ModelGatewayRunner, type ModelGatewayWireEvent, PO_HOST_REQUESTS_CONTRACT, PO_SHARED_MODELS_CONTRACT, type RunModelGatewayOptions, type SharedModels, createAssistantMessageEventStream, createHostProviderRuntime, createModelGatewayContainer, createModelGatewayDecoder, createModelGatewayEncoder, createModelGatewayExecutor, failedAssistantMessage, modelGatewayOptions, runModelGateway };
@@ -1,5 +1,10 @@
1
1
  import { MODEL_GATEWAY_CATALOG_TIMEOUT_MS, MODEL_GATEWAY_DEFAULT_CAPS, MODEL_GATEWAY_FRAME_TYPE, MODEL_GATEWAY_SERVICE } from "./src/constants/modelGateway.mjs";
2
2
  import { MODEL_GATEWAY_METHODS } from "./src/schemas/modelGateway.mjs";
3
+ import { MODEL_GATEWAY_ERROR_EVENT, createModelGatewayDecoder, createModelGatewayEncoder, failedAssistantMessage, modelGatewayOptions } from "./src/services/modelGatewayWire/index.mjs";
3
4
  import { ModelGatewayError, createModelGatewayContainer } from "./src/services/modelGatewayContainer/index.mjs";
5
+ import { createModelGatewayExecutor } from "./src/services/modelGatewayExecutor/index.mjs";
4
6
  import { runModelGateway } from "./src/services/modelGatewayHost/index.mjs";
5
- export { MODEL_GATEWAY_CATALOG_TIMEOUT_MS, MODEL_GATEWAY_DEFAULT_CAPS, MODEL_GATEWAY_FRAME_TYPE, MODEL_GATEWAY_METHODS, MODEL_GATEWAY_SERVICE, ModelGatewayError, createModelGatewayContainer, runModelGateway };
7
+ import { PO_HOST_REQUESTS_CONTRACT, PO_SHARED_MODELS_CONTRACT } from "./src/schemas/sharedModels.mjs";
8
+ import { createHostProviderRuntime } from "./src/server/providerRuntime.mjs";
9
+ import { createAssistantMessageEventStream } from "@earendil-works/pi-ai";
10
+ export { MODEL_GATEWAY_CATALOG_TIMEOUT_MS, MODEL_GATEWAY_DEFAULT_CAPS, MODEL_GATEWAY_ERROR_EVENT, MODEL_GATEWAY_FRAME_TYPE, MODEL_GATEWAY_METHODS, MODEL_GATEWAY_SERVICE, ModelGatewayError, PO_HOST_REQUESTS_CONTRACT, PO_SHARED_MODELS_CONTRACT, createAssistantMessageEventStream, createHostProviderRuntime, createModelGatewayContainer, createModelGatewayDecoder, createModelGatewayEncoder, createModelGatewayExecutor, failedAssistantMessage, modelGatewayOptions, runModelGateway };
@@ -161,11 +161,13 @@ function createRemoteRuntime(options) {
161
161
  const publicFileShareToken = (request, path) => new URL(request.url).pathname === path ? PUBLIC_FILE_SHARE_ROUTE.exec(path)?.[1] : void 0;
162
162
  const inFileShareNamespace = (request, path) => path.startsWith(PUBLIC_FILE_SHARE_NAMESPACE) || new URL(request.url).pathname.startsWith(PUBLIC_FILE_SHARE_NAMESPACE);
163
163
  app.use("*", async (context, next) => {
164
+ const rawPath = context.env.incoming?.url?.split("?")[0];
165
+ const publicGatewayPeer = context.env.listener === "tunnel" && context.req.header("x-po-host-proof") !== void 0 && (context.req.method === "GET" && rawPath === "/api/plugins/gateway/catalog" || context.req.method === "POST" && rawPath === "/api/plugins/gateway/calls");
164
166
  if (context.req.path.startsWith("/api/network/") || /^\/api\/networks\/[^/]+\/network\//.test(context.req.path)) {
165
167
  const result = await defaultFederation?.requestNetwork(context.req.raw);
166
168
  if (result) return result;
167
169
  }
168
- if (context.req.header("x-po-federation-envelope") && context.req.path.includes("/plugins/")) {
170
+ if (!publicGatewayPeer && context.req.header("x-po-federation-envelope") && context.req.path.includes("/plugins/")) {
169
171
  const request = context.req.raw;
170
172
  if (!await options.federationPlatform?.resolve(request.clone())) return context.json({
171
173
  status: "unavailable",
@@ -189,7 +191,7 @@ function createRemoteRuntime(options) {
189
191
  const publicFileShare = (context.req.method === "GET" || context.req.method === "HEAD") && publicFileShareToken(context.req.raw, path) !== void 0;
190
192
  const verdict = require_index$5.originVerdict({
191
193
  listener: "tunnel",
192
- method: publicSessionMcp || publicSessionPeer || publicVoicePeer ? "GET" : context.req.method,
194
+ method: publicSessionMcp || publicSessionPeer || publicVoicePeer || publicGatewayPeer ? "GET" : context.req.method,
193
195
  isUpgrade: false,
194
196
  origin: context.req.header("origin"),
195
197
  host: context.req.header("host"),
@@ -197,6 +199,14 @@ function createRemoteRuntime(options) {
197
199
  tunnel: remote.tunnelPolicy()
198
200
  });
199
201
  if (verdict !== "allow") return context.json({ error: `Tunnel request refused: ${verdict}.` }, 403);
202
+ if (publicGatewayPeer) {
203
+ const headers = new Headers(context.req.raw.headers);
204
+ for (const name of require_packageApi.PO_API_CALLER_HEADERS) headers.delete(name);
205
+ headers.delete("x-po-identity-token");
206
+ headers.delete("x-po-federation-envelope");
207
+ headers.delete("x-po-federation-grant");
208
+ return options.forward(new Request(context.req.raw, { headers }));
209
+ }
200
210
  if (publicFileShare) return next();
201
211
  if (inFileShareNamespace(context.req.raw, path)) return context.json({ error: "Not found." }, 404);
202
212
  if (require_index$5.isPublicPairingRoute(context.req.method, path) || publicSessionMcp || publicSessionPeer || publicVoicePeer) return next();
@@ -662,6 +672,7 @@ function createRemoteRuntime(options) {
662
672
  await defaultFederation.acceptNetworkRelay(socket, url);
663
673
  },
664
674
  networkPeer: () => defaultFederation?.networkPeer() ?? Promise.resolve(void 0),
675
+ hostRequests: () => defaultFederation?.hostRequests() ?? Promise.resolve(void 0),
665
676
  accountCall: (operation, input) => defaultFederation?.accountCall(operation, input) ?? Promise.resolve(void 0),
666
677
  startNetwork: () => defaultFederation?.startNetwork() ?? Promise.resolve(),
667
678
  fetchLocal: async (request) => app.fetch(request, { listener: "local" }),