taskmeld 0.1.2 → 0.1.41
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/README.md +176 -176
- package/README.zh-CN.md +176 -176
- package/dist/src/app/app-context-env.js +1 -1
- package/dist/src/app/create-app-context.js +3 -3
- package/dist/src/app/data-dir.js +13 -3
- package/dist/src/app/pipeline-config.js +4 -4
- package/dist/src/app/pipeline-registry.js +11 -11
- package/dist/src/app/pipeline-runtime.js +6 -9
- package/dist/src/app/runtime-store.js +3 -3
- package/dist/src/artifacts/artifact-cleanup.js +17 -17
- package/dist/src/artifacts/artifact-index.js +14 -14
- package/dist/src/artifacts/artifact-rebuilder.js +3 -3
- package/dist/src/artifacts/storage-service.js +18 -18
- package/dist/src/cli/bootstrap.js +7 -7
- package/dist/src/cli/commands/agent.js +12 -11
- package/dist/src/cli/commands/artifact.js +31 -30
- package/dist/src/cli/commands/init.js +49 -47
- package/dist/src/cli/commands/pipeline/result.js +9 -8
- package/dist/src/cli/commands/pipeline/selector.js +1 -1
- package/dist/src/cli/commands/pipeline/watch.js +2 -2
- package/dist/src/cli/commands/pipeline.js +54 -53
- package/dist/src/cli/commands/scheduler.js +9 -8
- package/dist/src/cli/commands/server.js +12 -11
- package/dist/src/cli/commands/system.js +4 -3
- package/dist/src/cli/errors.js +2 -2
- package/dist/src/cli/help.js +18 -17
- package/dist/src/cli/i18n.js +46 -0
- package/dist/src/cli/locales/en.json +244 -0
- package/dist/src/cli/locales/zh.json +244 -0
- package/dist/src/cli/output.js +3 -3
- package/dist/src/cli/renderers/engine/markdown.js +1 -1
- package/dist/src/cli/renderers/specs/index.js +1 -1
- package/dist/src/cli/router.js +1 -1
- package/dist/src/cli/server-runtime-client.js +54 -95
- package/dist/src/cli/ui-prompts.js +96 -0
- package/dist/src/cli/ws-runtime-client.js +51 -0
- package/dist/src/gateway/gateway-client.js +4 -4
- package/dist/src/index.js +28 -2
- package/dist/src/logs/run-log-reader.js +1 -1
- package/dist/src/pipeline/agent-activity.js +2 -2
- package/dist/src/pipeline/artifact-storage.js +11 -11
- package/dist/src/pipeline/diagnostics/dependency-diagnostic.js +11 -11
- package/dist/src/pipeline/dispatch/pipeline-inbound-queue.js +2 -2
- package/dist/src/pipeline/execution/group-item-executor.js +1 -1
- package/dist/src/pipeline/execution/node-item-executor.js +3 -3
- package/dist/src/pipeline/execution/node-runner.js +7 -7
- package/dist/src/pipeline/execution/readiness-state.js +1 -1
- package/dist/src/pipeline/execution/reject-handler.js +5 -5
- package/dist/src/pipeline/execution/rejected-artifact-archiver.js +1 -1
- package/dist/src/pipeline/execution/route-item-manager.js +4 -4
- package/dist/src/pipeline/execution/run-abort-controller.js +5 -5
- package/dist/src/pipeline/execution/run-state-helpers.js +2 -2
- package/dist/src/pipeline/execution/service.js +4 -4
- package/dist/src/pipeline/execution/structured-node-runner.js +24 -24
- package/dist/src/pipeline/execution-timeout.js +3 -3
- package/dist/src/pipeline/identity/index.js +3 -3
- package/dist/src/pipeline/item-batch-controller.js +6 -6
- package/dist/src/pipeline/scheduler/dependency-state.js +5 -5
- package/dist/src/pipeline/scheduler-service.js +24 -24
- package/dist/src/pipeline/state-machine.js +2 -2
- package/dist/src/pipeline/structured-output/contract.js +4 -4
- package/dist/src/pipeline/structured-output/index.js +2 -2
- package/dist/src/pipeline/structured-output/parser.js +5 -5
- package/dist/src/pipeline/structured-output/prompt.js +38 -38
- package/dist/src/pipeline/structured-output/waiter.js +6 -6
- package/dist/src/pipeline/template.js +5 -5
- package/dist/src/pipeline/timeline-log-store.js +5 -5
- package/dist/src/pipeline/tool-activity.js +3 -3
- package/dist/src/pipeline/types/pipeline-output.js +1 -1
- package/dist/src/pipeline/workflow/branch-rules.js +19 -19
- package/dist/src/pipeline/workflow/io.js +1 -1
- package/dist/src/pipeline/workflow/normalize.js +18 -18
- package/dist/src/pipeline/workflow/template-mapper.js +3 -3
- package/dist/src/pipeline/workflow/validate.js +39 -39
- package/dist/src/pipeline/workflow-graph.js +10 -10
- package/dist/src/server/http-handler.js +74 -0
- package/dist/src/services/agent-service.js +2 -2
- package/dist/src/services/gateway-read-helpers.js +1 -1
- package/dist/src/services/pipeline-service.js +19 -19
- package/dist/src/services/pipeline-status.js +4 -4
- package/dist/src/services/read-services.js +1 -1
- package/dist/src/services/session-service.js +6 -6
- package/dist/src/services/system-service.js +1 -1
- package/dist/src/transport/ws-broker.js +12 -1
- package/dist/src/transport/ws-handler.js +60 -0
- package/dist/src/transport/ws-methods/agents.js +144 -0
- package/dist/src/transport/ws-methods/artifacts.js +171 -0
- package/dist/src/transport/ws-methods/gateway.js +16 -0
- package/dist/src/transport/ws-methods/logs.js +43 -0
- package/dist/src/transport/ws-methods/pipeline-batch.js +68 -0
- package/dist/src/transport/ws-methods/pipeline-links.js +100 -0
- package/dist/src/transport/ws-methods/pipeline-queue.js +51 -0
- package/dist/src/transport/ws-methods/pipeline-runtime.js +151 -0
- package/dist/src/transport/ws-methods/pipeline-scheduler.js +48 -0
- package/dist/src/transport/ws-methods/pipeline-workflow.js +127 -0
- package/dist/src/transport/ws-methods/pipelines.js +56 -0
- package/dist/src/transport/ws-methods/register-all.js +32 -0
- package/dist/src/transport/ws-methods/sessions.js +154 -0
- package/dist/src/transport/ws-methods/timeline.js +10 -0
- package/dist/src/{server/routes/pipeline-identity.js → transport/ws-methods/utils.js} +14 -9
- package/dist/src/version.js +1 -1
- package/package.json +15 -7
- package/web/dist/assets/agent-DP6TMcLj.js +1 -0
- package/web/dist/assets/agent-DmJHzLyj.js +1 -0
- package/web/dist/assets/artifact-BqnoZy2M.js +1 -0
- package/web/dist/assets/artifact-DfDkgkno.js +1 -0
- package/web/dist/assets/common-DRMTVwE9.js +1 -0
- package/web/dist/assets/common-DeXccbr2.js +1 -0
- package/web/dist/assets/dispatch-CBskGCQI.js +1 -0
- package/web/dist/assets/dispatch-sk4Wp30e.js +1 -0
- package/web/dist/assets/index-C8wTjZvH.css +1 -0
- package/web/dist/assets/index-DYDQZRLk.js +58 -0
- package/web/dist/assets/log-DN8cjb0w.js +1 -0
- package/web/dist/assets/log-HSeA_dYy.js +1 -0
- package/web/dist/assets/modal-BdNai9jf.js +1 -0
- package/web/dist/assets/modal-D9_KDpFD.js +1 -0
- package/web/dist/assets/nav-BmF7oAKg.js +1 -0
- package/web/dist/assets/nav-IjC2xqXQ.js +1 -0
- package/web/dist/assets/node-detail-CENRXcrh.js +1 -0
- package/web/dist/assets/node-detail-bndPr0IM.js +1 -0
- package/web/dist/assets/overview-B87zWAxq.js +1 -0
- package/web/dist/assets/overview-gQvk-NOK.js +1 -0
- package/web/dist/assets/pipeline-D4dSJRDz.js +1 -0
- package/web/dist/assets/pipeline-DZzyOqQa.js +1 -0
- package/web/dist/assets/session-CUWvU14v.js +5 -0
- package/web/dist/assets/session-DQ6UuCaJ.js +5 -0
- package/web/dist/assets/timeline-8y_2_0Em.js +1 -0
- package/web/dist/assets/timeline-CAPsXUTC.js +1 -0
- package/web/dist/index.html +3 -3
- package/dist/src/app/pipeline-plugin-config.js +0 -2
- package/dist/src/server/api-handler.js +0 -163
- package/dist/src/server/http-utils.js +0 -34
- package/dist/src/server/middleware.js +0 -61
- package/dist/src/server/router.js +0 -105
- package/dist/src/server/routes/agents.js +0 -189
- package/dist/src/server/routes/artifacts.js +0 -163
- package/dist/src/server/routes/gateway.js +0 -18
- package/dist/src/server/routes/health.js +0 -16
- package/dist/src/server/routes/logs.js +0 -73
- package/dist/src/server/routes/pipeline-batch.js +0 -163
- package/dist/src/server/routes/pipeline-diagnostics.js +0 -33
- package/dist/src/server/routes/pipeline-links.js +0 -117
- package/dist/src/server/routes/pipeline-outputs.js +0 -27
- package/dist/src/server/routes/pipeline-queue.js +0 -62
- package/dist/src/server/routes/pipeline-runtime.js +0 -162
- package/dist/src/server/routes/pipeline-scheduler.js +0 -69
- package/dist/src/server/routes/pipeline-workflow.js +0 -180
- package/dist/src/server/routes/pipelines.js +0 -96
- package/dist/src/server/routes/sessions.js +0 -244
- package/dist/src/server/routes/timeline.js +0 -14
- package/dist/src/server/serve-static.js +0 -42
- package/web/dist/assets/index-CWnfhkn-.js +0 -65
- package/web/dist/assets/index-gZ0xOfSO.css +0 -1
- /package/dist/src/{server → transport/ws-methods}/types.js +0 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerPipelineWorkflowWsMethods = void 0;
|
|
4
|
+
const template_1 = require("../../pipeline/template");
|
|
5
|
+
const pipeline_config_1 = require("../../app/pipeline-config");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
const registerPipelineWorkflowWsMethods = (registry) => {
|
|
8
|
+
// pipeline.plugins.get
|
|
9
|
+
registry.register("pipeline.plugins.get", (params, ctx) => {
|
|
10
|
+
const pipelineId = typeof params.pipelineId === "string" ? params.pipelineId : "";
|
|
11
|
+
const runtime = ctx.app.getPipelineRuntime(pipelineId);
|
|
12
|
+
if (!runtime)
|
|
13
|
+
return { ok: false, error: "pipeline_not_found" };
|
|
14
|
+
const workflow = runtime.workflow.getWorkflow();
|
|
15
|
+
if (!workflow)
|
|
16
|
+
return { ok: false, error: "workflow_api_not_enabled" };
|
|
17
|
+
return { ok: true, payload: { ok: true, state: workflow.plugins, pipelineId } };
|
|
18
|
+
});
|
|
19
|
+
// pipeline.plugins.save
|
|
20
|
+
registry.register("pipeline.plugins.save", async (params, ctx) => {
|
|
21
|
+
const pipelineId = typeof params.pipelineId === "string" ? params.pipelineId : "";
|
|
22
|
+
const runtime = ctx.app.getPipelineRuntime(pipelineId);
|
|
23
|
+
const definition = ctx.app.getPipelineDefinition(pipelineId);
|
|
24
|
+
if (!runtime || !definition)
|
|
25
|
+
return { ok: false, error: "pipeline_not_found" };
|
|
26
|
+
const currentWorkflow = runtime.workflow.getWorkflow();
|
|
27
|
+
if (!currentWorkflow)
|
|
28
|
+
return { ok: false, error: "workflow_api_not_enabled" };
|
|
29
|
+
const currentPlugin = currentWorkflow.plugins;
|
|
30
|
+
const remoteBatchBody = (0, utils_1.asRecord)(params.remoteBatch) ?? params;
|
|
31
|
+
const schedulerBody = (0, utils_1.asRecord)(params.scheduler);
|
|
32
|
+
const nextPlugin = {
|
|
33
|
+
remoteBatch: {
|
|
34
|
+
enabled: remoteBatchBody.enabled === true,
|
|
35
|
+
url: typeof remoteBatchBody.url === "string" && remoteBatchBody.url.trim()
|
|
36
|
+
? remoteBatchBody.url.trim()
|
|
37
|
+
: currentPlugin.remoteBatch.url || pipeline_config_1.DEFAULT_REMOTE_BATCH_URL,
|
|
38
|
+
startBatch: typeof remoteBatchBody.startBatch === "number" && Number.isFinite(remoteBatchBody.startBatch)
|
|
39
|
+
? Math.max(1, Math.trunc(remoteBatchBody.startBatch))
|
|
40
|
+
: currentPlugin.remoteBatch.startBatch,
|
|
41
|
+
batchSize: typeof remoteBatchBody.batchSize === "number" && Number.isFinite(remoteBatchBody.batchSize)
|
|
42
|
+
? Math.max(1, Math.trunc(remoteBatchBody.batchSize))
|
|
43
|
+
: currentPlugin.remoteBatch.batchSize,
|
|
44
|
+
sourceField: typeof remoteBatchBody.sourceField === "string" && remoteBatchBody.sourceField.trim()
|
|
45
|
+
? remoteBatchBody.sourceField.trim()
|
|
46
|
+
: currentPlugin.remoteBatch.sourceField,
|
|
47
|
+
},
|
|
48
|
+
scheduler: {
|
|
49
|
+
enabled: schedulerBody?.enabled === undefined ? currentPlugin.scheduler.enabled : schedulerBody.enabled === true,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
const nextWorkflow = {
|
|
53
|
+
...currentWorkflow,
|
|
54
|
+
plugins: { ...currentWorkflow.plugins, ...nextPlugin },
|
|
55
|
+
scheduler: nextPlugin.scheduler.enabled
|
|
56
|
+
? currentWorkflow.scheduler
|
|
57
|
+
: { ...currentWorkflow.scheduler, enabled: false },
|
|
58
|
+
};
|
|
59
|
+
if (!nextPlugin.remoteBatch.enabled && runtime.pipeline.getBatchRunState().status === "running") {
|
|
60
|
+
runtime.pipeline.cancelBatchRun();
|
|
61
|
+
}
|
|
62
|
+
runtime.workflow.setWorkflow(nextWorkflow);
|
|
63
|
+
(0, template_1.saveWorkflowDefinitionWithStorage)(nextWorkflow, { workflowFilePath: definition.workflowFilePath });
|
|
64
|
+
return { ok: true, payload: { ok: true, state: nextPlugin, pipelineId } };
|
|
65
|
+
});
|
|
66
|
+
// pipeline.template
|
|
67
|
+
registry.register("pipeline.template", (params, ctx) => {
|
|
68
|
+
const pipelineId = typeof params.pipelineId === "string" ? params.pipelineId : "";
|
|
69
|
+
const runtime = ctx.app.getPipelineRuntime(pipelineId);
|
|
70
|
+
if (!runtime)
|
|
71
|
+
return { ok: false, error: "pipeline_not_found" };
|
|
72
|
+
const workflow = runtime.workflow.getWorkflow();
|
|
73
|
+
if (!workflow)
|
|
74
|
+
return { ok: false, error: "workflow_api_not_enabled" };
|
|
75
|
+
return { ok: true, payload: { nodes: (0, template_1.workflowToTemplateNodes)(workflow) } };
|
|
76
|
+
});
|
|
77
|
+
// pipeline.workflow.get
|
|
78
|
+
registry.register("pipeline.workflow.get", (params, ctx) => {
|
|
79
|
+
const pipelineId = typeof params.pipelineId === "string" ? params.pipelineId : "";
|
|
80
|
+
const runtime = ctx.app.getPipelineRuntime(pipelineId);
|
|
81
|
+
if (!runtime)
|
|
82
|
+
return { ok: false, error: "pipeline_not_found" };
|
|
83
|
+
const workflow = runtime.workflow.getWorkflow();
|
|
84
|
+
if (!workflow)
|
|
85
|
+
return { ok: false, error: "workflow_api_not_enabled" };
|
|
86
|
+
return { ok: true, payload: { workflow, pipelineId } };
|
|
87
|
+
});
|
|
88
|
+
// pipeline.workflow.save
|
|
89
|
+
registry.register("pipeline.workflow.save", async (params, ctx) => {
|
|
90
|
+
const pipelineId = typeof params.pipelineId === "string" ? params.pipelineId : "";
|
|
91
|
+
const runtime = ctx.app.getPipelineRuntime(pipelineId);
|
|
92
|
+
const definition = ctx.app.getPipelineDefinition(pipelineId);
|
|
93
|
+
if (!runtime || !definition)
|
|
94
|
+
return { ok: false, error: "pipeline_not_found" };
|
|
95
|
+
const parseResult = (0, template_1.readWorkflowDefinitionFromRawDetailed)(params.workflow ?? params);
|
|
96
|
+
if (!parseResult.ok) {
|
|
97
|
+
return { ok: false, error: parseResult.error };
|
|
98
|
+
}
|
|
99
|
+
const next = parseResult.workflow;
|
|
100
|
+
let normalized;
|
|
101
|
+
try {
|
|
102
|
+
normalized = (0, template_1.normalizeWorkflowFallbacksWithStorage)(next, { workflowFilePath: definition.workflowFilePath });
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
const err = error;
|
|
106
|
+
return { ok: false, error: err.message || "invalid_persisted_workflow_definition" };
|
|
107
|
+
}
|
|
108
|
+
const validation = (0, template_1.validateWorkflowDefinition)(normalized);
|
|
109
|
+
if (!validation.ok) {
|
|
110
|
+
return { ok: false, error: validation.error };
|
|
111
|
+
}
|
|
112
|
+
runtime.workflow.setWorkflow(normalized);
|
|
113
|
+
try {
|
|
114
|
+
(0, template_1.saveWorkflowDefinitionWithStorage)(normalized, { workflowFilePath: definition.workflowFilePath });
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const err = error;
|
|
118
|
+
return { ok: false, error: err.message || "invalid_workflow_definition" };
|
|
119
|
+
}
|
|
120
|
+
const run = runtime.runtime.seedRun(runtime.workflow.getTemplateNodes());
|
|
121
|
+
runtime.runtime.setRun(run);
|
|
122
|
+
runtime.runtime.pushTimeline(`[${pipelineId}] Workflow definition updated, node count: ${normalized.nodes.length}`);
|
|
123
|
+
runtime.runtime.emitPipeline();
|
|
124
|
+
return { ok: true, payload: { ok: true, workflow: normalized, run, pipelineId } };
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
exports.registerPipelineWorkflowWsMethods = registerPipelineWorkflowWsMethods;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerPipelineWsMethods = void 0;
|
|
4
|
+
const PIPELINE_ID_RE = /^[A-Za-z0-9_-]+$/;
|
|
5
|
+
const registerPipelineWsMethods = (registry) => {
|
|
6
|
+
registry.register("pipeline.list", (_params, ctx) => {
|
|
7
|
+
const items = ctx.app.listPipelines().map((def) => ({ id: def.id, title: def.title }));
|
|
8
|
+
return { ok: true, payload: { items } };
|
|
9
|
+
});
|
|
10
|
+
registry.register("pipeline.create", async (params, ctx) => {
|
|
11
|
+
const pipelineId = typeof params.id === "string" ? params.id.trim() : "";
|
|
12
|
+
if (!PIPELINE_ID_RE.test(pipelineId)) {
|
|
13
|
+
return { ok: false, error: "pipeline_id_invalid" };
|
|
14
|
+
}
|
|
15
|
+
const cloneFrom = typeof params.cloneFrom === "string" && params.cloneFrom.trim() ? params.cloneFrom.trim() : undefined;
|
|
16
|
+
const title = typeof params.title === "string" && params.title.trim() ? params.title.trim() : `Pipeline ${pipelineId}`;
|
|
17
|
+
try {
|
|
18
|
+
const item = await ctx.app.createPipeline({ id: pipelineId, title, cloneFrom });
|
|
19
|
+
return { ok: true, payload: { ok: true, item: { id: item.id, title: item.title } } };
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const detail = error instanceof Error ? error.message : "pipeline_create_failed";
|
|
23
|
+
return { ok: false, error: detail };
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
registry.register("pipeline.rename", async (params, ctx) => {
|
|
27
|
+
const pipelineId = typeof params.pipelineId === "string" ? params.pipelineId : "";
|
|
28
|
+
const title = typeof params.title === "string" ? params.title.trim() : "";
|
|
29
|
+
if (!pipelineId || !title) {
|
|
30
|
+
return { ok: false, error: "pipeline_title_invalid" };
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const item = ctx.app.renamePipeline(pipelineId, title);
|
|
34
|
+
return { ok: true, payload: { ok: true, item: { id: item.id, title: item.title } } };
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const detail = error instanceof Error ? error.message : "pipeline_rename_failed";
|
|
38
|
+
return { ok: false, error: detail };
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
registry.register("pipeline.delete", async (params, ctx) => {
|
|
42
|
+
const pipelineId = typeof params.pipelineId === "string" ? params.pipelineId : "";
|
|
43
|
+
if (!pipelineId) {
|
|
44
|
+
return { ok: false, error: "pipeline_id_required" };
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const deleted = ctx.app.deletePipeline(pipelineId);
|
|
48
|
+
return { ok: true, payload: { ok: true, pipelineId: deleted.pipelineId } };
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
const detail = error instanceof Error ? error.message : "pipeline_delete_failed";
|
|
52
|
+
return { ok: false, error: detail };
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
exports.registerPipelineWsMethods = registerPipelineWsMethods;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAllWsMethods = void 0;
|
|
4
|
+
const pipelines_1 = require("./pipelines");
|
|
5
|
+
const pipeline_runtime_1 = require("./pipeline-runtime");
|
|
6
|
+
const pipeline_workflow_1 = require("./pipeline-workflow");
|
|
7
|
+
const pipeline_batch_1 = require("./pipeline-batch");
|
|
8
|
+
const pipeline_scheduler_1 = require("./pipeline-scheduler");
|
|
9
|
+
const pipeline_links_1 = require("./pipeline-links");
|
|
10
|
+
const pipeline_queue_1 = require("./pipeline-queue");
|
|
11
|
+
const agents_1 = require("./agents");
|
|
12
|
+
const sessions_1 = require("./sessions");
|
|
13
|
+
const artifacts_1 = require("./artifacts");
|
|
14
|
+
const logs_1 = require("./logs");
|
|
15
|
+
const gateway_1 = require("./gateway");
|
|
16
|
+
const timeline_1 = require("./timeline");
|
|
17
|
+
const registerAllWsMethods = (registry) => {
|
|
18
|
+
(0, pipelines_1.registerPipelineWsMethods)(registry);
|
|
19
|
+
(0, pipeline_runtime_1.registerPipelineRuntimeWsMethods)(registry);
|
|
20
|
+
(0, pipeline_workflow_1.registerPipelineWorkflowWsMethods)(registry);
|
|
21
|
+
(0, pipeline_batch_1.registerPipelineBatchWsMethods)(registry);
|
|
22
|
+
(0, pipeline_scheduler_1.registerPipelineSchedulerWsMethods)(registry);
|
|
23
|
+
(0, pipeline_links_1.registerPipelineLinksWsMethods)(registry);
|
|
24
|
+
(0, pipeline_queue_1.registerPipelineQueueWsMethods)(registry);
|
|
25
|
+
(0, agents_1.registerAgentWsMethods)(registry);
|
|
26
|
+
(0, sessions_1.registerSessionWsMethods)(registry);
|
|
27
|
+
(0, artifacts_1.registerArtifactWsMethods)(registry);
|
|
28
|
+
(0, logs_1.registerLogWsMethods)(registry);
|
|
29
|
+
(0, gateway_1.registerGatewayWsMethods)(registry);
|
|
30
|
+
(0, timeline_1.registerTimelineWsMethods)(registry);
|
|
31
|
+
};
|
|
32
|
+
exports.registerAllWsMethods = registerAllWsMethods;
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSessionWsMethods = void 0;
|
|
4
|
+
const utils_1 = require("./utils");
|
|
5
|
+
const pickString = (record, keys) => {
|
|
6
|
+
for (const key of keys) {
|
|
7
|
+
const raw = record[key];
|
|
8
|
+
if (typeof raw === "string" && raw.trim())
|
|
9
|
+
return raw.trim();
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
};
|
|
13
|
+
const readModelInfo = (value) => {
|
|
14
|
+
const direct = (0, utils_1.asRecord)(value);
|
|
15
|
+
if (!direct)
|
|
16
|
+
return { model: null, modelProvider: null, api: null };
|
|
17
|
+
const nestedSession = (0, utils_1.asRecord)(direct.session);
|
|
18
|
+
const nestedMeta = (0, utils_1.asRecord)(direct.meta);
|
|
19
|
+
const model = pickString(direct, ["model", "modelName"]) ??
|
|
20
|
+
(nestedSession ? pickString(nestedSession, ["model", "modelName"]) : null) ??
|
|
21
|
+
(nestedMeta ? pickString(nestedMeta, ["model", "modelName"]) : null);
|
|
22
|
+
const modelProvider = pickString(direct, ["modelProvider", "provider", "model_provider"]) ??
|
|
23
|
+
(nestedSession ? pickString(nestedSession, ["modelProvider", "provider", "model_provider"]) : null) ??
|
|
24
|
+
(nestedMeta ? pickString(nestedMeta, ["modelProvider", "provider", "model_provider"]) : null);
|
|
25
|
+
const api = pickString(direct, ["api", "apiType"]) ??
|
|
26
|
+
(nestedSession ? pickString(nestedSession, ["api", "apiType"]) : null) ??
|
|
27
|
+
(nestedMeta ? pickString(nestedMeta, ["api", "apiType"]) : null);
|
|
28
|
+
return { model, modelProvider, api };
|
|
29
|
+
};
|
|
30
|
+
const mergeModelInfo = (preferred, fallback) => ({
|
|
31
|
+
model: preferred.model ?? fallback.model,
|
|
32
|
+
modelProvider: preferred.modelProvider ?? fallback.modelProvider,
|
|
33
|
+
api: preferred.api ?? fallback.api,
|
|
34
|
+
});
|
|
35
|
+
const firstText = (body) => {
|
|
36
|
+
const text = body.text ?? body.message ?? body.content ?? body.input;
|
|
37
|
+
return typeof text === "string" ? text.trim() : null;
|
|
38
|
+
};
|
|
39
|
+
const registerSessionWsMethods = (registry) => {
|
|
40
|
+
registry.register("session.list", async (_params, ctx) => {
|
|
41
|
+
try {
|
|
42
|
+
const { payload, items } = await ctx.services.refreshSessionsFromGateway();
|
|
43
|
+
return { ok: true, payload: { items, raw: payload } };
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return { ok: false, error: (0, utils_1.formatError)(error) };
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
registry.register("session.create", async (params, ctx) => {
|
|
50
|
+
try {
|
|
51
|
+
// Pass through to gateway (first strip type/id that WS frame might add)
|
|
52
|
+
const { sessionId: _sid, type: _t, id: _id, ...body } = params;
|
|
53
|
+
const payload = await ctx.services.client.sendReq("sessions.create", body, { sideEffect: true });
|
|
54
|
+
return { ok: true, payload: { item: payload ?? null } };
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
return { ok: false, error: (0, utils_1.formatError)(error) };
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
registry.register("session.history", async (params, ctx) => {
|
|
61
|
+
try {
|
|
62
|
+
const sessionId = typeof params.sessionId === "string" ? params.sessionId.trim() : "";
|
|
63
|
+
if (!sessionId)
|
|
64
|
+
return { ok: false, error: "invalid_session_id" };
|
|
65
|
+
const limitRaw = typeof params.limit === "number" ? params.limit : 200;
|
|
66
|
+
const limit = Number.isFinite(limitRaw) && limitRaw > 0 ? Math.min(500, Math.floor(limitRaw)) : 200;
|
|
67
|
+
const payload = await ctx.services.client.sendReq("chat.history", { sessionKey: sessionId, limit });
|
|
68
|
+
const raw = (payload ?? {});
|
|
69
|
+
const rawItems = Array.isArray(raw.items) ? raw.items
|
|
70
|
+
: Array.isArray(raw.messages) ? raw.messages
|
|
71
|
+
: Array.isArray(raw.history) ? raw.history
|
|
72
|
+
: Array.isArray(payload) ? payload : [];
|
|
73
|
+
const latestAssistant = [...rawItems].reverse().find((item) => String(((0, utils_1.asRecord)(item) ?? {}).role ?? "").toLowerCase() === "assistant");
|
|
74
|
+
const latestModelInfo = readModelInfo(latestAssistant);
|
|
75
|
+
let sessionModelInfo = { model: null, modelProvider: null, api: null };
|
|
76
|
+
try {
|
|
77
|
+
const { items } = await ctx.services.refreshSessionsFromGateway();
|
|
78
|
+
const matched = items.find((s) => s.id === sessionId);
|
|
79
|
+
sessionModelInfo = readModelInfo(matched?.raw);
|
|
80
|
+
}
|
|
81
|
+
catch { /* silent */ }
|
|
82
|
+
const mergedInfo = mergeModelInfo(latestModelInfo, sessionModelInfo);
|
|
83
|
+
const items = rawItems.map((item) => {
|
|
84
|
+
const rec = (0, utils_1.asRecord)(item);
|
|
85
|
+
if (!rec)
|
|
86
|
+
return item;
|
|
87
|
+
const role = String(rec.role ?? "").toLowerCase();
|
|
88
|
+
if (role !== "assistant")
|
|
89
|
+
return item;
|
|
90
|
+
const itemModelInfo = mergeModelInfo(readModelInfo(rec), mergedInfo);
|
|
91
|
+
return { ...rec, model: rec.model ?? itemModelInfo.model, modelProvider: rec.modelProvider ?? rec.provider ?? itemModelInfo.modelProvider, provider: rec.provider ?? rec.modelProvider ?? itemModelInfo.modelProvider, api: rec.api ?? itemModelInfo.api };
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
ok: true,
|
|
95
|
+
payload: { items, raw: payload, limit, model: mergedInfo.model, modelProvider: mergedInfo.modelProvider, api: mergedInfo.api },
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return { ok: false, error: (0, utils_1.formatError)(error) };
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
registry.register("session.send", async (params, ctx) => {
|
|
103
|
+
try {
|
|
104
|
+
const sessionId = typeof params.sessionId === "string" ? params.sessionId.trim() : "";
|
|
105
|
+
if (!sessionId)
|
|
106
|
+
return { ok: false, error: "invalid_session_id" };
|
|
107
|
+
const text = firstText(params);
|
|
108
|
+
const mode = String(params.mode ?? "auto");
|
|
109
|
+
if (!text)
|
|
110
|
+
return { ok: false, error: "message_required" };
|
|
111
|
+
const attempts = [];
|
|
112
|
+
if (mode === "chat") {
|
|
113
|
+
attempts.push({ method: "chat.send", params: { sessionKey: sessionId, message: text } });
|
|
114
|
+
}
|
|
115
|
+
else if (mode === "sessions") {
|
|
116
|
+
attempts.push({ method: "sessions.send", params: { key: sessionId, message: text } });
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
attempts.push({ method: "chat.send", params: { sessionKey: sessionId, message: text } }, { method: "sessions.send", params: { key: sessionId, message: text } });
|
|
120
|
+
}
|
|
121
|
+
let lastError = null;
|
|
122
|
+
let finalPayload = null;
|
|
123
|
+
let usedMethod = null;
|
|
124
|
+
for (const attempt of attempts) {
|
|
125
|
+
try {
|
|
126
|
+
finalPayload = await ctx.services.client.sendReq(attempt.method, attempt.params, { sideEffect: true });
|
|
127
|
+
usedMethod = attempt.method;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
lastError = (0, utils_1.formatError)(error);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (finalPayload === null) {
|
|
135
|
+
return { ok: false, error: lastError ?? "sessions_send_failed" };
|
|
136
|
+
}
|
|
137
|
+
let sessionModelInfo = readModelInfo(finalPayload);
|
|
138
|
+
try {
|
|
139
|
+
const { items } = await ctx.services.refreshSessionsFromGateway();
|
|
140
|
+
const matched = items.find((s) => s.id === sessionId);
|
|
141
|
+
sessionModelInfo = mergeModelInfo(sessionModelInfo, readModelInfo(matched?.raw));
|
|
142
|
+
}
|
|
143
|
+
catch { /* silent */ }
|
|
144
|
+
return {
|
|
145
|
+
ok: true,
|
|
146
|
+
payload: { item: finalPayload, mode, usedMethod, model: sessionModelInfo.model, modelProvider: sessionModelInfo.modelProvider, api: sessionModelInfo.api },
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return { ok: false, error: (0, utils_1.formatError)(error) };
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
exports.registerSessionWsMethods = registerSessionWsMethods;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerTimelineWsMethods = void 0;
|
|
4
|
+
const registerTimelineWsMethods = (registry) => {
|
|
5
|
+
registry.register("timeline.list", (_params, ctx) => {
|
|
6
|
+
const items = ctx.services.getTimeline();
|
|
7
|
+
return { ok: true, payload: { items } };
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
exports.registerTimelineWsMethods = registerTimelineWsMethods;
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mergeIdentityTargets = exports.readIdentityTargetFromBody = exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
});
|
|
9
|
-
exports.readIdentityTargetFromUrl = readIdentityTargetFromUrl;
|
|
10
|
-
// 从请求体提取 runId / batchRunId
|
|
3
|
+
exports.requireRuntime = exports.formatError = exports.mergeIdentityTargets = exports.readIdentityTargetFromBody = exports.asRecord = void 0;
|
|
4
|
+
const asRecord = (value) => value && typeof value === "object" && !Array.isArray(value)
|
|
5
|
+
? value
|
|
6
|
+
: null;
|
|
7
|
+
exports.asRecord = asRecord;
|
|
11
8
|
const readIdentityTargetFromBody = (body) => ({
|
|
12
9
|
runId: typeof body.runId === "string" && body.runId.trim() ? body.runId.trim() : undefined,
|
|
13
10
|
batchRunId: typeof body.batchRunId === "string" && body.batchRunId.trim() ? body.batchRunId.trim() : undefined,
|
|
14
11
|
});
|
|
15
12
|
exports.readIdentityTargetFromBody = readIdentityTargetFromBody;
|
|
16
|
-
// 合并两组 IdentityTarget,primary 优先
|
|
17
13
|
const mergeIdentityTargets = (primary, fallback) => {
|
|
18
14
|
const runId = primary?.runId ?? fallback?.runId;
|
|
19
15
|
const batchRunId = primary?.batchRunId ?? fallback?.batchRunId;
|
|
@@ -22,3 +18,12 @@ const mergeIdentityTargets = (primary, fallback) => {
|
|
|
22
18
|
return { runId, batchRunId };
|
|
23
19
|
};
|
|
24
20
|
exports.mergeIdentityTargets = mergeIdentityTargets;
|
|
21
|
+
const formatError = (error) => error instanceof Error ? error.message : String(error);
|
|
22
|
+
exports.formatError = formatError;
|
|
23
|
+
const requireRuntime = (app, pipelineId, onFound) => {
|
|
24
|
+
const runtime = app.getPipelineRuntime(pipelineId);
|
|
25
|
+
if (!runtime)
|
|
26
|
+
return { ok: false, error: "pipeline_not_found" };
|
|
27
|
+
return onFound(runtime);
|
|
28
|
+
};
|
|
29
|
+
exports.requireRuntime = requireRuntime;
|
package/dist/src/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "taskmeld",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.41",
|
|
5
5
|
"description": "Agent pipeline orchestration platform — CLI, HTTP/WS backend, React console",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
7
7
|
"bin": {
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"doc": "docs"
|
|
16
16
|
},
|
|
17
17
|
"scripts": {
|
|
18
|
-
"test": "npm run build && node dist/test/artifact-storage.spec.js && node dist/test/data-dir.spec.js && node dist/test/gateway-client.spec.js && node dist/test/gateway-frame-sanitizer.spec.js && node dist/test/workflow-v2.spec.js && node dist/test/structured-output-contract.spec.js && node dist/test/structured-output-parser.spec.js && node dist/test/
|
|
19
|
-
"dev": "tsx src/index.ts",
|
|
20
|
-
"dev:cli": "tsx src/cli/index.ts",
|
|
18
|
+
"test": "npm run build && node dist/test/artifact-storage.spec.js && node dist/test/data-dir.spec.js && node dist/test/gateway-client.spec.js && node dist/test/gateway-frame-sanitizer.spec.js && node dist/test/workflow-v2.spec.js && node dist/test/structured-output-contract.spec.js && node dist/test/structured-output-parser.spec.js && node dist/test/runtime-store-timeline-sanitize.spec.js && node dist/test/pipeline-regression.spec.js && node dist/test/pipeline-management.spec.js && node dist/test/pipeline-status-semantics.spec.js && node dist/test/pipeline-routing.spec.js && node dist/test/pipeline-branch-isolation.spec.js && node dist/test/pipeline-diagnostics.spec.js && node dist/test/pipeline-join-policy.spec.js && node dist/test/pipeline-module-boundaries.spec.js && node dist/test/server-lifecycle-client.spec.js && node dist/test/taskmeld-cli.spec.js && node dist/test/taskmeld-cli-error-contract.spec.js",
|
|
19
|
+
"dev": "npx tsx src/index.ts",
|
|
20
|
+
"dev:cli": "npx tsx src/cli/index.ts",
|
|
21
21
|
"prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
22
22
|
"build": "tsx scripts/gen-version.ts && tsc -p tsconfig.json",
|
|
23
23
|
"typecheck": "tsc --noEmit",
|
|
@@ -30,7 +30,14 @@
|
|
|
30
30
|
"build:web": "npm --prefix web run build",
|
|
31
31
|
"prepublishOnly": "npm run build && npm run build:web"
|
|
32
32
|
},
|
|
33
|
-
"keywords": [
|
|
33
|
+
"keywords": [
|
|
34
|
+
"agent",
|
|
35
|
+
"pipeline",
|
|
36
|
+
"orchestration",
|
|
37
|
+
"openclaw",
|
|
38
|
+
"workflow",
|
|
39
|
+
"cli"
|
|
40
|
+
],
|
|
34
41
|
"author": "liaocclucky <1796301524@qq.com>",
|
|
35
42
|
"license": "MIT",
|
|
36
43
|
"repository": {
|
|
@@ -47,13 +54,14 @@
|
|
|
47
54
|
"type": "commonjs",
|
|
48
55
|
"dependencies": {
|
|
49
56
|
"dotenv": "^17.4.1",
|
|
57
|
+
"i18next": "^26.3.0",
|
|
50
58
|
"ws": "^8.20.0"
|
|
51
59
|
},
|
|
52
60
|
"devDependencies": {
|
|
53
|
-
"@typescript-eslint/eslint-plugin": "^8.46.1",
|
|
54
|
-
"@typescript-eslint/parser": "^8.46.1",
|
|
55
61
|
"@types/node": "^25.6.0",
|
|
56
62
|
"@types/ws": "^8.18.1",
|
|
63
|
+
"@typescript-eslint/eslint-plugin": "^8.46.1",
|
|
64
|
+
"@typescript-eslint/parser": "^8.46.1",
|
|
57
65
|
"eslint": "^9.37.0",
|
|
58
66
|
"tsx": "^4.21.0",
|
|
59
67
|
"typescript": "^6.0.2",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const t="Search agents (ID/role/output/events)",e="Search agents",o="Agent Status Filter",S="All",s="Busy",n="Idle",c="Switch to List View",u="Switch to Card View",a="Role",i="Recent Node",l="Output",r="No output",w="Events",h="No events",d="View Output",p="View Session",v="No agents found",g={searchPlaceholder:t,searchLabel:e,statusFilter:o,all:"All",busy:s,idle:n,switchToList:c,switchToCard:u,role:a,recentNode:i,outputPreview:l,noOutput:r,eventPreview:w,noEvent:h,viewOutput:d,openSession:p,noMatch:v};export{S as all,s as busy,g as default,w as eventPreview,n as idle,h as noEvent,v as noMatch,r as noOutput,p as openSession,l as outputPreview,i as recentNode,a as role,e as searchLabel,t as searchPlaceholder,o as statusFilter,u as switchToCard,c as switchToList,d as viewOutput};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const t="搜索智能体(ID/角色/输出/事件)",o="搜索智能体",e="智能体状态筛选",d="全部",h="忙碌",w="空闲",s="切换为列表视图",n="切换为卡片视图",p="角色",c="最近节点",l="成功输出",a="暂无输出内容",P="事件",r="暂无相关事件",i="查看输出",u="打开会话",v="未匹配到智能体",b={searchPlaceholder:t,searchLabel:o,statusFilter:e,all:"全部",busy:"忙碌",idle:"空闲",switchToList:s,switchToCard:n,role:"角色",recentNode:c,outputPreview:l,noOutput:a,eventPreview:"事件",noEvent:r,viewOutput:i,openSession:u,noMatch:v};export{d as all,h as busy,b as default,P as eventPreview,w as idle,r as noEvent,v as noMatch,a as noOutput,u as openSession,l as outputPreview,c as recentNode,p as role,o as searchLabel,t as searchPlaceholder,e as statusFilter,n as switchToCard,s as switchToList,i as viewOutput};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const t="产物目录",o="加载中...",n="加载失败: {{error}}",s="当前筛选条件下无产物",e="产物详情",c="请先在左侧选择一个产物文件",l="内容加载中...",a="内容加载失败: {{error}}",r="内容为空",i="=== 产物内容 ===",d="=== 处理日志 ===",h="全部",v="今天",R="7天",S="30天",E="自定义",p="全部流水线",f="全部状态",y="全部类型",u="编辑节点筛选",g="全部节点",m="当前筛选下暂无可选节点",F="应用筛选",I="重置",P="刷新",x="导出中...",A="时间范围",T="流水线",j="节点",L="导出失败:当前筛选条件无效。",b="自定义日期范围无效,请检查开始/结束日期。",D="近{{count}}天",N="等{{count}}个",k="关闭",q={artifactDirectory:t,loading:o,loadFailed:n,noArtifacts:s,artifactDetail:e,selectFile:c,contentLoading:l,contentLoadFailed:a,contentEmpty:r,contentLabel:i,logLabel:d,filterAll:"全部",today:"今天",last7d:"7天",last30d:"30天",custom:"自定义",allPipelines:p,allStatus:f,allTypes:y,editNodeFilter:u,allNodes:g,noNodesAvailable:m,applyFilters:F,reset:"重置",refresh:"刷新",exporting:x,export:"导出",timeRange:A,pipeline:"流水线",node:"节点",exportFailed:L,dateRangeInvalid:b,recentDays:D,nodeSummary:N,close:"关闭"};export{g as allNodes,p as allPipelines,f as allStatus,y as allTypes,F as applyFilters,e as artifactDetail,t as artifactDirectory,k as close,r as contentEmpty,i as contentLabel,a as contentLoadFailed,l as contentLoading,E as custom,b as dateRangeInvalid,q as default,u as editNodeFilter,L as exportFailed,x as exporting,h as filterAll,S as last30d,R as last7d,n as loadFailed,o as loading,d as logLabel,s as noArtifacts,m as noNodesAvailable,j as node,N as nodeSummary,T as pipeline,D as recentDays,P as refresh,I as reset,c as selectFile,A as timeRange,v as today};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const t="Artifact Directory",o="Loading...",e="Failed to load artifacts: {{error}}",n="No artifacts matching current filters",s="Artifact Details",a="Select an artifact file from the list",l="Loading content...",c="Failed to load content: {{error}}",i="No content",r="Artifact Content",d="Processing Logs",k="All",f="Today",p="Last 7 days",y="Last 30 days",g="Custom",A="All Pipelines",F="All Status",u="All Types",L="Filter by Node",m="All Nodes",N="No available nodes for current filters",x="Apply Filters",h="Reset",b="Refresh",v="Exporting...",D="Time Range",R="Pipeline",C="Node",P="Failed to export. Invalid filter conditions.",S="Invalid date range. Check the start and end dates.",T="Last {{count}} days",E="{{count}} nodes",I="Close",j={artifactDirectory:t,loading:o,loadFailed:e,noArtifacts:n,artifactDetail:s,selectFile:a,contentLoading:l,contentLoadFailed:c,contentEmpty:i,contentLabel:r,logLabel:d,filterAll:"All",today:f,last7d:p,last30d:y,custom:g,allPipelines:A,allStatus:F,allTypes:u,editNodeFilter:L,allNodes:m,noNodesAvailable:N,applyFilters:x,reset:h,refresh:b,exporting:v,export:"Export",timeRange:D,pipeline:R,node:C,exportFailed:P,dateRangeInvalid:S,recentDays:T,nodeSummary:E,close:I};export{m as allNodes,A as allPipelines,F as allStatus,u as allTypes,x as applyFilters,s as artifactDetail,t as artifactDirectory,I as close,i as contentEmpty,r as contentLabel,c as contentLoadFailed,l as contentLoading,g as custom,S as dateRangeInvalid,j as default,L as editNodeFilter,P as exportFailed,v as exporting,k as filterAll,y as last30d,p as last7d,e as loadFailed,o as loading,d as logLabel,n as noArtifacts,N as noNodesAvailable,C as node,E as nodeSummary,R as pipeline,T as recentDays,b as refresh,h as reset,a as selectFile,D as timeRange,f as today};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={title:"TaskMeld"},d={save:"Save",cancel:"Cancel",confirm:"Confirm",delete:"Delete",edit:"Edit",close:"Close",retry:"Retry",refresh:"Refresh",reset:"Reset",export:"Export",create:"Create",apply:"Apply Filters"},o={running:"Running",success:"Success",failed:"Failed",blocked:"Blocked",waiting:"Waiting",stopped:"Stopped",skipped:"Skipped",rejected:"Rejected",queued:"Queued",ready:"Ready",idle:"Idle",pending:"Pending",canceled:"Canceled",connecting:"Connecting",ws_open:"Channel Open",challenged:"Verifying Challenge",connect_sent:"Handshake Sent"},a={ready:"Ready",connecting:"Connecting",ws_open:"Channel Open",challenged:"Verifying Challenge",connect_sent:"Handshake Sent",failed:"Failed",success:"Success"},n={loading:"Loading...",loadingMore:"Load More",noData:"No data available",noMatch:"No results",error:"Error",warning:"Warning",info:"Info",empty:"Empty",required:"Required",optional:"Optional",all:"All",none:"None",yes:"Yes",no:"No",enabled:"Enabled",disabled:"Disabled",searchPlaceholder:"Search...",expandCodeBlock:"Expand code block",collapseCodeBlock:"Collapse code block"},t={today:"Today",last7d:"Last 7 days",last30d:"Last 30 days",custom:"Custom",latestFirst:"Latest First",earliestFirst:"Earliest First"},l={partialLoadFailed:"Partial data load failed. Available data retained.",pluginSaveFailed:"Plugin config save failed: {{message}}",pluginSaveFailedNoWorkflow:"Plugin config save failed: workflow not loaded",pipelineCreated:"Pipeline {{id}} created",createPipelineFailed:"Create pipeline failed: {{message}}",pipelineTitleUpdated:"Pipeline {{id}} title updated",renamePipelineFailed:"Rename pipeline failed: {{message}}",pipelineDeleted:"Pipeline {{id}} deleted",deletePipelineFailed:"Delete pipeline failed: {{message}}",remoteBatchStarted:"Remote batch started: from batch {{startBatch}}, {{totalItems}} items, {{batchSize}} per batch",remoteBatchStartFailed:"Remote batch start failed: {{message}}",batchStopRequested:"Batch stop requested (takes effect after current batch completes)",batchStopFailed:"Batch stop failed: {{message}}",pipelineStopRequested:"Pipeline stop requested",batchStopNodeRequested:"Batch stop requested (takes effect after current node receives stop signal)",stopPipelineFailed:"Stop pipeline failed: {{message}}",runStartFailed:"Start run failed: {{message}}",workflowJsonEmpty:"Workflow JSON cannot be empty",workflowJsonInvalid:"Workflow JSON invalid: {{error}}",workflowJsonSaveFailed:"Workflow JSON save failed: {{message}}",workflowJsonSaved:"Workflow JSON saved",nodeSaved:"Node {{nodeId}} config saved",nodeSaveFailed:"Node config save failed: {{message}}",nodeSaveFailedNoWorkflow:"Node config save failed: workflow not loaded",nodeSaveFailedNodeNotFound:"Node config save failed: workflow node not found({{nodeId}})",nodeSaveFailedEmptyFields:"Node config save failed: title/Agent cannot be empty",nodeSaveFailedInvalidDep:"Node config save failed: invalid dependency({{depId}})",nodeSaveFailedParallelGroupDep:"Node config save failed: parallel group dependency not allowed({{depId}})",routeSaveFailedMaxAllowed:"Route policy save failed: allowed max 5",routeSaveFailedInvalidTarget:"Route policy save failed: invalid routing target({{route}} -> {{targetId}})",nodeWorkflowSaved:"Node {{nodeId}} workflow config saved",workflowSaveFailed:"Workflow config save failed: {{message}}",groupSaved:"Group {{groupId}} config saved",groupSaveFailed:"Group save failed: {{message}}",groupSaveFailedEmptyId:"Group save failed: group ID cannot be empty",groupSaveFailedMinMembers:"Group save failed: at least 2 members required",groupSaveFailedInvalidMember:"Group save failed: invalid member({{memberId}})",groupSaveFailedInvalidUpstream:"Group save failed: invalid upstream({{upstreamId}})",nodeAdded:"Node {{nodeId}} added",nodeAddFailed:"Add node failed: {{message}}",nodeAddFailedNoWorkflow:"Add node failed: workflow not loaded",nodeAddFailedEmptyFields:"Add node failed: node ID/title/Agent cannot be empty",nodeAddFailedDuplicateId:"Add node failed: duplicate node ID({{nodeId}})",nodeAddFailedInvalidDep:"Add node failed: invalid dependency({{depId}})",groupAdded:"Group {{groupId}} added",groupAddFailed:"Add group failed: {{message}}",groupAddFailedNoWorkflow:"Add group failed: workflow not loaded",groupAddFailedEmptyId:"Add group failed: group ID cannot be empty",groupAddFailedDuplicateId:"Add group failed: duplicate group ID({{groupId}})",groupAddFailedMinMembers:"Add group failed: at least 2 members required",groupAddFailedInvalidMember:"Add group failed: invalid member({{memberId}})",groupAddFailedInvalidUpstream:"Add group failed: invalid upstream({{upstreamId}})",nodeDeleted:"Node {{nodeId}} deleted",nodeDeleteFailed:"Delete node failed: {{message}}",nodeDeleteFailedNoWorkflow:"Delete node failed: workflow not loaded",nodeDeleteFailedMinNodes:"Delete node failed: at least one node required",groupDeleted:"Group {{groupId}} deleted",groupDeleteFailed:"Delete group failed: {{message}}",groupDeleteFailedNoWorkflow:"Delete group failed: workflow not loaded",groupDeleteFailedNotFound:"Delete group failed: group not found({{groupId}})",nodeMovedUp:"Node {{nodeId}} moved up",nodeMovedDown:"Node {{nodeId}} moved down",nodeMoveFailed:"Node order save failed: {{message}}",nodeReorderedAfter:"Node {{nodeId}} moved after {{targetNodeId}}",nodeReorderedBefore:"Node {{nodeId}} moved before {{targetNodeId}}",nodeReorderFailed:"Node reorder save failed: {{message}}",idEmpty:"{{field}} cannot be empty",pipelineTitleEmpty:"Pipeline title cannot be empty"},i={schedulerConfig:"Scheduler Config (DAG-{{pipelineId}})",disableScheduler:"Disable Scheduler",enableScheduler:"Enable Scheduler",switchToMode:"Switch to {{mode}}",auto:"Auto",manual:"Manual",manualStep:"Step Through"},r={title:"Settings",language:{label:"Language",zh:"中文",en:"English"}},s={versionInvalid:"workflow.version invalid, only 3.0 supported: {{version}}",mustBeArray:"workflow.nodes/edges/groups must be arrays",duplicateNodeId:"workflow.nodes contains duplicate IDs",duplicateGroupId:"workflow.groups contains duplicate IDs",edgeReferencesMissing:"Edge references non-existent entity: {{from}} -> {{to}}",selfLoopEdge:"Self-loop edge detected: {{from}} -> {{to}}",duplicateEdge:"Duplicate edge detected: {{from}} -> {{to}}",mixedEdgeTypes:"Node {{nodeId}} has both dependency and route outgoing edges, save blocked",routeMustContainYesNo:"Node {{nodeId}} must include yes and no routes when routing is enabled",yesMainlineMaxOne:"Node {{nodeId}} can have at most 1 yes mainline dependency edge",yesCannotBeRouteEdge:"Node {{nodeId}} yes cannot be saved as a route edge",undeclaredRouteEdge:"Node {{nodeId}} has undeclared route edge: {{route}}",routeMustTargetBranch:"Node {{nodeId}} route {{route}} must target branch node or branch group",routeTargetMustBeOne:"Node {{nodeId}} route {{route}} must have exactly 1 branch target",groupTypeInvalid:"Group {{groupId}} has invalid type",groupMinMembers:"Group {{groupId}} must have at least 2 members",groupDuplicateMembers:"Group {{groupId}} has duplicate members",groupMemberMissing:"Group {{groupId}} references non-existent member {{memberId}}",nodeGroupMissing:"Node {{nodeId}} references non-existent group {{groupId}}",nodeNotInGroup:"Node {{nodeId}} is not in its declared group {{groupId}}",groupCannotDirectConnect:"Group {{groupId}} cannot connect directly to member nodes",groupMemberNoDirectDep:"Group {{groupId}} members cannot depend on each other directly",groupEntryCannotDirectConnect:"Group {{groupId}} entry node cannot connect directly to members",workflowHasCycle:"Workflow contains a cycle, cannot save",nodeConfigSaveFailed:"Node config save failed: {{message}}",workflowConfigSaveFailed:"Workflow config save failed: {{message}}",routeSaveFailed:"Route policy save failed: {{message}}"},p={app:e,action:d,status:o,gateway:a,common:n,time:t,actionMessage:l,scheduler:i,settings:r,validation:s};export{d as action,l as actionMessage,e as app,n as common,p as default,a as gateway,i as scheduler,r as settings,o as status,t as time,s as validation};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e={title:"TaskMeld"},d={save:"保存",cancel:"取消",confirm:"确认",delete:"删除",edit:"编辑",close:"关闭",retry:"重试",refresh:"刷新",reset:"重置",export:"导出",create:"创建",apply:"应用筛选"},o={running:"运行中",success:"成功",failed:"失败",blocked:"阻塞",waiting:"等待中",stopped:"已停止",skipped:"已跳过",rejected:"打回",queued:"排队中",ready:"就绪",idle:"空闲",pending:"等待中",canceled:"已取消",connecting:"连接中",ws_open:"通道已开",challenged:"挑战校验中",connect_sent:"握手已发送"},a={ready:"就绪",connecting:"连接中",ws_open:"通道已开",challenged:"挑战校验中",connect_sent:"握手已发送",failed:"失败",success:"成功"},l={loading:"加载中...",loadingMore:"加载更多",noData:"暂无数据",noMatch:"暂无匹配",error:"错误",warning:"警告",info:"信息",empty:"空",required:"必填",optional:"可选",all:"全部",none:"无",yes:"是",no:"否",enabled:"启用",disabled:"停用",searchPlaceholder:"搜索...",expandCodeBlock:"展开代码块",collapseCodeBlock:"折叠代码块"},n={today:"今天",last7d:"7天",last30d:"30天",custom:"自定义",latestFirst:"最新在前",earliestFirst:"最早在前"},r={partialLoadFailed:"部分数据加载失败,已保留可用数据。",pluginSaveFailed:"插件配置保存失败: {{message}}",pluginSaveFailedNoWorkflow:"插件配置保存失败: workflow 未加载",pipelineCreated:"流水线 {{id}} 已创建",createPipelineFailed:"新增流水线失败: {{message}}",pipelineTitleUpdated:"流水线 {{id}} 标题已更新",renamePipelineFailed:"流水线重命名失败: {{message}}",pipelineDeleted:"流水线 {{id}} 已删除",deletePipelineFailed:"删除流水线失败: {{message}}",remoteBatchStarted:"远程关键词池批跑已启动: 从第 {{startBatch}} 批开始, 共 {{totalItems}} 个, 每批 {{batchSize}} 个",remoteBatchStartFailed:"远程关键词池批跑启动失败: {{message}}",batchStopRequested:"已请求停止批跑(当前批次完成后生效)",batchStopFailed:"停止批跑失败: {{message}}",pipelineStopRequested:"已请求停止流水线",batchStopNodeRequested:"已请求停止批跑(当前执行节点收到停止信号后生效)",stopPipelineFailed:"停止流水线失败: {{message}}",runStartFailed:"启动运行失败: {{message}}",workflowJsonEmpty:"workflow JSON 不能为空",workflowJsonInvalid:"workflow JSON 非法: {{error}}",workflowJsonSaveFailed:"workflow JSON 保存失败: {{message}}",workflowJsonSaved:"workflow JSON 已保存",nodeSaved:"节点 {{nodeId}} 配置已保存",nodeSaveFailed:"节点配置保存失败: {{message}}",nodeSaveFailedNoWorkflow:"节点配置保存失败: workflow 未加载",nodeSaveFailedNodeNotFound:"节点配置保存失败: 找不到 workflow 节点({{nodeId}})",nodeSaveFailedEmptyFields:"节点配置保存失败: 标题/Agent 不能为空",nodeSaveFailedInvalidDep:"节点配置保存失败: 非法依赖({{depId}})",nodeSaveFailedParallelGroupDep:"节点配置保存失败: 并行组内禁止依赖({{depId}})",routeSaveFailedMaxAllowed:"路由策略保存失败: allowed 最多 5 个",routeSaveFailedInvalidTarget:"路由策略保存失败: 非法分流目标({{route}} -> {{targetId}})",nodeWorkflowSaved:"节点 {{nodeId}} workflow 配置已保存",workflowSaveFailed:"workflow 配置保存失败: {{message}}",groupSaved:"并行组 {{groupId}} 配置已保存",groupSaveFailed:"并行组保存失败: {{message}}",groupSaveFailedEmptyId:"并行组保存失败: 组 ID 不能为空",groupSaveFailedMinMembers:"并行组保存失败: 组成员至少 2 个",groupSaveFailedInvalidMember:"并行组保存失败: 非法成员({{memberId}})",groupSaveFailedInvalidUpstream:"并行组保存失败: 非法组上游({{upstreamId}})",nodeAdded:"节点 {{nodeId}} 已新增",nodeAddFailed:"新增节点失败: {{message}}",nodeAddFailedNoWorkflow:"新增节点失败: workflow 未加载",nodeAddFailedEmptyFields:"新增节点失败: 节点ID/标题/Agent 不能为空",nodeAddFailedDuplicateId:"新增节点失败: 节点ID重复({{nodeId}})",nodeAddFailedInvalidDep:"新增节点失败: 非法依赖({{depId}})",groupAdded:"并行组 {{groupId}} 已新增",groupAddFailed:"新增并行组失败: {{message}}",groupAddFailedNoWorkflow:"新增并行组失败: workflow 未加载",groupAddFailedEmptyId:"新增并行组失败: 组 ID 不能为空",groupAddFailedDuplicateId:"新增并行组失败: 组 ID 已存在({{groupId}})",groupAddFailedMinMembers:"新增并行组失败: 组成员至少 2 个",groupAddFailedInvalidMember:"新增并行组失败: 非法成员({{memberId}})",groupAddFailedInvalidUpstream:"新增并行组失败: 非法组上游({{upstreamId}})",nodeDeleted:"节点 {{nodeId}} 已删除",nodeDeleteFailed:"删除节点失败: {{message}}",nodeDeleteFailedNoWorkflow:"删除节点失败: workflow 未加载",nodeDeleteFailedMinNodes:"删除节点失败: 至少保留一个节点",groupDeleted:"并行组 {{groupId}} 已删除",groupDeleteFailed:"删除并行组失败: {{message}}",groupDeleteFailedNoWorkflow:"删除并行组失败: workflow 未加载",groupDeleteFailedNotFound:"删除并行组失败: 找不到并行组({{groupId}})",nodeMovedUp:"节点 {{nodeId}} 顺序已上移",nodeMovedDown:"节点 {{nodeId}} 顺序已下移",nodeMoveFailed:"节点顺序保存失败: {{message}}",nodeReorderedAfter:"节点 {{nodeId}} 已拖动到 {{targetNodeId}} 后",nodeReorderedBefore:"节点 {{nodeId}} 已拖动到 {{targetNodeId}} 前",nodeReorderFailed:"节点拖动保存失败: {{message}}",idEmpty:"{{field}} 不能为空",pipelineTitleEmpty:"流水线标题不能为空"},t={schedulerConfig:"调度器配置(DAG-{{pipelineId}})",disableScheduler:"停用调度器",enableScheduler:"启用调度器",switchToMode:"切到{{mode}}模式",auto:"自动",manual:"手动",manualStep:"手动推进一步"},i={title:"设置",language:{label:"语言",zh:"中文",en:"English"}},s={versionInvalid:"workflow.version 非法,仅支持 3.0: {{version}}",mustBeArray:"workflow.nodes/edges/groups 必须为数组",duplicateNodeId:"workflow.nodes 存在重复 id",duplicateGroupId:"workflow.groups 存在重复 id",edgeReferencesMissing:"边引用了不存在实体: {{from}} -> {{to}}",selfLoopEdge:"检测到自环边: {{from}} -> {{to}}",duplicateEdge:"检测到重复边: {{from}} -> {{to}}",mixedEdgeTypes:"节点 {{nodeId}} 同时存在 dependency 与 route 出边,禁止保存",routeMustContainYesNo:"节点 {{nodeId}} 开启分流后必须包含 yes 和 no",yesMainlineMaxOne:"节点 {{nodeId}} 的 yes 主线依赖边最多只能有 1 条",yesCannotBeRouteEdge:"节点 {{nodeId}} 的 yes 不能保存为路由边",undeclaredRouteEdge:"节点 {{nodeId}} 存在未声明的路由边: {{route}}",routeMustTargetBranch:"节点 {{nodeId}} 的路由 {{route}} 只能指向支线节点或支线并行组",routeTargetMustBeOne:"节点 {{nodeId}} 的路由 {{route}} 必须配置且只能配置 1 个支线目标",groupTypeInvalid:"并行组 {{groupId}} 的 type 非法",groupMinMembers:"并行组 {{groupId}} 成员数量至少为 2",groupDuplicateMembers:"并行组 {{groupId}} 存在重复成员",groupMemberMissing:"并行组 {{groupId}} 引用了不存在成员 {{memberId}}",nodeGroupMissing:"节点 {{nodeId}} 引用了不存在并行组 {{groupId}}",nodeNotInGroup:"节点 {{nodeId}} 未加入其声明的并行组 {{groupId}}",groupCannotDirectConnect:"并行组 {{groupId}} 不能直接连入成员节点",groupMemberNoDirectDep:"并行组 {{groupId}} 成员之间禁止直接依赖",groupEntryCannotDirectConnect:"并行组 {{groupId}} 的入口节点不能直连成员",workflowHasCycle:"工作流存在环路,无法保存",nodeConfigSaveFailed:"节点配置保存失败: {{message}}",workflowConfigSaveFailed:"workflow 配置保存失败: {{message}}",routeSaveFailed:"路由策略保存失败: {{message}}"},p={app:e,action:d,status:o,gateway:a,common:l,time:n,actionMessage:r,scheduler:t,settings:i,validation:s};export{d as action,r as actionMessage,e as app,l as common,p as default,a as gateway,t as scheduler,i as settings,o as status,n as time,s as validation};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const w="等待中",C="运行中",Q="成功",h="失败",x="已取消",n="创建失败",e="加载中...",y="链接",L="队列",T="产物",t="投递链接 ({{count}})",c="创建链接",s="上游流水线",o="下游流水线",u="失败策略",i="continue(继续下一条)",l="pause(暂停队列)",a="最大排队数",p="创建中...",d="确认创建",V="取消",r="暂无投递链接",E="启用",F="停用",g="选择流水线",P="-- 选择流水线 --",f="请先选择流水线查看接收队列",k="队列为空",m="共 {{count}} 条",b="排空队列",q="请先选择流水线查看产物",O="暂无产物",j={pending:"等待中",running:"运行中",success:"成功",failed:"失败",canceled:"已取消",createFailed:n,loading:e,links:"链接",queue:"队列",outputs:"产物",linkCount:t,createLink:c,upstreamPipeline:s,downstreamPipeline:o,failPolicy:u,continueOption:i,pauseOption:l,maxQueue:a,creating:p,confirmCreate:d,cancel:"取消",noLinks:r,enable:"启用",disable:"停用",selectPipeline:g,selectPipelinePlaceholder:P,selectToViewQueue:f,queueEmpty:k,queueCount:m,drainQueue:b,selectToViewOutputs:q,noOutputs:O};export{V as cancel,x as canceled,d as confirmCreate,i as continueOption,n as createFailed,c as createLink,p as creating,j as default,F as disable,o as downstreamPipeline,b as drainQueue,E as enable,u as failPolicy,h as failed,t as linkCount,y as links,e as loading,a as maxQueue,r as noLinks,O as noOutputs,T as outputs,l as pauseOption,w as pending,L as queue,m as queueCount,k as queueEmpty,C as running,g as selectPipeline,P as selectPipelinePlaceholder,q as selectToViewOutputs,f as selectToViewQueue,Q as success,s as upstreamPipeline};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e="Pending",n="Running",t="Success",i="Failed",s="Canceled",c="Failed to create link",o="Loading...",u="Links",l="Queue",a="Outputs",p="Delivery Links ({{count}})",r="Create Link",d="Upstream Pipeline",P="Downstream Pipeline",m="Failure Policy",k="Continue",C="Pause queue",g="Max Queue Size",Q="Creating...",w="Confirm",y="Cancel",L="No delivery links",S="Enable",f="Disable",q="Select Pipeline",O="-- Select Pipeline --",b="Select a pipeline to view its queue",v="Queue is empty",D="{{count}} items",F="Drain Queue",x="Select a pipeline to view its outputs",h="No outputs",E={pending:e,running:n,success:t,failed:i,canceled:s,createFailed:c,loading:o,links:u,queue:l,outputs:a,linkCount:p,createLink:r,upstreamPipeline:d,downstreamPipeline:P,failPolicy:m,continueOption:k,pauseOption:C,maxQueue:g,creating:Q,confirmCreate:w,cancel:y,noLinks:L,enable:S,disable:f,selectPipeline:q,selectPipelinePlaceholder:O,selectToViewQueue:b,queueEmpty:v,queueCount:D,drainQueue:F,selectToViewOutputs:x,noOutputs:h};export{y as cancel,s as canceled,w as confirmCreate,k as continueOption,c as createFailed,r as createLink,Q as creating,E as default,f as disable,P as downstreamPipeline,F as drainQueue,S as enable,m as failPolicy,i as failed,p as linkCount,u as links,o as loading,g as maxQueue,L as noLinks,h as noOutputs,a as outputs,C as pauseOption,e as pending,l as queue,D as queueCount,v as queueEmpty,n as running,q as selectPipeline,O as selectPipelinePlaceholder,x as selectToViewOutputs,b as selectToViewQueue,t as success,d as upstreamPipeline};
|