@probelabs/visor 0.1.181 → 0.1.182-ee
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/defaults/code-talk.yaml +80 -14
- package/defaults/engineer.yaml +33 -15
- package/defaults/skills/code-explorer.yaml +5 -0
- package/dist/agent-protocol/a2a-frontend.d.ts +10 -0
- package/dist/agent-protocol/a2a-frontend.d.ts.map +1 -1
- package/dist/agent-protocol/task-evaluator.d.ts +52 -0
- package/dist/agent-protocol/task-evaluator.d.ts.map +1 -0
- package/dist/agent-protocol/task-store.d.ts +5 -3
- package/dist/agent-protocol/task-store.d.ts.map +1 -1
- package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
- package/dist/agent-protocol/tasks-tui.d.ts +34 -0
- package/dist/agent-protocol/tasks-tui.d.ts.map +1 -0
- package/dist/agent-protocol/trace-serializer.d.ts +90 -0
- package/dist/agent-protocol/trace-serializer.d.ts.map +1 -0
- package/dist/agent-protocol/track-execution.d.ts +2 -0
- package/dist/agent-protocol/track-execution.d.ts.map +1 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/defaults/code-talk.yaml +80 -14
- package/dist/defaults/engineer.yaml +33 -15
- package/dist/defaults/skills/code-explorer.yaml +5 -0
- package/dist/docs/commands.md +57 -14
- package/dist/docs/configuration.md +2 -0
- package/dist/docs/guides/graceful-restart.md +178 -0
- package/dist/docs/observability.md +69 -0
- package/dist/docs/production-deployment.md +17 -0
- package/dist/email/polling-runner.d.ts +4 -0
- package/dist/email/polling-runner.d.ts.map +1 -1
- package/dist/generated/config-schema.d.ts +70 -6
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +36 -6
- package/dist/index.js +7420 -1483
- package/dist/providers/mcp-custom-sse-server.d.ts +4 -0
- package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
- package/dist/runners/graceful-restart.d.ts +46 -0
- package/dist/runners/graceful-restart.d.ts.map +1 -0
- package/dist/runners/mcp-server-runner.d.ts +12 -0
- package/dist/runners/mcp-server-runner.d.ts.map +1 -1
- package/dist/runners/runner-factory.d.ts.map +1 -1
- package/dist/runners/runner-host.d.ts +12 -0
- package/dist/runners/runner-host.d.ts.map +1 -1
- package/dist/runners/runner.d.ts +12 -0
- package/dist/runners/runner.d.ts.map +1 -1
- package/dist/sdk/{a2a-frontend-IWOUJOIZ.mjs → a2a-frontend-4LP3MLTS.mjs} +47 -5
- package/dist/sdk/a2a-frontend-4LP3MLTS.mjs.map +1 -0
- package/dist/sdk/{a2a-frontend-BDACLGMA.mjs → a2a-frontend-MU5EO2HZ.mjs} +35 -1
- package/dist/sdk/a2a-frontend-MU5EO2HZ.mjs.map +1 -0
- package/dist/sdk/{check-provider-registry-4YKTEDKF.mjs → check-provider-registry-I4BCWKRU.mjs} +7 -7
- package/dist/sdk/{check-provider-registry-4YFVBGYU.mjs → check-provider-registry-RRWCXSTG.mjs} +3 -3
- package/dist/sdk/{chunk-VMVIM4JB.mjs → chunk-4I3TJ7UJ.mjs} +37 -7
- package/dist/sdk/chunk-4I3TJ7UJ.mjs.map +1 -0
- package/dist/sdk/{chunk-7YZSSO4X.mjs → chunk-6DPPP7LD.mjs} +10 -10
- package/dist/sdk/chunk-7ERVRLDV.mjs +296 -0
- package/dist/sdk/chunk-7ERVRLDV.mjs.map +1 -0
- package/dist/sdk/{chunk-VXC2XNQJ.mjs → chunk-ANUT54HW.mjs} +3 -3
- package/dist/sdk/{chunk-J73GEFPT.mjs → chunk-DHETLQIX.mjs} +2 -2
- package/dist/sdk/{chunk-DGIH6EX3.mjs → chunk-QXT47ZHR.mjs} +151 -281
- package/dist/sdk/chunk-QXT47ZHR.mjs.map +1 -0
- package/dist/sdk/{chunk-4DVP6KVC.mjs → chunk-TQQNSHQV.mjs} +72 -31
- package/dist/sdk/chunk-TQQNSHQV.mjs.map +1 -0
- package/dist/sdk/chunk-ZOF5QT6U.mjs +5943 -0
- package/dist/sdk/chunk-ZOF5QT6U.mjs.map +1 -0
- package/dist/sdk/{config-TSA5FUOM.mjs → config-2STD74CJ.mjs} +2 -2
- package/dist/sdk/config-JE4HKTWW.mjs +16 -0
- package/dist/sdk/{failure-condition-evaluator-HTPB5FYW.mjs → failure-condition-evaluator-5DZYMCGW.mjs} +4 -4
- package/dist/sdk/{github-frontend-3SDFCCKI.mjs → github-frontend-L3F5JXPJ.mjs} +4 -4
- package/dist/sdk/{host-QE4L7UXE.mjs → host-QBJ7TOWG.mjs} +3 -3
- package/dist/sdk/{host-CVH2CSHM.mjs → host-X5ZZCEWN.mjs} +2 -2
- package/dist/sdk/knex-store-QCEW4I4R.mjs +527 -0
- package/dist/sdk/knex-store-QCEW4I4R.mjs.map +1 -0
- package/dist/sdk/loader-ZNKKJEZ3.mjs +89 -0
- package/dist/sdk/loader-ZNKKJEZ3.mjs.map +1 -0
- package/dist/sdk/opa-policy-engine-QCSSIMUF.mjs +655 -0
- package/dist/sdk/opa-policy-engine-QCSSIMUF.mjs.map +1 -0
- package/dist/sdk/{routing-YVMTKFDZ.mjs → routing-CVQT4KHX.mjs} +5 -5
- package/dist/sdk/{schedule-tool-Z5VG67JK.mjs → schedule-tool-AECLFHSY.mjs} +7 -7
- package/dist/sdk/{schedule-tool-ZMX3Y7LF.mjs → schedule-tool-Z6QYL2B3.mjs} +3 -3
- package/dist/sdk/{schedule-tool-handler-PCERK6ZZ.mjs → schedule-tool-handler-6QLZRTQA.mjs} +7 -7
- package/dist/sdk/{schedule-tool-handler-N7UNABOA.mjs → schedule-tool-handler-J4NUETJ6.mjs} +3 -3
- package/dist/sdk/sdk.d.mts +33 -0
- package/dist/sdk/sdk.d.ts +33 -0
- package/dist/sdk/sdk.js +3545 -455
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +6 -6
- package/dist/sdk/task-evaluator-HLNXKKVV.mjs +1278 -0
- package/dist/sdk/task-evaluator-HLNXKKVV.mjs.map +1 -0
- package/dist/sdk/{trace-helpers-KXDOJWBL.mjs → trace-helpers-WJXYVV4S.mjs} +3 -3
- package/dist/sdk/trace-reader-ZY77OFNM.mjs +266 -0
- package/dist/sdk/trace-reader-ZY77OFNM.mjs.map +1 -0
- package/dist/sdk/track-execution-MKIQXP2C.mjs +136 -0
- package/dist/sdk/track-execution-MKIQXP2C.mjs.map +1 -0
- package/dist/sdk/validator-XTZJZZJH.mjs +134 -0
- package/dist/sdk/validator-XTZJZZJH.mjs.map +1 -0
- package/dist/sdk/{workflow-check-provider-NTHC5ZBF.mjs → workflow-check-provider-EXMC6JIS.mjs} +7 -7
- package/dist/sdk/{workflow-check-provider-SRIMWKLQ.mjs → workflow-check-provider-VKYGI5GK.mjs} +3 -3
- package/dist/slack/socket-runner.d.ts +12 -0
- package/dist/slack/socket-runner.d.ts.map +1 -1
- package/dist/teams/webhook-runner.d.ts +4 -0
- package/dist/teams/webhook-runner.d.ts.map +1 -1
- package/dist/telegram/polling-runner.d.ts +2 -0
- package/dist/telegram/polling-runner.d.ts.map +1 -1
- package/dist/types/config.d.ts +33 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/whatsapp/webhook-runner.d.ts +4 -0
- package/dist/whatsapp/webhook-runner.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/output/traces/run-2026-03-17T13-58-29-402Z.ndjson +0 -157
- package/dist/output/traces/run-2026-03-17T13-59-10-403Z.ndjson +0 -2333
- package/dist/sdk/a2a-frontend-BDACLGMA.mjs.map +0 -1
- package/dist/sdk/a2a-frontend-IWOUJOIZ.mjs.map +0 -1
- package/dist/sdk/check-provider-registry-67ZLGDDQ.mjs +0 -31
- package/dist/sdk/chunk-4DVP6KVC.mjs.map +0 -1
- package/dist/sdk/chunk-DGIH6EX3.mjs.map +0 -1
- package/dist/sdk/chunk-QGBASDYP.mjs +0 -46153
- package/dist/sdk/chunk-QGBASDYP.mjs.map +0 -1
- package/dist/sdk/chunk-VMVIM4JB.mjs.map +0 -1
- package/dist/sdk/host-VBBSLUWG.mjs +0 -87
- package/dist/sdk/host-VBBSLUWG.mjs.map +0 -1
- package/dist/sdk/schedule-tool-ADUXTCY7.mjs +0 -37
- package/dist/sdk/schedule-tool-handler-QOJVFRB4.mjs +0 -41
- package/dist/sdk/workflow-check-provider-CJXW2Z4F.mjs +0 -31
- package/dist/sdk/workflow-check-provider-CJXW2Z4F.mjs.map +0 -1
- package/dist/sdk/workflow-check-provider-NTHC5ZBF.mjs.map +0 -1
- package/dist/sdk/workflow-check-provider-SRIMWKLQ.mjs.map +0 -1
- package/dist/traces/run-2026-03-17T13-58-29-402Z.ndjson +0 -157
- package/dist/traces/run-2026-03-17T13-59-10-403Z.ndjson +0 -2333
- /package/dist/sdk/{check-provider-registry-4YFVBGYU.mjs.map → check-provider-registry-I4BCWKRU.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-4YKTEDKF.mjs.map → check-provider-registry-RRWCXSTG.mjs.map} +0 -0
- /package/dist/sdk/{chunk-7YZSSO4X.mjs.map → chunk-6DPPP7LD.mjs.map} +0 -0
- /package/dist/sdk/{chunk-VXC2XNQJ.mjs.map → chunk-ANUT54HW.mjs.map} +0 -0
- /package/dist/sdk/{chunk-J73GEFPT.mjs.map → chunk-DHETLQIX.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-67ZLGDDQ.mjs.map → config-2STD74CJ.mjs.map} +0 -0
- /package/dist/sdk/{config-TSA5FUOM.mjs.map → config-JE4HKTWW.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-HTPB5FYW.mjs.map → failure-condition-evaluator-5DZYMCGW.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-3SDFCCKI.mjs.map → github-frontend-L3F5JXPJ.mjs.map} +0 -0
- /package/dist/sdk/{host-CVH2CSHM.mjs.map → host-QBJ7TOWG.mjs.map} +0 -0
- /package/dist/sdk/{host-QE4L7UXE.mjs.map → host-X5ZZCEWN.mjs.map} +0 -0
- /package/dist/sdk/{routing-YVMTKFDZ.mjs.map → routing-CVQT4KHX.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-ADUXTCY7.mjs.map → schedule-tool-AECLFHSY.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-Z5VG67JK.mjs.map → schedule-tool-Z6QYL2B3.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-ZMX3Y7LF.mjs.map → schedule-tool-handler-6QLZRTQA.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-N7UNABOA.mjs.map → schedule-tool-handler-J4NUETJ6.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-PCERK6ZZ.mjs.map → trace-helpers-WJXYVV4S.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-QOJVFRB4.mjs.map → workflow-check-provider-EXMC6JIS.mjs.map} +0 -0
- /package/dist/sdk/{trace-helpers-KXDOJWBL.mjs.map → workflow-check-provider-VKYGI5GK.mjs.map} +0 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getInstanceId,
|
|
3
|
+
init_instance_id,
|
|
4
|
+
require_package
|
|
5
|
+
} from "./chunk-QXT47ZHR.mjs";
|
|
6
|
+
import {
|
|
7
|
+
init_logger,
|
|
8
|
+
logger
|
|
9
|
+
} from "./chunk-FT3I25QV.mjs";
|
|
10
|
+
import {
|
|
11
|
+
init_lazy_otel,
|
|
12
|
+
trace
|
|
13
|
+
} from "./chunk-UCMJJ3IM.mjs";
|
|
14
|
+
import {
|
|
15
|
+
__esm
|
|
16
|
+
} from "./chunk-J7LXIPZS.mjs";
|
|
17
|
+
|
|
18
|
+
// src/agent-protocol/track-execution.ts
|
|
19
|
+
import crypto from "crypto";
|
|
20
|
+
import path from "path";
|
|
21
|
+
function getPackageVersion() {
|
|
22
|
+
try {
|
|
23
|
+
return require_package()?.version || "dev";
|
|
24
|
+
} catch {
|
|
25
|
+
return "dev";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async function trackExecution(opts, executor) {
|
|
29
|
+
const { taskStore, source, configPath, metadata, messageText } = opts;
|
|
30
|
+
const configName = configPath ? path.basename(configPath, path.extname(configPath)) : void 0;
|
|
31
|
+
const workflowId = configName && opts.workflowId ? `${configName}#${opts.workflowId}` : opts.workflowId;
|
|
32
|
+
const requestMessage = {
|
|
33
|
+
message_id: crypto.randomUUID(),
|
|
34
|
+
role: "user",
|
|
35
|
+
parts: [{ text: messageText }]
|
|
36
|
+
};
|
|
37
|
+
const traceFile = process.env.VISOR_FALLBACK_TRACE_FILE || void 0;
|
|
38
|
+
const task = taskStore.createTask({
|
|
39
|
+
contextId: crypto.randomUUID(),
|
|
40
|
+
requestMessage,
|
|
41
|
+
workflowId,
|
|
42
|
+
requestMetadata: {
|
|
43
|
+
source,
|
|
44
|
+
instance_id: getInstanceId(),
|
|
45
|
+
visor_version: process.env.VISOR_VERSION || getPackageVersion(),
|
|
46
|
+
...process.env.VISOR_COMMIT_SHORT ? { visor_commit: process.env.VISOR_COMMIT_SHORT } : {},
|
|
47
|
+
trace_id: trace.getActiveSpan()?.spanContext().traceId || void 0,
|
|
48
|
+
...traceFile ? { trace_file: traceFile } : {},
|
|
49
|
+
...metadata
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
const instanceId = getInstanceId();
|
|
53
|
+
taskStore.updateTaskState(task.id, "working");
|
|
54
|
+
taskStore.claimTask(task.id, instanceId);
|
|
55
|
+
logger.info(
|
|
56
|
+
`[TaskTracking] Task ${task.id} started (source=${source}, workflow=${workflowId || "-"}, instance=${instanceId})`
|
|
57
|
+
);
|
|
58
|
+
try {
|
|
59
|
+
const result = await executor();
|
|
60
|
+
let responseText = "Execution completed";
|
|
61
|
+
try {
|
|
62
|
+
const history = result?.reviewSummary?.history;
|
|
63
|
+
if (history) {
|
|
64
|
+
const entries = Object.values(history);
|
|
65
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
66
|
+
const outputs = entries[i];
|
|
67
|
+
if (!Array.isArray(outputs)) continue;
|
|
68
|
+
for (let j = outputs.length - 1; j >= 0; j--) {
|
|
69
|
+
const text = outputs[j]?.text;
|
|
70
|
+
if (typeof text === "string" && text.trim().length > 0) {
|
|
71
|
+
responseText = text.trim();
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (responseText !== "Execution completed") break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
} catch {
|
|
79
|
+
}
|
|
80
|
+
const completedMsg = {
|
|
81
|
+
message_id: crypto.randomUUID(),
|
|
82
|
+
role: "agent",
|
|
83
|
+
parts: [{ text: responseText }]
|
|
84
|
+
};
|
|
85
|
+
try {
|
|
86
|
+
taskStore.updateTaskState(task.id, "completed", completedMsg);
|
|
87
|
+
logger.info(`[TaskTracking] Task ${task.id} completed`);
|
|
88
|
+
} catch (stateErr) {
|
|
89
|
+
logger.warn(
|
|
90
|
+
`[TaskTracking] Task ${task.id} completed but state transition failed: ${stateErr instanceof Error ? stateErr.message : stateErr}`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
if (opts.autoEvaluate || process.env.VISOR_TASK_EVALUATE === "true") {
|
|
94
|
+
scheduleEvaluation(task.id, taskStore);
|
|
95
|
+
}
|
|
96
|
+
return { task, result };
|
|
97
|
+
} catch (err) {
|
|
98
|
+
const errorText = err instanceof Error ? err.message : String(err);
|
|
99
|
+
const failMessage = {
|
|
100
|
+
message_id: crypto.randomUUID(),
|
|
101
|
+
role: "agent",
|
|
102
|
+
parts: [{ text: errorText }]
|
|
103
|
+
};
|
|
104
|
+
try {
|
|
105
|
+
taskStore.updateTaskState(task.id, "failed", failMessage);
|
|
106
|
+
logger.info(`[TaskTracking] Task ${task.id} failed: ${errorText}`);
|
|
107
|
+
} catch {
|
|
108
|
+
}
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function scheduleEvaluation(taskId, taskStore) {
|
|
113
|
+
setTimeout(async () => {
|
|
114
|
+
try {
|
|
115
|
+
const { evaluateAndStore } = await import("./task-evaluator-HLNXKKVV.mjs");
|
|
116
|
+
await evaluateAndStore(taskId, taskStore);
|
|
117
|
+
logger.info(`[TaskEvaluator] Auto-evaluation completed for task ${taskId}`);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
logger.warn(
|
|
120
|
+
`[TaskEvaluator] Auto-evaluation failed for task ${taskId}: ${err instanceof Error ? err.message : err}`
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
}, 5e3);
|
|
124
|
+
}
|
|
125
|
+
var init_track_execution = __esm({
|
|
126
|
+
"src/agent-protocol/track-execution.ts"() {
|
|
127
|
+
init_logger();
|
|
128
|
+
init_lazy_otel();
|
|
129
|
+
init_instance_id();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
init_track_execution();
|
|
133
|
+
export {
|
|
134
|
+
trackExecution
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=track-execution-MKIQXP2C.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/agent-protocol/track-execution.ts"],"sourcesContent":["/**\n * Shared execution tracking helper.\n *\n * Wraps any engine execution call with task lifecycle management:\n * creates a task in 'submitted' state, transitions to 'working',\n * runs the executor, then sets terminal state (completed/failed).\n *\n * Used by CLI, Slack, TUI, and Scheduler frontends when task_tracking is enabled.\n */\n\nimport crypto from 'crypto';\nimport path from 'path';\nimport { logger } from '../logger';\nimport { trace } from '../telemetry/lazy-otel';\nimport { getInstanceId } from '../utils/instance-id';\nimport type { TaskStore } from './task-store';\nimport type { AgentMessage, AgentTask } from './types';\n\nfunction getPackageVersion(): string {\n try {\n return require('../../package.json')?.version || 'dev';\n } catch {\n return 'dev';\n }\n}\n\nexport type TaskSource =\n | 'cli'\n | 'slack'\n | 'telegram'\n | 'email'\n | 'whatsapp'\n | 'teams'\n | 'a2a'\n | 'mcp'\n | 'tui'\n | 'scheduler'\n | 'webhook';\n\nexport interface TrackExecutionOptions {\n taskStore: TaskStore;\n source: TaskSource;\n workflowId?: string;\n /** Config file path — used to prefix workflowId as \"config.yaml#workflow\" */\n configPath?: string;\n metadata?: Record<string, unknown>;\n /** Human-readable description of what's being executed */\n messageText: string;\n /** Run LLM evaluation after task completion (non-blocking). */\n autoEvaluate?: boolean;\n}\n\n/**\n * Wrap an engine execution call with task lifecycle tracking.\n *\n * Creates a task, transitions to 'working', runs the executor,\n * then sets terminal state. Returns both the task and the original result.\n * Re-throws any executor error after marking the task as failed.\n */\nexport async function trackExecution<T>(\n opts: TrackExecutionOptions,\n executor: () => Promise<T>\n): Promise<{ task: AgentTask; result: T }> {\n const { taskStore, source, configPath, metadata, messageText } = opts;\n const configName = configPath ? path.basename(configPath, path.extname(configPath)) : undefined;\n const workflowId =\n configName && opts.workflowId ? `${configName}#${opts.workflowId}` : opts.workflowId;\n\n const requestMessage: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'user',\n parts: [{ text: messageText }],\n };\n\n // Capture trace file path if telemetry is writing to a file\n const traceFile = process.env.VISOR_FALLBACK_TRACE_FILE || undefined;\n\n const task = taskStore.createTask({\n contextId: crypto.randomUUID(),\n requestMessage,\n workflowId,\n requestMetadata: {\n source,\n instance_id: getInstanceId(),\n visor_version: process.env.VISOR_VERSION || getPackageVersion(),\n ...(process.env.VISOR_COMMIT_SHORT ? { visor_commit: process.env.VISOR_COMMIT_SHORT } : {}),\n trace_id: trace.getActiveSpan()?.spanContext().traceId || undefined,\n ...(traceFile ? { trace_file: traceFile } : {}),\n ...metadata,\n },\n });\n\n const instanceId = getInstanceId();\n taskStore.updateTaskState(task.id, 'working');\n taskStore.claimTask(task.id, instanceId);\n logger.info(\n `[TaskTracking] Task ${task.id} started (source=${source}, workflow=${workflowId || '-'}, instance=${instanceId})`\n );\n\n try {\n const result = await executor();\n\n // Extract AI response text from the result.\n // result.reviewSummary.history is keyed by checkId with arrays of outputs.\n // We want the LAST check's text output (the final AI response), not the\n // first (which is typically the intent router).\n let responseText = 'Execution completed';\n try {\n const history = (result as any)?.reviewSummary?.history as\n | Record<string, unknown[]>\n | undefined;\n if (history) {\n const entries = Object.values(history);\n // Iterate in reverse — last check output is the final response\n for (let i = entries.length - 1; i >= 0; i--) {\n const outputs = entries[i];\n if (!Array.isArray(outputs)) continue;\n // Within a check, look at the last output first too\n for (let j = outputs.length - 1; j >= 0; j--) {\n const text = (outputs[j] as any)?.text;\n if (typeof text === 'string' && text.trim().length > 0) {\n responseText = text.trim();\n break;\n }\n }\n if (responseText !== 'Execution completed') break;\n }\n }\n } catch {\n // ignore extraction errors\n }\n\n const completedMsg: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: responseText }],\n };\n try {\n taskStore.updateTaskState(task.id, 'completed', completedMsg);\n logger.info(`[TaskTracking] Task ${task.id} completed`);\n } catch (stateErr) {\n // Another process (e.g. stale sweep) may have already marked this task as failed.\n // Log a warning but do NOT re-throw — the execution itself succeeded.\n logger.warn(\n `[TaskTracking] Task ${task.id} completed but state transition failed: ${stateErr instanceof Error ? stateErr.message : stateErr}`\n );\n }\n\n // Fire-and-forget LLM evaluation (non-blocking)\n // Enabled via opts.autoEvaluate (from config.task_evaluate) or VISOR_TASK_EVALUATE env var\n if (opts.autoEvaluate || process.env.VISOR_TASK_EVALUATE === 'true') {\n scheduleEvaluation(task.id, taskStore);\n }\n\n return { task, result };\n } catch (err) {\n const errorText = err instanceof Error ? err.message : String(err);\n const failMessage: AgentMessage = {\n message_id: crypto.randomUUID(),\n role: 'agent',\n parts: [{ text: errorText }],\n };\n try {\n taskStore.updateTaskState(task.id, 'failed', failMessage);\n logger.info(`[TaskTracking] Task ${task.id} failed: ${errorText}`);\n } catch {\n // ignore double-failure\n }\n throw err; // re-throw to preserve original behavior\n }\n}\n\n// ---------------------------------------------------------------------------\n// Non-blocking auto-evaluation\n// ---------------------------------------------------------------------------\n\nfunction scheduleEvaluation(taskId: string, taskStore: TaskStore): void {\n // Delay slightly to let OTEL spans flush before we try to read the trace\n setTimeout(async () => {\n try {\n const { evaluateAndStore } = await import('./task-evaluator');\n await evaluateAndStore(taskId, taskStore as any);\n logger.info(`[TaskEvaluator] Auto-evaluation completed for task ${taskId}`);\n } catch (err) {\n logger.warn(\n `[TaskEvaluator] Auto-evaluation failed for task ${taskId}: ${err instanceof Error ? err.message : err}`\n );\n }\n }, 5000);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__esm
|
|
3
|
+
} from "./chunk-J7LXIPZS.mjs";
|
|
4
|
+
|
|
5
|
+
// src/enterprise/license/validator.ts
|
|
6
|
+
import * as crypto from "crypto";
|
|
7
|
+
import * as fs from "fs";
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
var LicenseValidator;
|
|
10
|
+
var init_validator = __esm({
|
|
11
|
+
"src/enterprise/license/validator.ts"() {
|
|
12
|
+
LicenseValidator = class _LicenseValidator {
|
|
13
|
+
/** Ed25519 public key for license verification (PEM format). */
|
|
14
|
+
static PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAI/Zd08EFmgIdrDm/HXd0l3/5GBt7R1PrdvhdmEXhJlU=\n-----END PUBLIC KEY-----\n";
|
|
15
|
+
cache = null;
|
|
16
|
+
static CACHE_TTL = 5 * 60 * 1e3;
|
|
17
|
+
// 5 minutes
|
|
18
|
+
static GRACE_PERIOD = 72 * 3600 * 1e3;
|
|
19
|
+
// 72 hours after expiry
|
|
20
|
+
/**
|
|
21
|
+
* Load and validate license from environment or file.
|
|
22
|
+
*
|
|
23
|
+
* Resolution order:
|
|
24
|
+
* 1. VISOR_LICENSE env var (JWT string)
|
|
25
|
+
* 2. VISOR_LICENSE_FILE env var (path to file)
|
|
26
|
+
* 3. .visor-license in project root (cwd)
|
|
27
|
+
* 4. .visor-license in ~/.config/visor/
|
|
28
|
+
*/
|
|
29
|
+
async loadAndValidate() {
|
|
30
|
+
if (this.cache && Date.now() - this.cache.validatedAt < _LicenseValidator.CACHE_TTL) {
|
|
31
|
+
return this.cache.payload;
|
|
32
|
+
}
|
|
33
|
+
const token = this.resolveToken();
|
|
34
|
+
if (!token) return null;
|
|
35
|
+
const payload = this.verifyAndDecode(token);
|
|
36
|
+
if (!payload) return null;
|
|
37
|
+
this.cache = { payload, validatedAt: Date.now() };
|
|
38
|
+
return payload;
|
|
39
|
+
}
|
|
40
|
+
/** Check if a specific feature is licensed */
|
|
41
|
+
hasFeature(feature) {
|
|
42
|
+
if (!this.cache) return false;
|
|
43
|
+
return this.cache.payload.features.includes(feature);
|
|
44
|
+
}
|
|
45
|
+
/** Check if license is valid (with grace period) */
|
|
46
|
+
isValid() {
|
|
47
|
+
if (!this.cache) return false;
|
|
48
|
+
const now = Date.now();
|
|
49
|
+
const expiryMs = this.cache.payload.exp * 1e3;
|
|
50
|
+
return now < expiryMs + _LicenseValidator.GRACE_PERIOD;
|
|
51
|
+
}
|
|
52
|
+
/** Check if the license is within its grace period (expired but still valid) */
|
|
53
|
+
isInGracePeriod() {
|
|
54
|
+
if (!this.cache) return false;
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
const expiryMs = this.cache.payload.exp * 1e3;
|
|
57
|
+
return now >= expiryMs && now < expiryMs + _LicenseValidator.GRACE_PERIOD;
|
|
58
|
+
}
|
|
59
|
+
resolveToken() {
|
|
60
|
+
if (process.env.VISOR_LICENSE) {
|
|
61
|
+
return process.env.VISOR_LICENSE.trim();
|
|
62
|
+
}
|
|
63
|
+
if (process.env.VISOR_LICENSE_FILE) {
|
|
64
|
+
const resolved = path.resolve(process.env.VISOR_LICENSE_FILE);
|
|
65
|
+
const home2 = process.env.HOME || process.env.USERPROFILE || "";
|
|
66
|
+
const allowedPrefixes = [path.normalize(process.cwd())];
|
|
67
|
+
if (home2) allowedPrefixes.push(path.normalize(path.join(home2, ".config", "visor")));
|
|
68
|
+
let realPath;
|
|
69
|
+
try {
|
|
70
|
+
realPath = fs.realpathSync(resolved);
|
|
71
|
+
} catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const isSafe = allowedPrefixes.some(
|
|
75
|
+
(prefix) => realPath === prefix || realPath.startsWith(prefix + path.sep)
|
|
76
|
+
);
|
|
77
|
+
if (!isSafe) return null;
|
|
78
|
+
return this.readFile(realPath);
|
|
79
|
+
}
|
|
80
|
+
const cwdPath = path.join(process.cwd(), ".visor-license");
|
|
81
|
+
const cwdToken = this.readFile(cwdPath);
|
|
82
|
+
if (cwdToken) return cwdToken;
|
|
83
|
+
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
84
|
+
if (home) {
|
|
85
|
+
const configPath = path.join(home, ".config", "visor", ".visor-license");
|
|
86
|
+
const configToken = this.readFile(configPath);
|
|
87
|
+
if (configToken) return configToken;
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
readFile(filePath) {
|
|
92
|
+
try {
|
|
93
|
+
return fs.readFileSync(filePath, "utf-8").trim();
|
|
94
|
+
} catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
verifyAndDecode(token) {
|
|
99
|
+
try {
|
|
100
|
+
const parts = token.split(".");
|
|
101
|
+
if (parts.length !== 3) return null;
|
|
102
|
+
const [headerB64, payloadB64, signatureB64] = parts;
|
|
103
|
+
const header = JSON.parse(Buffer.from(headerB64, "base64url").toString());
|
|
104
|
+
if (header.alg !== "EdDSA") return null;
|
|
105
|
+
const data = `${headerB64}.${payloadB64}`;
|
|
106
|
+
const signature = Buffer.from(signatureB64, "base64url");
|
|
107
|
+
const publicKey = crypto.createPublicKey(_LicenseValidator.PUBLIC_KEY);
|
|
108
|
+
if (publicKey.asymmetricKeyType !== "ed25519") {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const isValid = crypto.verify(null, Buffer.from(data), publicKey, signature);
|
|
112
|
+
if (!isValid) return null;
|
|
113
|
+
const payload = JSON.parse(Buffer.from(payloadB64, "base64url").toString());
|
|
114
|
+
if (!payload.org || !Array.isArray(payload.features) || typeof payload.exp !== "number" || typeof payload.iat !== "number" || !payload.sub) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const now = Date.now();
|
|
118
|
+
const expiryMs = payload.exp * 1e3;
|
|
119
|
+
if (now >= expiryMs + _LicenseValidator.GRACE_PERIOD) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return payload;
|
|
123
|
+
} catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
init_validator();
|
|
131
|
+
export {
|
|
132
|
+
LicenseValidator
|
|
133
|
+
};
|
|
134
|
+
//# sourceMappingURL=validator-XTZJZZJH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/enterprise/license/validator.ts"],"sourcesContent":["/**\n * Copyright (c) ProbeLabs. All rights reserved.\n * Licensed under the Elastic License 2.0; you may not use this file except\n * in compliance with the Elastic License 2.0.\n */\n\nimport * as crypto from 'crypto';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nexport interface LicensePayload {\n org: string;\n features: string[];\n exp: number;\n iat: number;\n sub: string;\n}\n\nexport class LicenseValidator {\n /** Ed25519 public key for license verification (PEM format). */\n private static PUBLIC_KEY =\n '-----BEGIN PUBLIC KEY-----\\n' +\n 'MCowBQYDK2VwAyEAI/Zd08EFmgIdrDm/HXd0l3/5GBt7R1PrdvhdmEXhJlU=\\n' +\n '-----END PUBLIC KEY-----\\n';\n\n private cache: { payload: LicensePayload; validatedAt: number } | null = null;\n private static CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n private static GRACE_PERIOD = 72 * 3600 * 1000; // 72 hours after expiry\n\n /**\n * Load and validate license from environment or file.\n *\n * Resolution order:\n * 1. VISOR_LICENSE env var (JWT string)\n * 2. VISOR_LICENSE_FILE env var (path to file)\n * 3. .visor-license in project root (cwd)\n * 4. .visor-license in ~/.config/visor/\n */\n async loadAndValidate(): Promise<LicensePayload | null> {\n // Return cached result if still fresh\n if (this.cache && Date.now() - this.cache.validatedAt < LicenseValidator.CACHE_TTL) {\n return this.cache.payload;\n }\n\n const token = this.resolveToken();\n if (!token) return null;\n\n const payload = this.verifyAndDecode(token);\n if (!payload) return null;\n\n this.cache = { payload, validatedAt: Date.now() };\n return payload;\n }\n\n /** Check if a specific feature is licensed */\n hasFeature(feature: string): boolean {\n if (!this.cache) return false;\n return this.cache.payload.features.includes(feature);\n }\n\n /** Check if license is valid (with grace period) */\n isValid(): boolean {\n if (!this.cache) return false;\n const now = Date.now();\n const expiryMs = this.cache.payload.exp * 1000;\n return now < expiryMs + LicenseValidator.GRACE_PERIOD;\n }\n\n /** Check if the license is within its grace period (expired but still valid) */\n isInGracePeriod(): boolean {\n if (!this.cache) return false;\n const now = Date.now();\n const expiryMs = this.cache.payload.exp * 1000;\n return now >= expiryMs && now < expiryMs + LicenseValidator.GRACE_PERIOD;\n }\n\n private resolveToken(): string | null {\n // 1. Direct env var\n if (process.env.VISOR_LICENSE) {\n return process.env.VISOR_LICENSE.trim();\n }\n\n // 2. File path from env (validate against path traversal)\n if (process.env.VISOR_LICENSE_FILE) {\n // path.resolve() produces an absolute path with all '..' segments resolved,\n // so a separate resolved.includes('..') check is unnecessary.\n const resolved = path.resolve(process.env.VISOR_LICENSE_FILE);\n const home = process.env.HOME || process.env.USERPROFILE || '';\n const allowedPrefixes = [path.normalize(process.cwd())];\n if (home) allowedPrefixes.push(path.normalize(path.join(home, '.config', 'visor')));\n\n // Resolve symlinks so an attacker cannot create a symlink inside an\n // allowed prefix that points to an arbitrary file outside it.\n let realPath: string;\n try {\n realPath = fs.realpathSync(resolved);\n } catch {\n return null; // File doesn't exist or isn't accessible\n }\n\n const isSafe = allowedPrefixes.some(\n prefix => realPath === prefix || realPath.startsWith(prefix + path.sep)\n );\n if (!isSafe) return null;\n return this.readFile(realPath);\n }\n\n // 3. .visor-license in cwd\n const cwdPath = path.join(process.cwd(), '.visor-license');\n const cwdToken = this.readFile(cwdPath);\n if (cwdToken) return cwdToken;\n\n // 4. ~/.config/visor/.visor-license\n const home = process.env.HOME || process.env.USERPROFILE || '';\n if (home) {\n const configPath = path.join(home, '.config', 'visor', '.visor-license');\n const configToken = this.readFile(configPath);\n if (configToken) return configToken;\n }\n\n return null;\n }\n\n private readFile(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, 'utf-8').trim();\n } catch {\n return null;\n }\n }\n\n private verifyAndDecode(token: string): LicensePayload | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n\n const [headerB64, payloadB64, signatureB64] = parts;\n\n // Decode header to verify algorithm\n const header = JSON.parse(Buffer.from(headerB64, 'base64url').toString());\n if (header.alg !== 'EdDSA') return null;\n\n // Verify signature\n const data = `${headerB64}.${payloadB64}`;\n const signature = Buffer.from(signatureB64, 'base64url');\n\n const publicKey = crypto.createPublicKey(LicenseValidator.PUBLIC_KEY);\n\n // Validate that the loaded public key is actually Ed25519 (OID 1.3.101.112).\n // This prevents algorithm-confusion attacks if the embedded key were ever\n // swapped to a different type.\n if (publicKey.asymmetricKeyType !== 'ed25519') {\n return null;\n }\n\n // Ed25519 verification: algorithm must be null because EdDSA performs its\n // own internal hashing (SHA-512) — passing a digest algorithm here would\n // cause Node.js to throw. The key type is validated above.\n const isValid = crypto.verify(null, Buffer.from(data), publicKey, signature);\n if (!isValid) return null;\n\n // Decode payload\n const payload: LicensePayload = JSON.parse(Buffer.from(payloadB64, 'base64url').toString());\n\n // Validate required fields\n if (\n !payload.org ||\n !Array.isArray(payload.features) ||\n typeof payload.exp !== 'number' ||\n typeof payload.iat !== 'number' ||\n !payload.sub\n ) {\n return null;\n }\n\n // Check expiry (with grace period)\n const now = Date.now();\n const expiryMs = payload.exp * 1000;\n if (now >= expiryMs + LicenseValidator.GRACE_PERIOD) {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n }\n}\n"],"mappings":"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","names":["home"]}
|
package/dist/sdk/{workflow-check-provider-NTHC5ZBF.mjs → workflow-check-provider-EXMC6JIS.mjs}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
WorkflowCheckProvider,
|
|
3
3
|
init_workflow_check_provider
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TQQNSHQV.mjs";
|
|
5
5
|
import "./chunk-YSOIR46P.mjs";
|
|
6
6
|
import "./chunk-PDQTEBOJ.mjs";
|
|
7
7
|
import "./chunk-7XRSCOKE.mjs";
|
|
@@ -10,12 +10,12 @@ import "./chunk-B7BVQM5K.mjs";
|
|
|
10
10
|
import "./chunk-XXAEN5KU.mjs";
|
|
11
11
|
import "./chunk-RHKPFJLG.mjs";
|
|
12
12
|
import "./chunk-J27D43HS.mjs";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-ZOF5QT6U.mjs";
|
|
14
14
|
import "./chunk-KWTCTEFT.mjs";
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-ANUT54HW.mjs";
|
|
16
|
+
import "./chunk-DHETLQIX.mjs";
|
|
17
|
+
import "./chunk-7ERVRLDV.mjs";
|
|
18
|
+
import "./chunk-QXT47ZHR.mjs";
|
|
19
19
|
import "./chunk-34QX63WK.mjs";
|
|
20
20
|
import "./chunk-PQWZ6NFL.mjs";
|
|
21
21
|
import "./chunk-25IC7KXZ.mjs";
|
|
@@ -28,4 +28,4 @@ init_workflow_check_provider();
|
|
|
28
28
|
export {
|
|
29
29
|
WorkflowCheckProvider
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=workflow-check-provider-
|
|
31
|
+
//# sourceMappingURL=workflow-check-provider-EXMC6JIS.mjs.map
|
package/dist/sdk/{workflow-check-provider-SRIMWKLQ.mjs → workflow-check-provider-VKYGI5GK.mjs}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
WorkflowCheckProvider,
|
|
3
3
|
init_workflow_check_provider
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-6DPPP7LD.mjs";
|
|
5
5
|
import "./chunk-YSOIR46P.mjs";
|
|
6
6
|
import "./chunk-PDQTEBOJ.mjs";
|
|
7
7
|
import "./chunk-7XRSCOKE.mjs";
|
|
@@ -10,7 +10,7 @@ import "./chunk-B7BVQM5K.mjs";
|
|
|
10
10
|
import "./chunk-XXAEN5KU.mjs";
|
|
11
11
|
import "./chunk-RHKPFJLG.mjs";
|
|
12
12
|
import "./chunk-J27D43HS.mjs";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-4I3TJ7UJ.mjs";
|
|
14
14
|
import "./chunk-KWTCTEFT.mjs";
|
|
15
15
|
import "./chunk-KBGQJKIZ.mjs";
|
|
16
16
|
import "./chunk-U6K5SK7X.mjs";
|
|
@@ -28,4 +28,4 @@ init_workflow_check_provider();
|
|
|
28
28
|
export {
|
|
29
29
|
WorkflowCheckProvider
|
|
30
30
|
};
|
|
31
|
-
//# sourceMappingURL=workflow-check-provider-
|
|
31
|
+
//# sourceMappingURL=workflow-check-provider-VKYGI5GK.mjs.map
|
|
@@ -38,6 +38,7 @@ export declare class SlackSocketRunner implements Runner {
|
|
|
38
38
|
private heartbeatTimer?;
|
|
39
39
|
private lastPong;
|
|
40
40
|
private closing;
|
|
41
|
+
private draining;
|
|
41
42
|
private taskStore?;
|
|
42
43
|
private configPath?;
|
|
43
44
|
private staleTaskTimer?;
|
|
@@ -115,6 +116,17 @@ export declare class SlackSocketRunner implements Runner {
|
|
|
115
116
|
name: string;
|
|
116
117
|
description?: string;
|
|
117
118
|
}[]): unknown[];
|
|
119
|
+
/**
|
|
120
|
+
* Stop listening for new messages. Closes the WebSocket and stops the scheduler,
|
|
121
|
+
* but does NOT wait for in-flight work to complete. Frees the connection so
|
|
122
|
+
* a new process can connect to Slack immediately.
|
|
123
|
+
*/
|
|
124
|
+
stopListening(): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Enter drain mode: stop accepting new messages, wait for active threads to complete.
|
|
127
|
+
* @param timeoutMs - Max wait time. 0 = unlimited (default).
|
|
128
|
+
*/
|
|
129
|
+
drain(timeoutMs?: number): Promise<void>;
|
|
118
130
|
/**
|
|
119
131
|
* Stop the socket runner and clean up resources
|
|
120
132
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-runner.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/slack/socket-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAmB,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAOhF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAM3E,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEtF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC5B,OAAO,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;
|
|
1
|
+
{"version":3,"file":"socket-runner.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/slack/socket-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ export declare class TeamsWebhookRunner implements Runner {
|
|
|
24
24
|
private host;
|
|
25
25
|
private taskStore?;
|
|
26
26
|
private configPath?;
|
|
27
|
+
private activeRequests;
|
|
27
28
|
constructor(engine: StateMachineExecutionEngine, cfg: VisorConfig, opts: TeamsWebhookConfig);
|
|
28
29
|
/** Get the TeamsClient instance (for shared access) */
|
|
29
30
|
getClient(): TeamsClient;
|
|
@@ -32,8 +33,11 @@ export declare class TeamsWebhookRunner implements Runner {
|
|
|
32
33
|
/** Hot-swap config for future requests */
|
|
33
34
|
updateConfig(cfg: VisorConfig): void;
|
|
34
35
|
start(): Promise<void>;
|
|
36
|
+
stopListening(): Promise<void>;
|
|
37
|
+
drain(timeoutMs?: number): Promise<void>;
|
|
35
38
|
stop(): Promise<void>;
|
|
36
39
|
private handleMessage;
|
|
40
|
+
private handleMessageInner;
|
|
37
41
|
/** Ensure teams frontend is in the config for this run */
|
|
38
42
|
private prepareConfigForRun;
|
|
39
43
|
/** Deduplication: track processed activities by ID */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-runner.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/teams/webhook-runner.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIvC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,kBAAmB,YAAW,MAAM;IAC/C,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAC,CAAmD;IACrE,OAAO,CAAC,UAAU,CAAC,CAAS;
|
|
1
|
+
{"version":3,"file":"webhook-runner.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/teams/webhook-runner.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIvC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,kBAAmB,YAAW,MAAM;IAC/C,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAC,CAAmD;IACrE,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAK;gBAEf,MAAM,EAAE,2BAA2B,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB;IAmB3F,uDAAuD;IACvD,SAAS,IAAI,WAAW;IAIxB,mDAAmD;IACnD,YAAY,CAAC,KAAK,EAAE,OAAO,8BAA8B,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAKhG,0CAA0C;IAC1C,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAI9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkEtB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B,KAAK,CAAC,SAAS,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWb,aAAa;YASb,kBAAkB;IA4GhC,0DAA0D;IAC1D,OAAO,CAAC,mBAAmB;IAc3B,sDAAsD;IACtD,OAAO,CAAC,WAAW;CAWpB"}
|
|
@@ -30,6 +30,8 @@ export declare class TelegramPollingRunner implements Runner {
|
|
|
30
30
|
/** Hot-swap config for future requests */
|
|
31
31
|
updateConfig(cfg: VisorConfig): void;
|
|
32
32
|
start(): Promise<void>;
|
|
33
|
+
stopListening(): Promise<void>;
|
|
34
|
+
drain(timeoutMs?: number): Promise<void>;
|
|
33
35
|
stop(): Promise<void>;
|
|
34
36
|
private handleMessage;
|
|
35
37
|
/** Ensure telegram frontend is in the config for this run */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polling-runner.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/telegram/polling-runner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,qBAAsB,YAAW,MAAM;IAClD,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,SAAS,CAAC,CAAmD;IACrE,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,MAAM,EAAE,2BAA2B,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB;IAY9F,0DAA0D;IAC1D,SAAS,IAAI,cAAc;IAI3B,mDAAmD;IACnD,YAAY,CAAC,KAAK,EAAE,OAAO,8BAA8B,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAKhG,0CAA0C;IAC1C,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAI9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6DtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,aAAa;IA0H3B,6DAA6D;IAC7D,OAAO,CAAC,mBAAmB;IAc3B,mEAAmE;IACnE,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,WAAW;CAGpB"}
|
|
1
|
+
{"version":3,"file":"polling-runner.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/telegram/polling-runner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAM1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACpC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,qBAAsB,YAAW,MAAM;IAClD,QAAQ,CAAC,IAAI,cAAc;IAC3B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,SAAS,CAAC,CAAmD;IACrE,OAAO,CAAC,UAAU,CAAC,CAAS;gBAEhB,MAAM,EAAE,2BAA2B,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,qBAAqB;IAY9F,0DAA0D;IAC1D,SAAS,IAAI,cAAc;IAI3B,mDAAmD;IACnD,YAAY,CAAC,KAAK,EAAE,OAAO,8BAA8B,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAKhG,0CAA0C;IAC1C,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAI9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6DtB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,KAAK,CAAC,SAAS,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAenC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,aAAa;IA0H3B,6DAA6D;IAC7D,OAAO,CAAC,mBAAmB;IAc3B,mEAAmE;IACnE,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,WAAW;CAGpB"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -1454,6 +1454,20 @@ export interface SchedulerConfig {
|
|
|
1454
1454
|
/** Slack message triggers for reactive workflow execution */
|
|
1455
1455
|
on_message?: Record<string, SlackMessageTrigger>;
|
|
1456
1456
|
}
|
|
1457
|
+
/**
|
|
1458
|
+
* Graceful restart configuration
|
|
1459
|
+
*/
|
|
1460
|
+
export interface GracefulRestartConfig {
|
|
1461
|
+
/** Max time in ms to wait for in-flight work to complete. 0 = unlimited (default). */
|
|
1462
|
+
drain_timeout_ms?: number;
|
|
1463
|
+
/** Max time in ms to wait for the new child process to become ready. Default: 15000. */
|
|
1464
|
+
child_ready_timeout_ms?: number;
|
|
1465
|
+
/** Send "restarting" messages to active conversations. Default: true. */
|
|
1466
|
+
notify_users?: boolean;
|
|
1467
|
+
/** Override the command used to spawn the new process.
|
|
1468
|
+
* If not set, auto-detects: npx re-invokes npx, direct execution re-spawns same binary. */
|
|
1469
|
+
restart_command?: string;
|
|
1470
|
+
}
|
|
1457
1471
|
/**
|
|
1458
1472
|
* Main Visor configuration
|
|
1459
1473
|
*/
|
|
@@ -1545,6 +1559,25 @@ export interface VisorConfig {
|
|
|
1545
1559
|
* When true, all workflow executions (CLI, Slack, TUI, Scheduler) are recorded
|
|
1546
1560
|
* in a shared SQLite TaskStore visible via `visor tasks`. */
|
|
1547
1561
|
task_tracking?: boolean;
|
|
1562
|
+
/** Graceful restart configuration */
|
|
1563
|
+
graceful_restart?: GracefulRestartConfig;
|
|
1564
|
+
/** Automatically evaluate completed tasks using an LLM judge.
|
|
1565
|
+
* Requires task_tracking to be enabled. Runs asynchronously after task completion.
|
|
1566
|
+
* Set to `true` for defaults, or provide an object to configure. */
|
|
1567
|
+
task_evaluate?: boolean | TaskEvaluateConfig;
|
|
1568
|
+
}
|
|
1569
|
+
/**
|
|
1570
|
+
* Configuration for automatic task evaluation via LLM judge.
|
|
1571
|
+
*/
|
|
1572
|
+
export interface TaskEvaluateConfig {
|
|
1573
|
+
/** Enable auto-evaluation (default: true when config object is present) */
|
|
1574
|
+
enabled?: boolean;
|
|
1575
|
+
/** LLM model to use for evaluation (e.g. "gemini-2.5-flash", "claude-sonnet-4-5") */
|
|
1576
|
+
model?: string;
|
|
1577
|
+
/** AI provider: google, openai, anthropic */
|
|
1578
|
+
provider?: string;
|
|
1579
|
+
/** Custom system prompt for the evaluator (overrides the default evaluation prompt) */
|
|
1580
|
+
prompt?: string;
|
|
1548
1581
|
}
|
|
1549
1582
|
/**
|
|
1550
1583
|
* Workspace isolation configuration
|