@codions/portta 0.0.0-develop.174.sha-9f22fb0 → 0.0.0-develop.178.sha-7d97293

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/host.js CHANGED
@@ -40981,6 +40981,7 @@ var DEFAULT_CONFIG = {
40981
40981
  profiles: { default: DEFAULT_PROFILE },
40982
40982
  exposure: { local: { provider: "loopback", autoExpose: "all" } },
40983
40983
  agents: {},
40984
+ providers: {},
40984
40985
  services: [],
40985
40986
  startupEnvs: {},
40986
40987
  integrations: {
@@ -41127,6 +41128,32 @@ function parseCustomAgents(raw2) {
41127
41128
  return acc;
41128
41129
  }, {});
41129
41130
  }
41131
+ function cloneAcpProviders(providers) {
41132
+ return Object.fromEntries(
41133
+ Object.entries(providers).map(([id, provider]) => [id, { ...provider, args: [...provider.args] }])
41134
+ );
41135
+ }
41136
+ function parseAcpProvider(id, raw2) {
41137
+ if (!isRecord(raw2)) return null;
41138
+ if (typeof raw2.command !== "string" || !raw2.command.trim()) return null;
41139
+ return {
41140
+ label: typeof raw2.label === "string" && raw2.label.trim() ? raw2.label.trim() : id,
41141
+ command: raw2.command.trim(),
41142
+ args: Array.isArray(raw2.args) ? raw2.args.filter((entry) => typeof entry === "string") : []
41143
+ };
41144
+ }
41145
+ function parseAcpProviders(raw2) {
41146
+ if (!isRecord(raw2)) return {};
41147
+ return Object.entries(raw2).reduce((acc, [id, value]) => {
41148
+ const key = id.trim();
41149
+ if (!key) return acc;
41150
+ const parsed = parseAcpProvider(key, value);
41151
+ if (parsed) {
41152
+ acc[key] = parsed;
41153
+ }
41154
+ return acc;
41155
+ }, {});
41156
+ }
41130
41157
  function parseServices(raw2) {
41131
41158
  if (!Array.isArray(raw2)) return [];
41132
41159
  return raw2.filter(isRecord).filter((entry) => typeof entry.name === "string" && typeof entry.portEnv === "string").map((entry) => ({
@@ -41222,6 +41249,7 @@ function parseProjectConfig(parsed) {
41222
41249
  profiles: parseProfiles(parsed.profiles, true),
41223
41250
  exposure: parseExposure(parsed.exposure),
41224
41251
  agents: {},
41252
+ providers: parseAcpProviders(parsed.providers),
41225
41253
  services: parseServices(parsed.services),
41226
41254
  startupEnvs: parseStartupEnvs(parsed.startupEnvs),
41227
41255
  integrations: {
@@ -41296,6 +41324,7 @@ function loadLocalProjectConfigOverlay(root) {
41296
41324
  worktreeRoot: null,
41297
41325
  profiles: {},
41298
41326
  agents: {},
41327
+ providers: {},
41299
41328
  lifecycleHooks: {},
41300
41329
  linear: null,
41301
41330
  github: null,
@@ -41309,6 +41338,7 @@ function loadLocalProjectConfigOverlay(root) {
41309
41338
  worktreeRoot: ws ? parseWorktreeRoot(ws, "") || null : null,
41310
41339
  profiles: parseProfiles(parsed.profiles, false),
41311
41340
  agents: parseCustomAgents(parsed.agents),
41341
+ providers: parseAcpProviders(parsed.providers),
41312
41342
  lifecycleHooks: parseLifecycleHooks(parsed.lifecycleHooks),
41313
41343
  linear: parseLocalLinearOverlay(parsed),
41314
41344
  github: parseLocalGitHubOverlay(parsed),
@@ -41320,6 +41350,7 @@ function loadLocalProjectConfigOverlay(root) {
41320
41350
  worktreeRoot: null,
41321
41351
  profiles: {},
41322
41352
  agents: {},
41353
+ providers: {},
41323
41354
  lifecycleHooks: {},
41324
41355
  linear: null,
41325
41356
  github: null,
@@ -41394,6 +41425,10 @@ function loadConfig(dir, options = {}) {
41394
41425
  ...cloneAgents(projectConfig.agents),
41395
41426
  ...cloneAgents(localOverlay.agents)
41396
41427
  },
41428
+ providers: {
41429
+ ...cloneAcpProviders(projectConfig.providers),
41430
+ ...cloneAcpProviders(localOverlay.providers)
41431
+ },
41397
41432
  lifecycleHooks: mergeLifecycleHooks(projectConfig.lifecycleHooks, localOverlay.lifecycleHooks),
41398
41433
  integrations
41399
41434
  };
@@ -60904,11 +60939,11 @@ var RoutingDirectSessionService = class {
60904
60939
  }
60905
60940
  };
60906
60941
 
60907
- // ../host/src/modules/taskflow/services/acp-worker-factory.ts
60908
- import { setTimeout as delay2 } from "node:timers/promises";
60909
-
60910
60942
  // ../host/src/modules/taskflow/workflows/dsl/types.ts
60911
- var PROVIDER_IDS = ["codex", "claude-code", "opencode", "pi"];
60943
+ var BUILTIN_PROVIDER_IDS = ["codex", "claude-code", "opencode", "pi"];
60944
+ function isBuiltinProvider(id) {
60945
+ return BUILTIN_PROVIDER_IDS.includes(id);
60946
+ }
60912
60947
  function emptyUsage() {
60913
60948
  return { inputTokens: 0, outputTokens: 0, costUsd: 0 };
60914
60949
  }
@@ -60929,6 +60964,31 @@ var DEFAULTS = {
60929
60964
  budget: null
60930
60965
  };
60931
60966
 
60967
+ // ../host/src/modules/taskflow/services/acp-providers.ts
60968
+ var BUILTIN_ACP_PROVIDERS = {
60969
+ codex: { label: "Codex", command: "codex-acp", args: [] },
60970
+ "claude-code": { label: "Claude Code", command: "claude-agent-acp", args: [] },
60971
+ opencode: { label: "OpenCode", command: "opencode", args: ["acp"] },
60972
+ pi: { label: "Pi", command: "pi-acp", args: [] }
60973
+ };
60974
+ function resolveAcpProviders(declared) {
60975
+ const registry2 = /* @__PURE__ */ new Map();
60976
+ for (const id of BUILTIN_PROVIDER_IDS) {
60977
+ const provider = BUILTIN_ACP_PROVIDERS[id];
60978
+ registry2.set(id, { id, label: provider.label, command: provider.command, args: [...provider.args], builtin: true });
60979
+ }
60980
+ for (const [id, provider] of Object.entries(declared)) {
60981
+ registry2.set(id, { id, label: provider.label, command: provider.command, args: [...provider.args], builtin: false });
60982
+ }
60983
+ return registry2;
60984
+ }
60985
+ function availableProviders(registry2) {
60986
+ return Array.from(registry2.keys()).join(", ");
60987
+ }
60988
+
60989
+ // ../host/src/modules/taskflow/services/acp-worker-factory.ts
60990
+ import { setTimeout as delay2 } from "node:timers/promises";
60991
+
60932
60992
  // ../host/src/modules/taskflow/workflows/runtime/journal.ts
60933
60993
  import { appendFileSync, existsSync as existsSync3, mkdirSync as mkdirSync6, readdirSync as readdirSync2, readFileSync as readFileSync5, writeFileSync as writeFileSync3 } from "node:fs";
60934
60994
  import { dirname as dirname12, join as join15 } from "node:path";
@@ -63787,6 +63847,13 @@ var DefaultWorkerFactory = class {
63787
63847
  }
63788
63848
  create(id) {
63789
63849
  if (this.opts.fake) return new FakeWorker();
63850
+ if (!isBuiltinProvider(id)) {
63851
+ throw new AgentError({
63852
+ provider: id,
63853
+ code: "unknown_provider",
63854
+ message: `unknown provider: ${id} \u2014 the workflow engine runs ${BUILTIN_PROVIDER_IDS.join(", ")}; a provider declared in taskflow.yaml needs the ACP transport`
63855
+ });
63856
+ }
63790
63857
  switch (id) {
63791
63858
  case "codex":
63792
63859
  return new CodexWorker({ bin: this.opts.codexBin });
@@ -64146,7 +64213,6 @@ var WorkflowError = class extends Error {
64146
64213
  var AgentFailedError = class extends WorkflowError {
64147
64214
  };
64148
64215
  var SPEC_ENUMS = {
64149
- provider: PROVIDER_IDS,
64150
64216
  sandbox: ["read-only", "workspace-write", "danger-full-access"],
64151
64217
  effort: ["none", "minimal", "low", "medium", "high", "xhigh", "max"],
64152
64218
  approval: ["never", "on-request"]
@@ -64157,6 +64223,11 @@ function checkSpecEnum(field, value) {
64157
64223
  throw new WorkflowError(`invalid ${field} "${value}" \u2014 must be one of ${allowed.join(", ")}`);
64158
64224
  }
64159
64225
  }
64226
+ function checkProvider(value, known) {
64227
+ if (value !== void 0 && !known.includes(value)) {
64228
+ throw new WorkflowError(`invalid provider "${value}" \u2014 must be one of ${known.join(", ")}`);
64229
+ }
64230
+ }
64160
64231
  function checkProviderModelPair(provider, model, site) {
64161
64232
  if (provider === void 0 === (model === void 0)) return;
64162
64233
  const given = provider !== void 0 ? `provider "${provider}" without model` : `model "${model}" without provider`;
@@ -64274,7 +64345,7 @@ var Runtime = class {
64274
64345
  schema: opts?.schema,
64275
64346
  maxTurns: opts?.maxTurns
64276
64347
  };
64277
- checkSpecEnum("provider", spec.provider);
64348
+ checkProvider(spec.provider, this.o.knownProviders ?? BUILTIN_PROVIDER_IDS);
64278
64349
  checkSpecEnum("sandbox", spec.sandbox);
64279
64350
  checkSpecEnum("effort", spec.effort);
64280
64351
  checkSpecEnum("approval", spec.approval);
@@ -64874,6 +64945,7 @@ async function runWorkflow(opts) {
64874
64945
  runId,
64875
64946
  defaults,
64876
64947
  factory,
64948
+ knownProviders: opts.knownProviders ?? BUILTIN_PROVIDER_IDS,
64877
64949
  journal,
64878
64950
  loaded,
64879
64951
  events,
@@ -64923,7 +64995,7 @@ function resolveDefaults(meta3, opts) {
64923
64995
  checkSpecEnum("sandbox", sandbox);
64924
64996
  checkSpecEnum("effort", o.effort);
64925
64997
  const provider = o.provider ?? meta3.defaultProvider ?? DEFAULTS.provider;
64926
- checkSpecEnum("provider", provider);
64998
+ checkProvider(provider, opts.knownProviders ?? BUILTIN_PROVIDER_IDS);
64927
64999
  checkProviderModelPair(o.provider, o.model, "--provider/--model");
64928
65000
  checkProviderModelPair(meta3.defaultProvider, meta3.defaultModel, "meta.defaultProvider/defaultModel");
64929
65001
  const configuredCwd = o.cwd ?? opts.roots?.workspaceRoot;
@@ -64957,12 +65029,6 @@ function randomSeed() {
64957
65029
  var PORTTA_FLOW_WORKER_PROTOCOL_VERSION = 1;
64958
65030
 
64959
65031
  // ../host/src/modules/taskflow/services/acp-worker-factory.ts
64960
- var launchByProvider = {
64961
- codex: { command: "codex-acp", args: [] },
64962
- "claude-code": { command: "claude-agent-acp", args: [] },
64963
- opencode: { command: "opencode", args: ["acp"] },
64964
- pi: { command: "pi-acp", args: [] }
64965
- };
64966
65032
  function eventProgress(event, context) {
64967
65033
  if (event.type !== "agent.update" || typeof event.payload !== "object" || event.payload === null) return;
64968
65034
  const payload = Array.isArray(event.payload) ? null : event.payload;
@@ -64985,13 +65051,15 @@ function eventProgress(event, context) {
64985
65051
  }
64986
65052
  var AcpWorker = class {
64987
65053
  id;
65054
+ launch;
64988
65055
  supervisor;
64989
65056
  runId;
64990
65057
  permissionMode;
64991
65058
  mcpServers;
64992
65059
  resolveExecution;
64993
- constructor(id, supervisor, runId, permissionMode, mcpServers, resolveExecution) {
64994
- this.id = id;
65060
+ constructor(provider, supervisor, runId, permissionMode, mcpServers, resolveExecution) {
65061
+ this.id = provider.id;
65062
+ this.launch = { command: provider.command, args: provider.args };
64995
65063
  this.supervisor = supervisor;
64996
65064
  this.runId = runId;
64997
65065
  this.permissionMode = permissionMode;
@@ -64999,7 +65067,7 @@ var AcpWorker = class {
64999
65067
  this.resolveExecution = resolveExecution;
65000
65068
  }
65001
65069
  async runAgent(spec, context) {
65002
- const launch = launchByProvider[this.id];
65070
+ const launch = this.launch;
65003
65071
  const operationId = `${this.runId}:${context.operationKey ?? crypto.randomUUID()}`;
65004
65072
  const route = this.resolveExecution(spec.cwd);
65005
65073
  await this.supervisor.start({
@@ -65049,13 +65117,15 @@ var AcpWorker = class {
65049
65117
  var AcpWorkerFactory = class {
65050
65118
  workers = /* @__PURE__ */ new Map();
65051
65119
  supervisor;
65120
+ providers;
65052
65121
  runId;
65053
65122
  permissionMode;
65054
65123
  mcpServers;
65055
65124
  resolveExecution;
65056
65125
  onShutdown;
65057
- constructor(supervisor, runId, permissionMode, mcpServers, resolveExecution, onShutdown) {
65126
+ constructor(supervisor, providers, runId, permissionMode, mcpServers, resolveExecution, onShutdown) {
65058
65127
  this.supervisor = supervisor;
65128
+ this.providers = providers;
65059
65129
  this.runId = runId;
65060
65130
  this.permissionMode = permissionMode;
65061
65131
  this.mcpServers = mcpServers;
@@ -65065,8 +65135,16 @@ var AcpWorkerFactory = class {
65065
65135
  get(id) {
65066
65136
  const existing = this.workers.get(id);
65067
65137
  if (existing) return existing;
65138
+ const provider = this.providers.get(id);
65139
+ if (!provider) {
65140
+ throw new AgentError({
65141
+ provider: id,
65142
+ code: "unknown_provider",
65143
+ message: `unknown provider "${id}" \u2014 available: ${availableProviders(this.providers)}`
65144
+ });
65145
+ }
65068
65146
  const worker = new AcpWorker(
65069
- id,
65147
+ provider,
65070
65148
  this.supervisor,
65071
65149
  this.runId,
65072
65150
  this.permissionMode,
@@ -68862,10 +68940,12 @@ var NodeWorkflowRunner = class {
68862
68940
  invoke;
68863
68941
  createExecutionPort;
68864
68942
  createWorkerFactory;
68943
+ knownProviders;
68865
68944
  constructor(dependencies = {}) {
68866
68945
  this.invoke = dependencies.runWorkflow ?? runWorkflow;
68867
68946
  this.createExecutionPort = dependencies.createExecutionPort;
68868
68947
  this.createWorkerFactory = dependencies.createWorkerFactory;
68948
+ this.knownProviders = dependencies.knownProviders;
68869
68949
  }
68870
68950
  run(spec, control = {}) {
68871
68951
  const emit = control.onMessage ?? (() => {
@@ -68897,6 +68977,7 @@ var NodeWorkflowRunner = class {
68897
68977
  roots: { dataRoot: spec.spec.dataRoot, workspaceRoot: spec.spec.cwd },
68898
68978
  externalContext: spec.spec.externalContext,
68899
68979
  factory: this.createWorkerFactory?.(spec) ?? new DefaultWorkerFactory(spec.spec.fake ? { fake: true } : { fake: false, ...resolveWorkerBins() }),
68980
+ knownProviders: this.knownProviders?.(spec),
68900
68981
  executionPort: this.createExecutionPort?.(spec),
68901
68982
  signal: abort.signal,
68902
68983
  onEvent: (event) => {
@@ -70896,6 +70977,7 @@ function createProjectApp(runtime, instancePrefix, host) {
70896
70977
  const PROJECT_DIR = runtime.projectDir;
70897
70978
  const installationId = `${RUNTIME_IDENTITY.tmuxPrefix}-${PORT}`;
70898
70979
  const config2 = runtime.config;
70980
+ const acpProviders = resolveAcpProviders(config2.providers);
70899
70981
  const git2 = runtime.git;
70900
70982
  const archiveStateService = runtime.archiveStateService;
70901
70983
  const sessions2 = runtime.sessions;
@@ -71013,6 +71095,7 @@ function createProjectApp(runtime, instancePrefix, host) {
71013
71095
  terminalCommand: terminalCommandForEnvironment
71014
71096
  },
71015
71097
  workflowRunner: new NodeWorkflowRunner({
71098
+ knownProviders: (spec) => workflowAgentRuntimeConfig(spec.spec.agentRuntime).transport === "acp" ? [...acpProviders.keys()] : BUILTIN_PROVIDER_IDS,
71016
71099
  createWorkerFactory: (spec) => {
71017
71100
  const agentRuntime = workflowAgentRuntimeConfig(spec.spec.agentRuntime);
71018
71101
  if (agentRuntime.transport === "acp") {
@@ -71021,6 +71104,7 @@ function createProjectApp(runtime, instancePrefix, host) {
71021
71104
  workflowEnvironmentPaths.set(spec.runId, paths2);
71022
71105
  return new AcpWorkerFactory(
71023
71106
  supervisor,
71107
+ acpProviders,
71024
71108
  spec.runId,
71025
71109
  agentRuntime.permissionMode,
71026
71110
  agentRuntime.mcpServers,
@@ -72406,7 +72490,7 @@ function createDaemonTaskflowHost(context) {
72406
72490
  port: hostListen(env2).port,
72407
72491
  workflowBuiltinsDir: taskflowAssets(env2).workflowBuiltinsDir,
72408
72492
  version: env2.PORTTA_VERSION || "0.0.0-local",
72409
- buildDate: true ? "2026-09-18T02:50:11Z" : (/* @__PURE__ */ new Date()).toISOString(),
72493
+ buildDate: true ? "2026-09-18T03:42:39Z" : (/* @__PURE__ */ new Date()).toISOString(),
72410
72494
  environmentStore: createEnvironmentStore(paths.database),
72411
72495
  hostEnvironmentProvider: new HostEnvironmentProvider(),
72412
72496
  devContainerProvider: new DevContainerProvider(),
@@ -1 +1 @@
1
- 0.0.0-develop.174.sha-9f22fb0
1
+ 0.0.0-develop.178.sha-7d97293
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codions/portta",
3
- "version": "0.0.0-develop.174.sha-9f22fb0",
3
+ "version": "0.0.0-develop.178.sha-7d97293",
4
4
  "description": "Machine-first CLI for a shared Docker development gateway",
5
5
  "license": "MIT",
6
6
  "type": "module",