@codions/portta 0.0.0-develop.176.sha-17c2847 → 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/cli.js +191 -25
- package/dist/documentation.json +1 -1
- package/dist/host.js +103 -19
- package/dist/runtime/VERSION +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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-18T03:
|
|
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(),
|
package/dist/runtime/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.0.0-develop.
|
|
1
|
+
0.0.0-develop.178.sha-7d97293
|
package/package.json
CHANGED