@probelabs/visor 0.1.178-ee → 0.1.179-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/assistant.yaml +38 -16
- package/defaults/skills/code-explorer.yaml +8 -8
- package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
- package/dist/agent-protocol/track-execution.d.ts.map +1 -1
- package/dist/defaults/assistant.yaml +38 -16
- package/dist/defaults/skills/code-explorer.yaml +8 -8
- package/dist/frontends/slack-frontend.d.ts +6 -0
- package/dist/frontends/slack-frontend.d.ts.map +1 -1
- package/dist/index.js +305 -87
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/sdk/{a2a-frontend-U3PTNCLR.mjs → a2a-frontend-KJFLIZJT.mjs} +2 -2
- package/dist/sdk/{check-provider-registry-ZX76MY2L.mjs → check-provider-registry-J27YX4IT.mjs} +5 -5
- package/dist/sdk/{check-provider-registry-SRASECAR.mjs → check-provider-registry-SYAHJMWJ.mjs} +5 -5
- package/dist/sdk/{chunk-6YGCACBF.mjs → chunk-CHARL3TY.mjs} +2 -2
- package/dist/sdk/{chunk-6YGCACBF.mjs.map → chunk-CHARL3TY.mjs.map} +1 -1
- package/dist/sdk/{chunk-B7XHSG3L.mjs → chunk-FTPLYUQ3.mjs} +163 -124
- package/dist/sdk/chunk-FTPLYUQ3.mjs.map +1 -0
- package/dist/sdk/{chunk-MGY5JAN2.mjs → chunk-KWHLB5E3.mjs} +163 -124
- package/dist/sdk/chunk-KWHLB5E3.mjs.map +1 -0
- package/dist/sdk/{chunk-4ECMTCOM.mjs → chunk-OYHDBTKY.mjs} +2 -2
- package/dist/sdk/{chunk-ENSZDV3O.mjs → chunk-ZJYQMNPA.mjs} +3 -3
- package/dist/sdk/{failure-condition-evaluator-P3MS5DRL.mjs → failure-condition-evaluator-V2YGFRKO.mjs} +3 -3
- package/dist/sdk/{github-frontend-QTKOYB56.mjs → github-frontend-4LM4NAZK.mjs} +3 -3
- package/dist/sdk/{host-I2TBBKD5.mjs → host-GBXJKNHL.mjs} +4 -4
- package/dist/sdk/{host-THORKOEL.mjs → host-XXPPPC76.mjs} +4 -4
- package/dist/sdk/{routing-2X6QF5IW.mjs → routing-YAYBIVPL.mjs} +4 -4
- package/dist/sdk/{schedule-tool-M6Y4YTXR.mjs → schedule-tool-OIVJDIDK.mjs} +5 -5
- package/dist/sdk/{schedule-tool-R6JJIDZ6.mjs → schedule-tool-WACIV77L.mjs} +5 -5
- package/dist/sdk/{schedule-tool-handler-AOMZV3Q3.mjs → schedule-tool-handler-ODKY57FO.mjs} +5 -5
- package/dist/sdk/{schedule-tool-handler-JYCVH377.mjs → schedule-tool-handler-SJF4ZKSB.mjs} +5 -5
- package/dist/sdk/sdk.js +213 -137
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +4 -4
- package/dist/sdk/{slack-frontend-XKSIOUXB.mjs → slack-frontend-OWD7BSWF.mjs} +22 -3
- package/dist/sdk/slack-frontend-OWD7BSWF.mjs.map +1 -0
- package/dist/sdk/{trace-helpers-K47ZVJSU.mjs → trace-helpers-QL2B75AK.mjs} +2 -2
- package/dist/sdk/{track-execution-XTCZBUWX.mjs → track-execution-2Q66SXBZ.mjs} +20 -2
- package/dist/sdk/{track-execution-XTCZBUWX.mjs.map → track-execution-2Q66SXBZ.mjs.map} +1 -1
- package/dist/sdk/{workflow-check-provider-A3YH2UZJ.mjs → workflow-check-provider-IXW6BMQA.mjs} +5 -5
- package/dist/sdk/{workflow-check-provider-EMFC7A5K.mjs → workflow-check-provider-UZQZYPOE.mjs} +5 -5
- package/dist/utils/workspace-manager.d.ts +2 -0
- package/dist/utils/workspace-manager.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/sdk/chunk-B7XHSG3L.mjs.map +0 -1
- package/dist/sdk/chunk-MGY5JAN2.mjs.map +0 -1
- package/dist/sdk/slack-frontend-XKSIOUXB.mjs.map +0 -1
- /package/dist/sdk/{a2a-frontend-U3PTNCLR.mjs.map → a2a-frontend-KJFLIZJT.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-SRASECAR.mjs.map → check-provider-registry-J27YX4IT.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-ZX76MY2L.mjs.map → check-provider-registry-SYAHJMWJ.mjs.map} +0 -0
- /package/dist/sdk/{chunk-4ECMTCOM.mjs.map → chunk-OYHDBTKY.mjs.map} +0 -0
- /package/dist/sdk/{chunk-ENSZDV3O.mjs.map → chunk-ZJYQMNPA.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-P3MS5DRL.mjs.map → failure-condition-evaluator-V2YGFRKO.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-QTKOYB56.mjs.map → github-frontend-4LM4NAZK.mjs.map} +0 -0
- /package/dist/sdk/{host-I2TBBKD5.mjs.map → host-GBXJKNHL.mjs.map} +0 -0
- /package/dist/sdk/{host-THORKOEL.mjs.map → host-XXPPPC76.mjs.map} +0 -0
- /package/dist/sdk/{routing-2X6QF5IW.mjs.map → routing-YAYBIVPL.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-M6Y4YTXR.mjs.map → schedule-tool-OIVJDIDK.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-R6JJIDZ6.mjs.map → schedule-tool-WACIV77L.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-AOMZV3Q3.mjs.map → schedule-tool-handler-ODKY57FO.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-JYCVH377.mjs.map → schedule-tool-handler-SJF4ZKSB.mjs.map} +0 -0
- /package/dist/sdk/{trace-helpers-K47ZVJSU.mjs.map → trace-helpers-QL2B75AK.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-A3YH2UZJ.mjs.map → workflow-check-provider-IXW6BMQA.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-EMFC7A5K.mjs.map → workflow-check-provider-UZQZYPOE.mjs.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
process.env.VISOR_VERSION = '0.1.
|
|
3
|
-
process.env.PROBE_VERSION = '0.6.0-
|
|
4
|
-
process.env.VISOR_COMMIT_SHA = '
|
|
5
|
-
process.env.VISOR_COMMIT_SHORT = '
|
|
2
|
+
process.env.VISOR_VERSION = '0.1.179';
|
|
3
|
+
process.env.PROBE_VERSION = '0.6.0-rc294';
|
|
4
|
+
process.env.VISOR_COMMIT_SHA = 'c2ec610fc6c00b8e34666b8dad089ca3cf06bbf5';
|
|
5
|
+
process.env.VISOR_COMMIT_SHORT = 'c2ec610';
|
|
6
6
|
/******/ (() => { // webpackBootstrap
|
|
7
7
|
/******/ var __webpack_modules__ = ({
|
|
8
8
|
|
|
@@ -299882,6 +299882,19 @@ async function handleShow(positional, flags) {
|
|
|
299882
299882
|
if (match.run_id)
|
|
299883
299883
|
detailTable.push({ 'Run ID': match.run_id });
|
|
299884
299884
|
detailTable.push({ Input: match.request_message });
|
|
299885
|
+
// Show AI response from status_message (recorded on completion/failure)
|
|
299886
|
+
const fullTask = store.getTask(match.id);
|
|
299887
|
+
if (fullTask?.status?.message) {
|
|
299888
|
+
const parts = fullTask.status.message.parts ?? [];
|
|
299889
|
+
const textPart = parts.find((p) => typeof p.text === 'string');
|
|
299890
|
+
if (textPart) {
|
|
299891
|
+
const responseText = textPart.text;
|
|
299892
|
+
// Truncate long responses for display
|
|
299893
|
+
const maxLen = 500;
|
|
299894
|
+
const display = responseText.length > maxLen ? responseText.slice(0, maxLen) + '...' : responseText;
|
|
299895
|
+
detailTable.push({ Response: display });
|
|
299896
|
+
}
|
|
299897
|
+
}
|
|
299885
299898
|
// Show metadata
|
|
299886
299899
|
const meta = match.metadata;
|
|
299887
299900
|
const metaKeys = Object.keys(meta).filter(k => k !== 'source');
|
|
@@ -300057,10 +300070,35 @@ async function trackExecution(opts, executor) {
|
|
|
300057
300070
|
logger_1.logger.info(`[TaskTracking] Task ${task.id} started (source=${source}, workflow=${workflowId || '-'}, instance=${instanceId})`);
|
|
300058
300071
|
try {
|
|
300059
300072
|
const result = await executor();
|
|
300073
|
+
// Extract AI response text from the result using the same pattern as Slack frontend:
|
|
300074
|
+
// result.reviewSummary.history has check outputs, look for output.text in any check
|
|
300075
|
+
let responseText = 'Execution completed';
|
|
300076
|
+
try {
|
|
300077
|
+
const history = result?.reviewSummary?.history;
|
|
300078
|
+
if (history) {
|
|
300079
|
+
// Look through check outputs for a text response (e.g., generate-response)
|
|
300080
|
+
for (const outputs of Object.values(history)) {
|
|
300081
|
+
if (!Array.isArray(outputs))
|
|
300082
|
+
continue;
|
|
300083
|
+
for (const out of outputs) {
|
|
300084
|
+
const text = out?.text;
|
|
300085
|
+
if (typeof text === 'string' && text.trim().length > 0) {
|
|
300086
|
+
responseText = text.trim();
|
|
300087
|
+
break;
|
|
300088
|
+
}
|
|
300089
|
+
}
|
|
300090
|
+
if (responseText !== 'Execution completed')
|
|
300091
|
+
break;
|
|
300092
|
+
}
|
|
300093
|
+
}
|
|
300094
|
+
}
|
|
300095
|
+
catch {
|
|
300096
|
+
// ignore extraction errors
|
|
300097
|
+
}
|
|
300060
300098
|
const completedMsg = {
|
|
300061
300099
|
message_id: crypto_1.default.randomUUID(),
|
|
300062
300100
|
role: 'agent',
|
|
300063
|
-
parts: [{ text:
|
|
300101
|
+
parts: [{ text: responseText }],
|
|
300064
300102
|
};
|
|
300065
300103
|
taskStore.updateTaskState(task.id, 'completed', completedMsg);
|
|
300066
300104
|
logger_1.logger.info(`[TaskTracking] Task ${task.id} completed`);
|
|
@@ -314776,17 +314814,28 @@ class SlackFrontend {
|
|
|
314776
314814
|
const message = ev?.error?.message || 'Execution error';
|
|
314777
314815
|
await this.maybePostError(ctx, 'Check failed', message, ev?.checkId).catch(() => { });
|
|
314778
314816
|
}));
|
|
314779
|
-
// On terminal state, replace 👀 with 👍 if we acked an inbound Slack message
|
|
314817
|
+
// On terminal state, replace 👀 with 👍 if we acked an inbound Slack message.
|
|
314818
|
+
// For error states, always post an error notice (bypass errorNotified flag)
|
|
314819
|
+
// so the user is never left without feedback when a run fails.
|
|
314780
314820
|
this.subs.push(bus.on('StateTransition', async (env) => {
|
|
314781
314821
|
const ev = (env && env.payload) || env;
|
|
314782
|
-
if (ev &&
|
|
314822
|
+
if (ev && ev.to === 'Completed') {
|
|
314823
|
+
await this.finalizeReactions(ctx).catch(() => { });
|
|
314824
|
+
}
|
|
314825
|
+
else if (ev && ev.to === 'Error') {
|
|
314826
|
+
if (!this.errorNotified) {
|
|
314827
|
+
await this.maybePostError(ctx, 'Run failed', 'Workflow finished with errors').catch(() => { });
|
|
314828
|
+
}
|
|
314783
314829
|
await this.finalizeReactions(ctx).catch(() => { });
|
|
314784
314830
|
}
|
|
314785
314831
|
}));
|
|
314786
314832
|
this.subs.push(bus.on('Shutdown', async (env) => {
|
|
314787
314833
|
const ev = (env && env.payload) || env;
|
|
314788
314834
|
const message = ev?.error?.message || 'Fatal error';
|
|
314789
|
-
|
|
314835
|
+
// Always post shutdown errors — bypass errorNotified since a fatal
|
|
314836
|
+
// shutdown is critical and must reach the user even if a previous
|
|
314837
|
+
// (possibly unrelated) check already posted a non-fatal error.
|
|
314838
|
+
await this.forcePostError(ctx, 'Run failed', message).catch(() => { });
|
|
314790
314839
|
}));
|
|
314791
314840
|
// Add 👀 acknowledgement as soon as first check is scheduled for Slack-driven runs
|
|
314792
314841
|
this.subs.push(bus.on('CheckScheduled', async () => {
|
|
@@ -314915,6 +314964,16 @@ class SlackFrontend {
|
|
|
314915
314964
|
async maybePostError(ctx, title, message, checkId) {
|
|
314916
314965
|
if (this.errorNotified)
|
|
314917
314966
|
return;
|
|
314967
|
+
return this.postErrorToSlack(ctx, title, message, checkId);
|
|
314968
|
+
}
|
|
314969
|
+
/**
|
|
314970
|
+
* Post error to Slack regardless of errorNotified flag.
|
|
314971
|
+
* Used for fatal/shutdown errors that must always reach the user.
|
|
314972
|
+
*/
|
|
314973
|
+
async forcePostError(ctx, title, message, checkId) {
|
|
314974
|
+
return this.postErrorToSlack(ctx, title, message, checkId);
|
|
314975
|
+
}
|
|
314976
|
+
async postErrorToSlack(ctx, title, message, checkId) {
|
|
314918
314977
|
const slack = this.getSlack(ctx);
|
|
314919
314978
|
if (!slack)
|
|
314920
314979
|
return;
|
|
@@ -327374,46 +327433,51 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
|
|
|
327374
327433
|
// Check-level AI configuration (ai object)
|
|
327375
327434
|
if (config.ai) {
|
|
327376
327435
|
const aiAny = config.ai;
|
|
327436
|
+
// Helper to resolve Liquid templates in ai config values (e.g., "{{ inputs.max_iterations }}")
|
|
327437
|
+
const resolveLiquid = async (val) => {
|
|
327438
|
+
if (typeof val !== 'string' || !val.includes('{{'))
|
|
327439
|
+
return undefined;
|
|
327440
|
+
try {
|
|
327441
|
+
return (await this.liquidEngine.parseAndRender(val, {
|
|
327442
|
+
inputs: config.workflowInputs || {},
|
|
327443
|
+
env: process.env,
|
|
327444
|
+
})).trim();
|
|
327445
|
+
}
|
|
327446
|
+
catch {
|
|
327447
|
+
return undefined;
|
|
327448
|
+
}
|
|
327449
|
+
};
|
|
327450
|
+
// Helper to resolve a boolean that may be a Liquid template string
|
|
327451
|
+
const resolveBool = async (val) => {
|
|
327452
|
+
const resolved = (await resolveLiquid(val)) ?? val;
|
|
327453
|
+
if (typeof resolved === 'boolean')
|
|
327454
|
+
return resolved;
|
|
327455
|
+
if (typeof resolved === 'string')
|
|
327456
|
+
return resolved === 'true';
|
|
327457
|
+
return !!resolved;
|
|
327458
|
+
};
|
|
327377
327459
|
const skipTransport = aiAny.skip_transport_context === true;
|
|
327378
327460
|
// Only set properties that are actually defined to avoid overriding env vars
|
|
327379
327461
|
if (aiAny.apiKey !== undefined) {
|
|
327380
327462
|
aiConfig.apiKey = aiAny.apiKey;
|
|
327381
327463
|
}
|
|
327382
327464
|
if (aiAny.model !== undefined) {
|
|
327383
|
-
|
|
327384
|
-
if (modelVal.includes('{{')) {
|
|
327385
|
-
try {
|
|
327386
|
-
const rendered = await this.liquidEngine.parseAndRender(modelVal, {
|
|
327387
|
-
inputs: config.workflowInputs || {},
|
|
327388
|
-
env: process.env,
|
|
327389
|
-
});
|
|
327390
|
-
modelVal = rendered.trim();
|
|
327391
|
-
}
|
|
327392
|
-
catch { }
|
|
327393
|
-
}
|
|
327465
|
+
const modelVal = (await resolveLiquid(aiAny.model)) ?? String(aiAny.model);
|
|
327394
327466
|
if (modelVal) {
|
|
327395
327467
|
aiConfig.model = modelVal;
|
|
327396
327468
|
}
|
|
327397
327469
|
}
|
|
327398
327470
|
if (aiAny.timeout !== undefined) {
|
|
327399
|
-
|
|
327471
|
+
const resolvedTimeout = (await resolveLiquid(aiAny.timeout)) ?? aiAny.timeout;
|
|
327472
|
+
aiConfig.timeout = Number(resolvedTimeout);
|
|
327400
327473
|
}
|
|
327401
327474
|
if (aiAny.max_iterations !== undefined || aiAny.maxIterations !== undefined) {
|
|
327402
327475
|
const raw = aiAny.max_iterations ?? aiAny.maxIterations;
|
|
327403
|
-
|
|
327476
|
+
const resolved = (await resolveLiquid(raw)) ?? raw;
|
|
327477
|
+
aiConfig.maxIterations = Number(resolved);
|
|
327404
327478
|
}
|
|
327405
327479
|
if (aiAny.provider !== undefined) {
|
|
327406
|
-
|
|
327407
|
-
if (providerVal.includes('{{')) {
|
|
327408
|
-
try {
|
|
327409
|
-
const rendered = await this.liquidEngine.parseAndRender(providerVal, {
|
|
327410
|
-
inputs: config.workflowInputs || {},
|
|
327411
|
-
env: process.env,
|
|
327412
|
-
});
|
|
327413
|
-
providerVal = rendered.trim();
|
|
327414
|
-
}
|
|
327415
|
-
catch { }
|
|
327416
|
-
}
|
|
327480
|
+
const providerVal = (await resolveLiquid(aiAny.provider)) ?? String(aiAny.provider);
|
|
327417
327481
|
if (providerVal) {
|
|
327418
327482
|
aiConfig.provider = providerVal;
|
|
327419
327483
|
}
|
|
@@ -327422,36 +327486,40 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
|
|
|
327422
327486
|
aiConfig.debug = aiAny.debug;
|
|
327423
327487
|
}
|
|
327424
327488
|
if (aiAny.enableDelegate !== undefined) {
|
|
327425
|
-
aiConfig.enableDelegate = aiAny.enableDelegate;
|
|
327489
|
+
aiConfig.enableDelegate = await resolveBool(aiAny.enableDelegate);
|
|
327426
327490
|
}
|
|
327427
327491
|
if (aiAny.enableTasks !== undefined) {
|
|
327428
|
-
aiConfig.enableTasks = aiAny.enableTasks;
|
|
327492
|
+
aiConfig.enableTasks = await resolveBool(aiAny.enableTasks);
|
|
327429
327493
|
}
|
|
327430
327494
|
if (aiAny.enableExecutePlan !== undefined) {
|
|
327431
|
-
aiConfig.enableExecutePlan = aiAny.enableExecutePlan;
|
|
327495
|
+
aiConfig.enableExecutePlan = await resolveBool(aiAny.enableExecutePlan);
|
|
327432
327496
|
}
|
|
327433
327497
|
if (aiAny.allowEdit !== undefined) {
|
|
327434
|
-
aiConfig.allowEdit = aiAny.allowEdit;
|
|
327498
|
+
aiConfig.allowEdit = await resolveBool(aiAny.allowEdit);
|
|
327435
327499
|
}
|
|
327436
327500
|
if (aiAny.allowedTools !== undefined) {
|
|
327437
327501
|
aiConfig.allowedTools = aiAny.allowedTools;
|
|
327438
327502
|
this.logDebug(`[AI Provider] Read allowedTools from YAML: ${JSON.stringify(aiAny.allowedTools)}`);
|
|
327439
327503
|
}
|
|
327440
327504
|
if (aiAny.disableTools !== undefined) {
|
|
327441
|
-
aiConfig.disableTools = aiAny.disableTools;
|
|
327505
|
+
aiConfig.disableTools = await resolveBool(aiAny.disableTools);
|
|
327442
327506
|
this.logDebug(`[AI Provider] Read disableTools from YAML: ${aiAny.disableTools}`);
|
|
327443
327507
|
}
|
|
327444
327508
|
if (aiAny.allowBash !== undefined) {
|
|
327445
|
-
aiConfig.allowBash = aiAny.allowBash;
|
|
327509
|
+
aiConfig.allowBash = await resolveBool(aiAny.allowBash);
|
|
327446
327510
|
}
|
|
327447
327511
|
if (aiAny.bashConfig !== undefined) {
|
|
327448
327512
|
aiConfig.bashConfig = aiAny.bashConfig;
|
|
327449
327513
|
}
|
|
327450
327514
|
if (aiAny.search_delegate_provider !== undefined) {
|
|
327451
|
-
aiConfig.search_delegate_provider =
|
|
327515
|
+
aiConfig.search_delegate_provider =
|
|
327516
|
+
(await resolveLiquid(aiAny.search_delegate_provider)) ??
|
|
327517
|
+
aiAny.search_delegate_provider;
|
|
327452
327518
|
}
|
|
327453
327519
|
if (aiAny.search_delegate_model !== undefined) {
|
|
327454
|
-
aiConfig.search_delegate_model =
|
|
327520
|
+
aiConfig.search_delegate_model =
|
|
327521
|
+
(await resolveLiquid(aiAny.search_delegate_model)) ??
|
|
327522
|
+
aiAny.search_delegate_model;
|
|
327455
327523
|
}
|
|
327456
327524
|
if (aiAny.completion_prompt !== undefined) {
|
|
327457
327525
|
aiConfig.completionPrompt = aiAny.completion_prompt;
|
|
@@ -327591,6 +327659,11 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
|
|
|
327591
327659
|
if (config.ai_max_iterations !== undefined && aiConfig.maxIterations === undefined) {
|
|
327592
327660
|
aiConfig.maxIterations = config.ai_max_iterations;
|
|
327593
327661
|
}
|
|
327662
|
+
// Default to 100 iterations if not configured (ProbeAgent's own default is 30)
|
|
327663
|
+
// Guard against NaN from template rendering (e.g., Number("{{ ... }}") = NaN)
|
|
327664
|
+
if (aiConfig.maxIterations === undefined || Number.isNaN(aiConfig.maxIterations)) {
|
|
327665
|
+
aiConfig.maxIterations = 100;
|
|
327666
|
+
}
|
|
327594
327667
|
// Pass shared concurrency limiter for global AI call gating
|
|
327595
327668
|
const sharedLimiter = sessionInfo?._parentContext?.sharedConcurrencyLimiter;
|
|
327596
327669
|
if (sharedLimiter) {
|
|
@@ -374473,9 +374546,39 @@ class WorkspaceManager {
|
|
|
374473
374546
|
const mainProjectName = sanitizePathComponent(configuredMainProjectName || this.extractProjectName(this.originalPath));
|
|
374474
374547
|
this.usedNames.add(mainProjectName);
|
|
374475
374548
|
// Create worktree for main project
|
|
374476
|
-
|
|
374549
|
+
let mainProjectPath = path.join(this.workspacePath, mainProjectName);
|
|
374477
374550
|
// Check if original path is a git repository
|
|
374478
374551
|
const isGitRepo = await this.isGitRepository(this.originalPath);
|
|
374552
|
+
// Prune stale worktree references (from previous runs that were cleaned up).
|
|
374553
|
+
// Without this, the worktree list grows unboundedly and can slow git operations.
|
|
374554
|
+
if (isGitRepo) {
|
|
374555
|
+
try {
|
|
374556
|
+
await command_executor_1.commandExecutor.execute(`git -C ${shellEscape(this.originalPath)} worktree prune`, {
|
|
374557
|
+
timeout: 15000,
|
|
374558
|
+
});
|
|
374559
|
+
}
|
|
374560
|
+
catch {
|
|
374561
|
+
// Best-effort — don't fail workspace init if prune fails
|
|
374562
|
+
}
|
|
374563
|
+
}
|
|
374564
|
+
// Detect if originalPath is a subdirectory of a git repo.
|
|
374565
|
+
// `git worktree add` always checks out the full repo, so if the user runs
|
|
374566
|
+
// visor from a subdirectory (e.g. /repo/subdir), the worktree will contain
|
|
374567
|
+
// the entire repo and we need to adjust mainProjectPath to point to the
|
|
374568
|
+
// corresponding subdirectory inside the worktree.
|
|
374569
|
+
let subdirOffset = '';
|
|
374570
|
+
if (isGitRepo) {
|
|
374571
|
+
const gitRootResult = await command_executor_1.commandExecutor.execute(`git -C ${shellEscape(this.originalPath)} rev-parse --show-toplevel`, { timeout: 5000 });
|
|
374572
|
+
if (gitRootResult.exitCode === 0) {
|
|
374573
|
+
const gitRoot = gitRootResult.stdout.trim();
|
|
374574
|
+
const normalizedOriginal = path.resolve(this.originalPath);
|
|
374575
|
+
const normalizedRoot = path.resolve(gitRoot);
|
|
374576
|
+
if (normalizedOriginal !== normalizedRoot) {
|
|
374577
|
+
subdirOffset = path.relative(normalizedRoot, normalizedOriginal);
|
|
374578
|
+
logger_1.logger.info(`[Workspace] Original path is a subdirectory of git repo: ${subdirOffset}`);
|
|
374579
|
+
}
|
|
374580
|
+
}
|
|
374581
|
+
}
|
|
374479
374582
|
if (isGitRepo) {
|
|
374480
374583
|
// Check if main project worktree already exists (reused workspace, e.g. Slack thread)
|
|
374481
374584
|
const exists = await this.pathExists(mainProjectPath);
|
|
@@ -374513,6 +374616,23 @@ class WorkspaceManager {
|
|
|
374513
374616
|
}
|
|
374514
374617
|
}
|
|
374515
374618
|
}
|
|
374619
|
+
// Remember the worktree root before any subdirectory adjustment.
|
|
374620
|
+
// Cleanup needs the actual worktree path (not the subdirectory inside it).
|
|
374621
|
+
const worktreeRootPath = mainProjectPath;
|
|
374622
|
+
// If the original path was a subdirectory, adjust mainProjectPath to
|
|
374623
|
+
// point to the corresponding subdirectory inside the worktree.
|
|
374624
|
+
// e.g. worktree at /tmp/ws/Oel contains full repo; if originalPath was
|
|
374625
|
+
// /repo/Oel, then mainProjectPath becomes /tmp/ws/Oel/Oel
|
|
374626
|
+
if (subdirOffset) {
|
|
374627
|
+
mainProjectPath = path.join(mainProjectPath, subdirOffset);
|
|
374628
|
+
logger_1.logger.info(`[Workspace] Adjusted main project path to subdirectory: ${mainProjectPath}`);
|
|
374629
|
+
// Ensure the subdirectory exists in the worktree
|
|
374630
|
+
const subdirExists = await this.pathExists(mainProjectPath);
|
|
374631
|
+
if (!subdirExists) {
|
|
374632
|
+
logger_1.logger.warn(`[Workspace] Subdirectory '${subdirOffset}' not found in worktree — falling back to worktree root`);
|
|
374633
|
+
mainProjectPath = path.join(this.workspacePath, mainProjectName);
|
|
374634
|
+
}
|
|
374635
|
+
}
|
|
374516
374636
|
// Scan existing entries in the workspace directory to populate usedNames.
|
|
374517
374637
|
// This handles reused workspaces (e.g. Slack threads) where a previous run
|
|
374518
374638
|
// left symlinks on disk but the in-memory state was cleared by cleanup().
|
|
@@ -374535,6 +374655,7 @@ class WorkspaceManager {
|
|
|
374535
374655
|
mainProjectPath,
|
|
374536
374656
|
mainProjectName,
|
|
374537
374657
|
originalPath: this.originalPath,
|
|
374658
|
+
worktreeRootPath,
|
|
374538
374659
|
};
|
|
374539
374660
|
this.initialized = true;
|
|
374540
374661
|
logger_1.logger.info(`Workspace initialized: ${this.workspacePath}`);
|
|
@@ -374643,14 +374764,16 @@ class WorkspaceManager {
|
|
|
374643
374764
|
]);
|
|
374644
374765
|
}
|
|
374645
374766
|
try {
|
|
374646
|
-
// Remove main project worktree if it exists
|
|
374767
|
+
// Remove main project worktree if it exists.
|
|
374768
|
+
// Use worktreeRootPath (the actual git worktree) rather than mainProjectPath
|
|
374769
|
+
// which may include a subdirectory offset (e.g. Oel/Oel instead of Oel).
|
|
374647
374770
|
if (this.mainProjectInfo) {
|
|
374648
|
-
const
|
|
374771
|
+
const worktreePath = this.mainProjectInfo.worktreeRootPath || this.mainProjectInfo.mainProjectPath;
|
|
374649
374772
|
// Check if path exists and if it's a worktree (not a symlink)
|
|
374650
374773
|
try {
|
|
374651
|
-
const stats = await fsp.lstat(
|
|
374774
|
+
const stats = await fsp.lstat(worktreePath);
|
|
374652
374775
|
if (!stats.isSymbolicLink()) {
|
|
374653
|
-
await this.removeMainProjectWorktree(
|
|
374776
|
+
await this.removeMainProjectWorktree(worktreePath);
|
|
374654
374777
|
}
|
|
374655
374778
|
}
|
|
374656
374779
|
catch {
|
|
@@ -547710,9 +547833,13 @@ var init_ProbeAgent = __esm({
|
|
|
547710
547833
|
}
|
|
547711
547834
|
return await this.fallbackManager.executeWithFallback(
|
|
547712
547835
|
async (provider, model, config2) => {
|
|
547836
|
+
let fallbackModel = provider(model);
|
|
547837
|
+
if (this.concurrencyLimiter) {
|
|
547838
|
+
fallbackModel = _ProbeAgent._wrapModelWithLimiter(fallbackModel, this.concurrencyLimiter, this.debug);
|
|
547839
|
+
}
|
|
547713
547840
|
const fallbackOptions = {
|
|
547714
547841
|
...options,
|
|
547715
|
-
model:
|
|
547842
|
+
model: fallbackModel,
|
|
547716
547843
|
abortSignal: controller.signal
|
|
547717
547844
|
};
|
|
547718
547845
|
if (config2.provider !== "google" && fallbackOptions.tools) {
|
|
@@ -547740,6 +547867,132 @@ var init_ProbeAgent = __esm({
|
|
|
547740
547867
|
}
|
|
547741
547868
|
);
|
|
547742
547869
|
}
|
|
547870
|
+
/**
|
|
547871
|
+
* Wrap a LanguageModelV1 model so each doStream/doGenerate call acquires and
|
|
547872
|
+
* releases a concurrency limiter slot. This gates individual LLM API calls
|
|
547873
|
+
* (seconds each) instead of entire multi-step agent sessions (minutes).
|
|
547874
|
+
*
|
|
547875
|
+
* @param {Object} model - LanguageModelV1 model instance
|
|
547876
|
+
* @param {Object} limiter - Concurrency limiter with acquire/release/getStats
|
|
547877
|
+
* @param {boolean} debug - Enable debug logging
|
|
547878
|
+
* @returns {Object} Wrapped model with per-call concurrency gating
|
|
547879
|
+
* @private
|
|
547880
|
+
*/
|
|
547881
|
+
static _wrapModelWithLimiter(model, limiter, debug) {
|
|
547882
|
+
return new Proxy(model, {
|
|
547883
|
+
get(target, prop) {
|
|
547884
|
+
if (prop === "doStream") {
|
|
547885
|
+
return async function(...args) {
|
|
547886
|
+
await limiter.acquire(null);
|
|
547887
|
+
if (debug) {
|
|
547888
|
+
const stats = limiter.getStats();
|
|
547889
|
+
console.log(`[DEBUG] Acquired AI slot for LLM call (${stats.globalActive}/${stats.maxConcurrent}, queue: ${stats.queueSize})`);
|
|
547890
|
+
}
|
|
547891
|
+
try {
|
|
547892
|
+
const result = await target.doStream(...args);
|
|
547893
|
+
const originalStream = result.stream;
|
|
547894
|
+
const originalReader = originalStream.getReader();
|
|
547895
|
+
let released = false;
|
|
547896
|
+
const releaseOnce = () => {
|
|
547897
|
+
if (released) return;
|
|
547898
|
+
released = true;
|
|
547899
|
+
limiter.release(null);
|
|
547900
|
+
};
|
|
547901
|
+
const wrappedStream = new ReadableStream({
|
|
547902
|
+
async pull(controller) {
|
|
547903
|
+
try {
|
|
547904
|
+
const { done, value: value2 } = await originalReader.read();
|
|
547905
|
+
if (done) {
|
|
547906
|
+
controller.close();
|
|
547907
|
+
releaseOnce();
|
|
547908
|
+
if (debug) {
|
|
547909
|
+
const stats = limiter.getStats();
|
|
547910
|
+
console.log(`[DEBUG] Released AI slot after LLM stream complete (${stats.globalActive}/${stats.maxConcurrent})`);
|
|
547911
|
+
}
|
|
547912
|
+
} else {
|
|
547913
|
+
controller.enqueue(value2);
|
|
547914
|
+
}
|
|
547915
|
+
} catch (err) {
|
|
547916
|
+
releaseOnce();
|
|
547917
|
+
if (debug) {
|
|
547918
|
+
console.log(`[DEBUG] Released AI slot on LLM stream error`);
|
|
547919
|
+
}
|
|
547920
|
+
controller.error(err);
|
|
547921
|
+
}
|
|
547922
|
+
},
|
|
547923
|
+
cancel() {
|
|
547924
|
+
releaseOnce();
|
|
547925
|
+
if (debug) {
|
|
547926
|
+
console.log(`[DEBUG] Released AI slot on LLM stream cancel`);
|
|
547927
|
+
}
|
|
547928
|
+
originalReader.cancel();
|
|
547929
|
+
}
|
|
547930
|
+
});
|
|
547931
|
+
return { ...result, stream: wrappedStream };
|
|
547932
|
+
} catch (err) {
|
|
547933
|
+
limiter.release(null);
|
|
547934
|
+
if (debug) {
|
|
547935
|
+
console.log(`[DEBUG] Released AI slot on doStream error`);
|
|
547936
|
+
}
|
|
547937
|
+
throw err;
|
|
547938
|
+
}
|
|
547939
|
+
};
|
|
547940
|
+
}
|
|
547941
|
+
if (prop === "doGenerate") {
|
|
547942
|
+
return async function(...args) {
|
|
547943
|
+
await limiter.acquire(null);
|
|
547944
|
+
if (debug) {
|
|
547945
|
+
const stats = limiter.getStats();
|
|
547946
|
+
console.log(`[DEBUG] Acquired AI slot for LLM generate (${stats.globalActive}/${stats.maxConcurrent})`);
|
|
547947
|
+
}
|
|
547948
|
+
try {
|
|
547949
|
+
const result = await target.doGenerate(...args);
|
|
547950
|
+
return result;
|
|
547951
|
+
} finally {
|
|
547952
|
+
limiter.release(null);
|
|
547953
|
+
if (debug) {
|
|
547954
|
+
const stats = limiter.getStats();
|
|
547955
|
+
console.log(`[DEBUG] Released AI slot after LLM generate (${stats.globalActive}/${stats.maxConcurrent})`);
|
|
547956
|
+
}
|
|
547957
|
+
}
|
|
547958
|
+
};
|
|
547959
|
+
}
|
|
547960
|
+
const value = target[prop];
|
|
547961
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
547962
|
+
}
|
|
547963
|
+
});
|
|
547964
|
+
}
|
|
547965
|
+
/**
|
|
547966
|
+
* Wrap an engine stream result so its textStream async generator acquires
|
|
547967
|
+
* and releases a concurrency limiter slot. Acquire happens when iteration
|
|
547968
|
+
* begins; release happens in finally (completion, error, or break).
|
|
547969
|
+
*
|
|
547970
|
+
* @param {Object} result - Engine result with { textStream, usage, ... }
|
|
547971
|
+
* @param {Object} limiter - Concurrency limiter with acquire/release/getStats
|
|
547972
|
+
* @param {boolean} debug - Enable debug logging
|
|
547973
|
+
* @returns {Object} Result with wrapped textStream
|
|
547974
|
+
* @private
|
|
547975
|
+
*/
|
|
547976
|
+
static _wrapEngineStreamWithLimiter(result, limiter, debug) {
|
|
547977
|
+
const originalStream = result.textStream;
|
|
547978
|
+
async function* gatedStream() {
|
|
547979
|
+
await limiter.acquire(null);
|
|
547980
|
+
if (debug) {
|
|
547981
|
+
const stats = limiter.getStats();
|
|
547982
|
+
console.log(`[DEBUG] Acquired AI slot for engine stream (${stats.globalActive}/${stats.maxConcurrent}, queue: ${stats.queueSize})`);
|
|
547983
|
+
}
|
|
547984
|
+
try {
|
|
547985
|
+
yield* originalStream;
|
|
547986
|
+
} finally {
|
|
547987
|
+
limiter.release(null);
|
|
547988
|
+
if (debug) {
|
|
547989
|
+
const stats = limiter.getStats();
|
|
547990
|
+
console.log(`[DEBUG] Released AI slot after engine stream (${stats.globalActive}/${stats.maxConcurrent})`);
|
|
547991
|
+
}
|
|
547992
|
+
}
|
|
547993
|
+
}
|
|
547994
|
+
return { ...result, textStream: gatedStream() };
|
|
547995
|
+
}
|
|
547743
547996
|
/**
|
|
547744
547997
|
* Execute streamText with retry and fallback support
|
|
547745
547998
|
* @param {Object} options - streamText options
|
|
@@ -547748,12 +548001,8 @@ var init_ProbeAgent = __esm({
|
|
|
547748
548001
|
*/
|
|
547749
548002
|
async streamTextWithRetryAndFallback(options) {
|
|
547750
548003
|
const limiter = this.concurrencyLimiter;
|
|
547751
|
-
if (limiter) {
|
|
547752
|
-
|
|
547753
|
-
if (this.debug) {
|
|
547754
|
-
const stats = limiter.getStats();
|
|
547755
|
-
console.log(`[DEBUG] Acquired global AI concurrency slot (${stats.globalActive}/${stats.maxConcurrent}, queue: ${stats.queueSize})`);
|
|
547756
|
-
}
|
|
548004
|
+
if (limiter && options.model) {
|
|
548005
|
+
options = { ...options, model: _ProbeAgent._wrapModelWithLimiter(options.model, limiter, this.debug) };
|
|
547757
548006
|
}
|
|
547758
548007
|
const controller = new AbortController();
|
|
547759
548008
|
const timeoutState = { timeoutId: null };
|
|
@@ -547781,6 +548030,9 @@ var init_ProbeAgent = __esm({
|
|
|
547781
548030
|
if (useClaudeCode || useCodex) {
|
|
547782
548031
|
try {
|
|
547783
548032
|
result = await this._tryEngineStreamPath(options, controller, timeoutState);
|
|
548033
|
+
if (result && limiter) {
|
|
548034
|
+
result = _ProbeAgent._wrapEngineStreamWithLimiter(result, limiter, this.debug);
|
|
548035
|
+
}
|
|
547784
548036
|
} catch (error40) {
|
|
547785
548037
|
if (this.debug) {
|
|
547786
548038
|
const engineType = useClaudeCode ? "Claude Code" : "Codex";
|
|
@@ -547791,41 +548043,7 @@ var init_ProbeAgent = __esm({
|
|
|
547791
548043
|
if (!result) {
|
|
547792
548044
|
result = await this._executeWithVercelProvider(options, controller);
|
|
547793
548045
|
}
|
|
547794
|
-
if (limiter && result.textStream) {
|
|
547795
|
-
const originalStream = result.textStream;
|
|
547796
|
-
const debug = this.debug;
|
|
547797
|
-
const wrappedStream = (async function* () {
|
|
547798
|
-
try {
|
|
547799
|
-
for await (const chunk of originalStream) {
|
|
547800
|
-
yield chunk;
|
|
547801
|
-
}
|
|
547802
|
-
} finally {
|
|
547803
|
-
limiter.release(null);
|
|
547804
|
-
if (debug) {
|
|
547805
|
-
const stats = limiter.getStats();
|
|
547806
|
-
console.log(`[DEBUG] Released global AI concurrency slot (${stats.globalActive}/${stats.maxConcurrent}, queue: ${stats.queueSize})`);
|
|
547807
|
-
}
|
|
547808
|
-
}
|
|
547809
|
-
})();
|
|
547810
|
-
return new Proxy(result, {
|
|
547811
|
-
get(target, prop) {
|
|
547812
|
-
if (prop === "textStream") return wrappedStream;
|
|
547813
|
-
const value = target[prop];
|
|
547814
|
-
return typeof value === "function" ? value.bind(target) : value;
|
|
547815
|
-
}
|
|
547816
|
-
});
|
|
547817
|
-
} else if (limiter) {
|
|
547818
|
-
limiter.release(null);
|
|
547819
|
-
}
|
|
547820
548046
|
return result;
|
|
547821
|
-
} catch (error40) {
|
|
547822
|
-
if (limiter) {
|
|
547823
|
-
limiter.release(null);
|
|
547824
|
-
if (this.debug) {
|
|
547825
|
-
console.log(`[DEBUG] Released global AI concurrency slot on error`);
|
|
547826
|
-
}
|
|
547827
|
-
}
|
|
547828
|
-
throw error40;
|
|
547829
548047
|
} finally {
|
|
547830
548048
|
if (timeoutState.timeoutId) {
|
|
547831
548049
|
clearTimeout(timeoutState.timeoutId);
|
|
@@ -610994,7 +611212,7 @@ module.exports = /*#__PURE__*/JSON.parse('["aaa","aarp","abb","abbott","abbvie",
|
|
|
610994
611212
|
/***/ ((module) => {
|
|
610995
611213
|
|
|
610996
611214
|
"use strict";
|
|
610997
|
-
module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.42","main":"dist/index.js","bin":{"visor":"./dist/index.js"},"exports":{".":{"require":"./dist/index.js","import":"./dist/index.js"},"./sdk":{"types":"./dist/sdk/sdk.d.ts","import":"./dist/sdk/sdk.mjs","require":"./dist/sdk/sdk.js"},"./cli":{"require":"./dist/index.js"}},"files":["dist/","defaults/","action.yml","README.md","LICENSE"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build:cli":"ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo \'#!/usr/bin/env node\' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js","build:sdk":"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk","build":"./scripts/build-oss.sh","build:ee":"npm run build:cli && npm run build:sdk","test":"jest && npm run test:yaml","test:unit":"jest","prepublishOnly":"npm run build","test:watch":"jest --watch","test:coverage":"jest --coverage","test:ee":"jest --testPathPatterns=\'tests/ee\' --testPathIgnorePatterns=\'/node_modules/\' --no-coverage","test:manual:bash":"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts","lint":"eslint src tests --ext .ts","lint:fix":"eslint src tests --ext .ts --fix","format":"prettier --write src tests","format:check":"prettier --check src tests","clean":"","clean:traces":"node scripts/clean-traces.js","prebuild":"npm run clean && node scripts/generate-config-schema.js","pretest":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","pretest:unit":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","test:with-build":"npm run build:cli && jest","test:yaml":"node dist/index.js test --progress compact","test:yaml:parallel":"node dist/index.js test --progress compact --max-parallel 4","prepare":"husky","pre-commit":"lint-staged","deploy:site":"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true","deploy:worker":"npx wrangler deploy","deploy":"npm run deploy:site && npm run deploy:worker","publish:ee":"./scripts/publish-ee.sh","release":"./scripts/release.sh","release:patch":"./scripts/release.sh patch","release:minor":"./scripts/release.sh minor","release:major":"./scripts/release.sh major","release:prerelease":"./scripts/release.sh prerelease","docs:validate":"node scripts/validate-readme-links.js","workshop:setup":"npm install -D reveal-md@6.1.2","workshop:serve":"cd workshop && reveal-md slides.md -w","workshop:export":"reveal-md workshop/slides.md --static workshop/build","workshop:pdf":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter","workshop:pdf:ci":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter --puppeteer-launch-args=\\"--no-sandbox --disable-dev-shm-usage\\"","workshop:pdf:a4":"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4","workshop:build":"npm run workshop:export && npm run workshop:pdf","simulate:issue":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug","simulate:comment":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug"},"keywords":["code-review","ai","github-action","cli","pr-review","visor"],"author":"Probe Labs","license":"MIT","description":"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines","repository":{"type":"git","url":"git+https://github.com/probelabs/visor.git"},"bugs":{"url":"https://github.com/probelabs/visor/issues"},"homepage":"https://github.com/probelabs/visor#readme","dependencies":{"@actions/core":"^1.11.1","@apidevtools/swagger-parser":"^12.1.0","@grammyjs/runner":"^2.0.3","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.203.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-logs-otlp-http":"^0.203.0","@opentelemetry/exporter-metrics-otlp-http":"^0.203.0","@opentelemetry/exporter-trace-otlp-grpc":"^0.203.0","@opentelemetry/exporter-trace-otlp-http":"^0.203.0","@opentelemetry/instrumentation":"^0.203.0","@opentelemetry/resources":"^1.30.1","@opentelemetry/sdk-logs":"^0.203.0","@opentelemetry/sdk-metrics":"^1.30.1","@opentelemetry/sdk-node":"^0.203.0","@opentelemetry/sdk-trace-base":"^1.30.1","@opentelemetry/semantic-conventions":"^1.30.1","@probelabs/probe":"^0.6.0-
|
|
611215
|
+
module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.42","main":"dist/index.js","bin":{"visor":"./dist/index.js"},"exports":{".":{"require":"./dist/index.js","import":"./dist/index.js"},"./sdk":{"types":"./dist/sdk/sdk.d.ts","import":"./dist/sdk/sdk.mjs","require":"./dist/sdk/sdk.js"},"./cli":{"require":"./dist/index.js"}},"files":["dist/","defaults/","action.yml","README.md","LICENSE"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build:cli":"ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo \'#!/usr/bin/env node\' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js","build:sdk":"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk","build":"./scripts/build-oss.sh","build:ee":"npm run build:cli && npm run build:sdk","test":"jest && npm run test:yaml","test:unit":"jest","prepublishOnly":"npm run build","test:watch":"jest --watch","test:coverage":"jest --coverage","test:ee":"jest --testPathPatterns=\'tests/ee\' --testPathIgnorePatterns=\'/node_modules/\' --no-coverage","test:manual:bash":"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts","lint":"eslint src tests --ext .ts","lint:fix":"eslint src tests --ext .ts --fix","format":"prettier --write src tests","format:check":"prettier --check src tests","clean":"","clean:traces":"node scripts/clean-traces.js","prebuild":"npm run clean && node scripts/generate-config-schema.js","pretest":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","pretest:unit":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","test:with-build":"npm run build:cli && jest","test:yaml":"node dist/index.js test --progress compact","test:yaml:parallel":"node dist/index.js test --progress compact --max-parallel 4","prepare":"husky","pre-commit":"lint-staged","deploy:site":"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true","deploy:worker":"npx wrangler deploy","deploy":"npm run deploy:site && npm run deploy:worker","publish:ee":"./scripts/publish-ee.sh","release":"./scripts/release.sh","release:patch":"./scripts/release.sh patch","release:minor":"./scripts/release.sh minor","release:major":"./scripts/release.sh major","release:prerelease":"./scripts/release.sh prerelease","docs:validate":"node scripts/validate-readme-links.js","workshop:setup":"npm install -D reveal-md@6.1.2","workshop:serve":"cd workshop && reveal-md slides.md -w","workshop:export":"reveal-md workshop/slides.md --static workshop/build","workshop:pdf":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter","workshop:pdf:ci":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter --puppeteer-launch-args=\\"--no-sandbox --disable-dev-shm-usage\\"","workshop:pdf:a4":"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4","workshop:build":"npm run workshop:export && npm run workshop:pdf","simulate:issue":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug","simulate:comment":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug"},"keywords":["code-review","ai","github-action","cli","pr-review","visor"],"author":"Probe Labs","license":"MIT","description":"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines","repository":{"type":"git","url":"git+https://github.com/probelabs/visor.git"},"bugs":{"url":"https://github.com/probelabs/visor/issues"},"homepage":"https://github.com/probelabs/visor#readme","dependencies":{"@actions/core":"^1.11.1","@apidevtools/swagger-parser":"^12.1.0","@grammyjs/runner":"^2.0.3","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/api-logs":"^0.203.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-logs-otlp-http":"^0.203.0","@opentelemetry/exporter-metrics-otlp-http":"^0.203.0","@opentelemetry/exporter-trace-otlp-grpc":"^0.203.0","@opentelemetry/exporter-trace-otlp-http":"^0.203.0","@opentelemetry/instrumentation":"^0.203.0","@opentelemetry/resources":"^1.30.1","@opentelemetry/sdk-logs":"^0.203.0","@opentelemetry/sdk-metrics":"^1.30.1","@opentelemetry/sdk-node":"^0.203.0","@opentelemetry/sdk-trace-base":"^1.30.1","@opentelemetry/semantic-conventions":"^1.30.1","@probelabs/probe":"^0.6.0-rc294","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","acorn":"^8.16.0","acorn-walk":"^8.3.5","ajv":"^8.17.1","ajv-formats":"^3.0.1","better-sqlite3":"^11.0.0","blessed":"^0.1.81","botbuilder":"^4.23.3","botframework-connector":"^4.23.3","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","grammy":"^1.41.1","ignore":"^7.0.5","imapflow":"^1.2.12","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","mailparser":"^3.9.3","minimatch":"^10.2.2","node-cron":"^3.0.3","nodemailer":"^8.0.1","open":"^9.1.0","resend":"^6.9.3","simple-git":"^3.28.0","uuid":"^11.1.0","ws":"^8.18.3"},"optionalDependencies":{"@anthropic/claude-code-sdk":"npm:null@*","@open-policy-agent/opa-wasm":"^1.10.0","knex":"^3.1.0","mysql2":"^3.11.0","pg":"^8.13.0","tedious":"^19.0.0"},"devDependencies":{"@eslint/js":"^9.34.0","@kie/act-js":"^2.6.2","@kie/mock-github":"^2.0.1","@swc/core":"^1.13.2","@swc/jest":"^0.2.37","@types/better-sqlite3":"^7.6.0","@types/blessed":"^0.1.27","@types/jest":"^30.0.0","@types/js-yaml":"^4.0.9","@types/mailparser":"^3.4.6","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/nodemailer":"^7.0.11","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.42.0","@typescript-eslint/parser":"^8.42.0","@vercel/ncc":"^0.38.4","eslint":"^9.34.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","husky":"^9.1.7","jest":"^30.1.3","lint-staged":"^16.1.6","prettier":"^3.6.2","reveal-md":"^6.1.2","ts-json-schema-generator":"^1.5.1","ts-node":"^10.9.2","tsup":"^8.5.0","typescript":"^5.9.2","wrangler":"^3.0.0"},"peerDependenciesMeta":{"@anthropic/claude-code-sdk":{"optional":true}},"directories":{"test":"tests"},"lint-staged":{"src/**/*.{ts,js}":["eslint --fix","prettier --write"],"tests/**/*.{ts,js}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}}');
|
|
610998
611216
|
|
|
610999
611217
|
/***/ })
|
|
611000
611218
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/ai-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6B5C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,aAAa;IAChD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAwB;;IAQvC,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIxB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ;IAWhB,uFAAuF;IACvF,OAAO,CAAC,sBAAsB;IAsCxB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDvD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,UAAU;IAsExB;;OAEG;YACW,kBAAkB;IA0ChC;;OAEG;YACW,oBAAoB;IA6QlC;;;OAGG;YACW,YAAY;IA6IpB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,WAAW,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,OAAO,CAAC,aAAa,CAAC;YAiBX,iBAAiB;
|
|
1
|
+
{"version":3,"file":"ai-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/ai-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6B5C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,aAAa;IAChD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAwB;;IAQvC,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIxB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ;IAWhB,uFAAuF;IACvF,OAAO,CAAC,sBAAsB;IAsCxB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDvD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,UAAU;IAsExB;;OAEG;YACW,kBAAkB;IA0ChC;;OAEG;YACW,oBAAoB;IA6QlC;;;OAGG;YACW,YAAY;IA6IpB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,WAAW,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,OAAO,CAAC,aAAa,CAAC;YAiBX,iBAAiB;IAgpC/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAsE7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA2G5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA8F5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAuBpB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAWhG,sBAAsB,IAAI,MAAM,EAAE;IA4C5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAYrC,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import {
|
|
13
13
|
init_trace_helpers,
|
|
14
14
|
withActiveSpan
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-CHARL3TY.mjs";
|
|
16
16
|
import "./chunk-6VVXKXTI.mjs";
|
|
17
17
|
import "./chunk-34QX63WK.mjs";
|
|
18
18
|
import {
|
|
@@ -1655,4 +1655,4 @@ export {
|
|
|
1655
1655
|
messageToWorkflowInput,
|
|
1656
1656
|
resultToArtifacts
|
|
1657
1657
|
};
|
|
1658
|
-
//# sourceMappingURL=a2a-frontend-
|
|
1658
|
+
//# sourceMappingURL=a2a-frontend-KJFLIZJT.mjs.map
|