oxe-cc 1.0.0 → 1.3.0
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/.cursor/commands/oxe-ask.md +3 -3
- package/.cursor/commands/oxe-capabilities.md +3 -3
- package/.cursor/commands/oxe-checkpoint.md +3 -3
- package/.cursor/commands/oxe-compact.md +3 -3
- package/.cursor/commands/oxe-dashboard.md +3 -3
- package/.cursor/commands/oxe-debug.md +3 -3
- package/.cursor/commands/oxe-discuss.md +3 -3
- package/.cursor/commands/oxe-execute.md +7 -4
- package/.cursor/commands/oxe-forensics.md +3 -3
- package/.cursor/commands/oxe-help.md +3 -3
- package/.cursor/commands/oxe-loop.md +3 -3
- package/.cursor/commands/oxe-milestone.md +3 -3
- package/.cursor/commands/oxe-next.md +3 -3
- package/.cursor/commands/oxe-obs.md +3 -3
- package/.cursor/commands/oxe-plan-agent.md +3 -3
- package/.cursor/commands/oxe-plan.md +3 -3
- package/.cursor/commands/oxe-project.md +3 -3
- package/.cursor/commands/oxe-quick.md +3 -3
- package/.cursor/commands/oxe-research.md +3 -3
- package/.cursor/commands/oxe-retro.md +3 -3
- package/.cursor/commands/oxe-review-pr.md +3 -3
- package/.cursor/commands/oxe-route.md +3 -3
- package/.cursor/commands/oxe-scan.md +3 -3
- package/.cursor/commands/oxe-security.md +3 -3
- package/.cursor/commands/oxe-session.md +4 -4
- package/.cursor/commands/oxe-ship.md +45 -0
- package/.cursor/commands/oxe-skill.md +3 -3
- package/.cursor/commands/oxe-spec.md +3 -3
- package/.cursor/commands/oxe-ui-review.md +3 -3
- package/.cursor/commands/oxe-ui-spec.md +3 -3
- package/.cursor/commands/oxe-update.md +3 -3
- package/.cursor/commands/oxe-validate-gaps.md +3 -3
- package/.cursor/commands/oxe-verify.md +6 -3
- package/.cursor/commands/oxe-workstream.md +3 -3
- package/.cursor/commands/oxe.md +6 -6
- package/.github/copilot-instructions.md +94 -4
- package/.github/prompts/oxe-ask.prompt.md +3 -3
- package/.github/prompts/oxe-capabilities.prompt.md +3 -3
- package/.github/prompts/oxe-checkpoint.prompt.md +3 -3
- package/.github/prompts/oxe-compact.prompt.md +3 -3
- package/.github/prompts/oxe-dashboard.prompt.md +3 -3
- package/.github/prompts/oxe-debug.prompt.md +3 -3
- package/.github/prompts/oxe-discuss.prompt.md +3 -3
- package/.github/prompts/oxe-execute.prompt.md +7 -4
- package/.github/prompts/oxe-forensics.prompt.md +3 -3
- package/.github/prompts/oxe-help.prompt.md +3 -3
- package/.github/prompts/oxe-loop.prompt.md +3 -3
- package/.github/prompts/oxe-milestone.prompt.md +3 -3
- package/.github/prompts/oxe-next.prompt.md +3 -3
- package/.github/prompts/oxe-obs.prompt.md +3 -3
- package/.github/prompts/oxe-plan-agent.prompt.md +3 -3
- package/.github/prompts/oxe-plan.prompt.md +3 -3
- package/.github/prompts/oxe-project.prompt.md +3 -3
- package/.github/prompts/oxe-quick.prompt.md +3 -3
- package/.github/prompts/oxe-research.prompt.md +3 -3
- package/.github/prompts/oxe-retro.prompt.md +3 -3
- package/.github/prompts/oxe-review-pr.prompt.md +3 -3
- package/.github/prompts/oxe-route.prompt.md +3 -3
- package/.github/prompts/oxe-scan.prompt.md +3 -3
- package/.github/prompts/oxe-security.prompt.md +3 -3
- package/.github/prompts/oxe-session.prompt.md +4 -4
- package/.github/prompts/oxe-ship.prompt.md +45 -0
- package/.github/prompts/oxe-skill.prompt.md +3 -3
- package/.github/prompts/oxe-spec.prompt.md +3 -3
- package/.github/prompts/oxe-ui-review.prompt.md +3 -3
- package/.github/prompts/oxe-ui-spec.prompt.md +3 -3
- package/.github/prompts/oxe-update.prompt.md +3 -3
- package/.github/prompts/oxe-validate-gaps.prompt.md +3 -3
- package/.github/prompts/oxe-verify.prompt.md +6 -3
- package/.github/prompts/oxe-workstream.prompt.md +3 -3
- package/.github/prompts/oxe.prompt.md +5 -5
- package/AGENTS.md +43 -28
- package/CHANGELOG.md +193 -0
- package/README.md +610 -529
- package/bin/banner.txt +1 -1
- package/bin/lib/oxe-agent-install.cjs +69 -69
- package/bin/lib/oxe-azure.cjs +1445 -1445
- package/bin/lib/oxe-context-engine.cjs +867 -867
- package/bin/lib/oxe-dashboard.cjs +76 -28
- package/bin/lib/oxe-operational.cjs +2144 -1340
- package/bin/lib/oxe-project-health.cjs +483 -1
- package/bin/lib/oxe-runtime-semantics.cjs +12 -0
- package/bin/oxe-cc.js +554 -152
- package/commands/oxe/ask.md +7 -3
- package/commands/oxe/capabilities.md +2 -2
- package/commands/oxe/checkpoint.md +3 -3
- package/commands/oxe/compact.md +3 -3
- package/commands/oxe/dashboard.md +2 -2
- package/commands/oxe/debug.md +3 -3
- package/commands/oxe/discuss.md +2 -2
- package/commands/oxe/execute.md +7 -4
- package/commands/oxe/forensics.md +3 -3
- package/commands/oxe/help.md +2 -2
- package/commands/oxe/loop.md +3 -3
- package/commands/oxe/milestone.md +3 -3
- package/commands/oxe/next.md +3 -3
- package/commands/oxe/obs.md +3 -3
- package/commands/oxe/oxe.md +5 -5
- package/commands/oxe/plan-agent.md +2 -2
- package/commands/oxe/plan.md +2 -2
- package/commands/oxe/project.md +3 -3
- package/commands/oxe/quick.md +2 -2
- package/commands/oxe/research.md +3 -3
- package/commands/oxe/retro.md +3 -3
- package/commands/oxe/review-pr.md +3 -3
- package/commands/oxe/route.md +3 -3
- package/commands/oxe/scan.md +3 -3
- package/commands/oxe/security.md +3 -3
- package/commands/oxe/session.md +4 -4
- package/commands/oxe/ship.md +49 -0
- package/commands/oxe/skill.md +2 -2
- package/commands/oxe/spec.md +4 -4
- package/commands/oxe/ui-review.md +3 -3
- package/commands/oxe/ui-spec.md +3 -3
- package/commands/oxe/update.md +2 -2
- package/commands/oxe/validate-gaps.md +3 -3
- package/commands/oxe/verify.md +7 -4
- package/commands/oxe/workstream.md +3 -3
- package/lib/runtime/audit/audit-trail.d.ts +71 -0
- package/lib/runtime/audit/audit-trail.js +154 -0
- package/lib/runtime/audit/index.d.ts +2 -0
- package/lib/runtime/audit/index.js +18 -0
- package/lib/runtime/audit/policy-pack.d.ts +15 -0
- package/lib/runtime/audit/policy-pack.js +57 -0
- package/lib/runtime/context/context-pack-builder.d.ts +15 -0
- package/lib/runtime/context/context-pack-builder.js +42 -0
- package/lib/runtime/context/context-pack-store.d.ts +38 -0
- package/lib/runtime/context/context-pack-store.js +142 -0
- package/lib/runtime/context/context-profiles.d.ts +11 -0
- package/lib/runtime/context/context-profiles.js +51 -0
- package/lib/runtime/context/index.d.ts +2 -0
- package/lib/runtime/context/index.js +2 -0
- package/lib/runtime/decision/decision-engine.d.ts +43 -0
- package/lib/runtime/decision/decision-engine.js +127 -0
- package/lib/runtime/decision/decision-memo.d.ts +53 -0
- package/lib/runtime/decision/decision-memo.js +173 -0
- package/lib/runtime/decision/index.d.ts +2 -0
- package/lib/runtime/decision/index.js +18 -0
- package/lib/runtime/delivery/branch-manager.d.ts +1 -0
- package/lib/runtime/delivery/branch-manager.js +7 -0
- package/lib/runtime/delivery/ci-checks.js +34 -1
- package/lib/runtime/delivery/delivery-records.d.ts +34 -0
- package/lib/runtime/delivery/delivery-records.js +48 -0
- package/lib/runtime/delivery/index.d.ts +2 -0
- package/lib/runtime/delivery/index.js +2 -0
- package/lib/runtime/delivery/promotion-pipeline.d.ts +63 -0
- package/lib/runtime/delivery/promotion-pipeline.js +224 -0
- package/lib/runtime/gate/gate-manager.d.ts +41 -0
- package/lib/runtime/gate/gate-manager.js +108 -1
- package/lib/runtime/index.d.ts +5 -2
- package/lib/runtime/index.js +7 -1
- package/lib/runtime/models/gate-decision.d.ts +4 -1
- package/lib/runtime/models/workspace.d.ts +3 -0
- package/lib/runtime/plugins/capability-adapter.d.ts +12 -0
- package/lib/runtime/plugins/capability-adapter.js +204 -0
- package/lib/runtime/plugins/capability-matrix.d.ts +25 -0
- package/lib/runtime/plugins/capability-matrix.js +90 -0
- package/lib/runtime/plugins/index.d.ts +3 -0
- package/lib/runtime/plugins/index.js +3 -0
- package/lib/runtime/plugins/plugin-abi.d.ts +2 -0
- package/lib/runtime/plugins/plugin-manifest.d.ts +22 -0
- package/lib/runtime/plugins/plugin-manifest.js +95 -0
- package/lib/runtime/plugins/plugin-registry.d.ts +46 -0
- package/lib/runtime/plugins/plugin-registry.js +84 -2
- package/lib/runtime/policy/policy-engine.d.ts +47 -1
- package/lib/runtime/policy/policy-engine.js +172 -9
- package/lib/runtime/projection/projection-engine.d.ts +9 -1
- package/lib/runtime/projection/projection-engine.js +73 -3
- package/lib/runtime/reducers/run-state-reducer.d.ts +26 -0
- package/lib/runtime/reducers/run-state-reducer.js +117 -1
- package/lib/runtime/scheduler/agent-registry.d.ts +44 -0
- package/lib/runtime/scheduler/agent-registry.js +96 -0
- package/lib/runtime/scheduler/agent-roles.d.ts +54 -0
- package/lib/runtime/scheduler/agent-roles.js +62 -0
- package/lib/runtime/scheduler/index.d.ts +3 -0
- package/lib/runtime/scheduler/index.js +3 -0
- package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +45 -1
- package/lib/runtime/scheduler/multi-agent-coordinator.js +234 -35
- package/lib/runtime/scheduler/run-journal.d.ts +18 -0
- package/lib/runtime/scheduler/run-journal.js +54 -0
- package/lib/runtime/scheduler/scheduler.d.ts +29 -1
- package/lib/runtime/scheduler/scheduler.js +387 -14
- package/lib/runtime/verification/index.d.ts +1 -0
- package/lib/runtime/verification/index.js +1 -0
- package/lib/runtime/verification/verification-compiler.d.ts +43 -0
- package/lib/runtime/verification/verification-compiler.js +137 -0
- package/lib/runtime/verification/verification-manifest.d.ts +67 -0
- package/lib/runtime/verification/verification-manifest.js +179 -0
- package/lib/runtime/workspace/strategies/ephemeral-container.d.ts +1 -0
- package/lib/runtime/workspace/strategies/ephemeral-container.js +4 -0
- package/lib/runtime/workspace/strategies/git-worktree.d.ts +1 -0
- package/lib/runtime/workspace/strategies/git-worktree.js +2 -0
- package/lib/runtime/workspace/strategies/inplace.d.ts +1 -0
- package/lib/runtime/workspace/strategies/inplace.js +2 -0
- package/lib/runtime/workspace/workspace-manager.d.ts +2 -1
- package/lib/sdk/README.md +9 -9
- package/lib/sdk/index.cjs +33 -24
- package/lib/sdk/index.d.ts +149 -14
- package/oxe/templates/ACTIVE-RUN.template.json +32 -32
- package/oxe/templates/CAPABILITIES.template.md +7 -7
- package/oxe/templates/CAPABILITY.template.md +45 -45
- package/oxe/templates/CHECKPOINTS.template.md +7 -7
- package/oxe/templates/EXECUTION-RUNTIME.template.md +68 -68
- package/oxe/templates/HYPOTHESES.template.md +33 -33
- package/oxe/templates/LESSONS-METRICS.template.json +13 -13
- package/oxe/templates/NOTES.template.md +16 -16
- package/oxe/templates/PLAN-REVIEW.template.md +31 -31
- package/oxe/templates/SESSION.template.md +34 -34
- package/oxe/templates/SKILL.template.md +26 -26
- package/oxe/templates/STATE.md +55 -55
- package/oxe/templates/WORKFLOW_AUTHORING.md +18 -18
- package/oxe/workflows/ask.md +96 -92
- package/oxe/workflows/capabilities.md +25 -25
- package/oxe/workflows/checkpoint.md +14 -10
- package/oxe/workflows/dashboard.md +33 -33
- package/oxe/workflows/debug.md +19 -15
- package/oxe/workflows/discuss.md +12 -12
- package/oxe/workflows/execute.md +44 -2
- package/oxe/workflows/forensics.md +13 -9
- package/oxe/workflows/help.md +352 -304
- package/oxe/workflows/loop.md +17 -13
- package/oxe/workflows/next.md +22 -22
- package/oxe/workflows/obs.md +4 -0
- package/oxe/workflows/oxe.md +64 -31
- package/oxe/workflows/plan-agent.md +9 -9
- package/oxe/workflows/project.md +6 -1
- package/oxe/workflows/quick.md +10 -10
- package/oxe/workflows/references/reasoning-discovery.md +28 -28
- package/oxe/workflows/references/reasoning-execution.md +29 -29
- package/oxe/workflows/references/reasoning-planning.md +32 -32
- package/oxe/workflows/references/reasoning-review.md +29 -29
- package/oxe/workflows/references/reasoning-status.md +24 -24
- package/oxe/workflows/references/robustness-elevation.md +295 -295
- package/oxe/workflows/references/workflow-runtime-contracts.json +952 -907
- package/oxe/workflows/research.md +32 -28
- package/oxe/workflows/retro.md +4 -0
- package/oxe/workflows/review-pr.md +15 -11
- package/oxe/workflows/route.md +16 -16
- package/oxe/workflows/scan.md +4 -0
- package/oxe/workflows/security.md +14 -10
- package/oxe/workflows/session.md +213 -197
- package/oxe/workflows/ship.md +142 -0
- package/oxe/workflows/skill.md +44 -44
- package/oxe/workflows/spec.md +15 -0
- package/oxe/workflows/ui-review.md +20 -16
- package/oxe/workflows/ui-spec.md +7 -3
- package/oxe/workflows/validate-gaps.md +13 -9
- package/oxe/workflows/verify-audit.md +73 -73
- package/oxe/workflows/verify.md +52 -3
- package/package.json +92 -92
- package/packages/runtime/package.json +17 -17
- package/packages/runtime/src/audit/audit-trail.ts +243 -0
- package/packages/runtime/src/audit/index.ts +2 -0
- package/packages/runtime/src/audit/policy-pack.ts +62 -0
- package/packages/runtime/src/compiler/graph-compiler.ts +245 -245
- package/packages/runtime/src/compiler/index.ts +1 -1
- package/packages/runtime/src/context/context-pack-builder.ts +259 -193
- package/packages/runtime/src/context/context-pack-store.ts +197 -0
- package/packages/runtime/src/context/context-profiles.ts +60 -0
- package/packages/runtime/src/context/index.ts +3 -1
- package/packages/runtime/src/decision/decision-engine.ts +174 -0
- package/packages/runtime/src/decision/decision-memo.ts +211 -0
- package/packages/runtime/src/decision/index.ts +2 -0
- package/packages/runtime/src/delivery/branch-manager.ts +91 -84
- package/packages/runtime/src/delivery/ci-checks.ts +285 -252
- package/packages/runtime/src/delivery/delivery-records.ts +75 -0
- package/packages/runtime/src/delivery/index.ts +5 -3
- package/packages/runtime/src/delivery/pr-manager.ts +112 -112
- package/packages/runtime/src/delivery/promotion-pipeline.ts +334 -0
- package/packages/runtime/src/events/bus.ts +92 -92
- package/packages/runtime/src/events/catalog.ts +29 -29
- package/packages/runtime/src/events/envelope.ts +14 -14
- package/packages/runtime/src/events/index.ts +3 -3
- package/packages/runtime/src/evidence/evidence-store.ts +130 -130
- package/packages/runtime/src/evidence/index.ts +1 -1
- package/packages/runtime/src/gate/gate-manager.ts +289 -137
- package/packages/runtime/src/gate/index.ts +1 -1
- package/packages/runtime/src/index.ts +41 -32
- package/packages/runtime/src/models/attempt.ts +19 -19
- package/packages/runtime/src/models/evidence.ts +21 -21
- package/packages/runtime/src/models/gate-decision.ts +25 -21
- package/packages/runtime/src/models/index.ts +8 -8
- package/packages/runtime/src/models/run.ts +24 -24
- package/packages/runtime/src/models/session.ts +11 -11
- package/packages/runtime/src/models/verification-result.ts +10 -10
- package/packages/runtime/src/models/work-item.ts +25 -25
- package/packages/runtime/src/models/workspace.ts +31 -28
- package/packages/runtime/src/plugins/capability-adapter.ts +206 -0
- package/packages/runtime/src/plugins/capability-matrix.ts +126 -0
- package/packages/runtime/src/plugins/index.ts +5 -2
- package/packages/runtime/src/plugins/plugin-abi.ts +97 -95
- package/packages/runtime/src/plugins/plugin-manifest.ts +118 -0
- package/packages/runtime/src/plugins/plugin-registry.ts +232 -119
- package/packages/runtime/src/policy/index.ts +1 -1
- package/packages/runtime/src/policy/policy-engine.ts +330 -113
- package/packages/runtime/src/projection/index.ts +1 -1
- package/packages/runtime/src/projection/projection-engine.ts +328 -249
- package/packages/runtime/src/reducers/debug-reducer.ts +36 -36
- package/packages/runtime/src/reducers/index.ts +2 -2
- package/packages/runtime/src/reducers/run-state-reducer.ts +269 -127
- package/packages/runtime/src/scheduler/agent-registry.ts +132 -0
- package/packages/runtime/src/scheduler/agent-roles.ts +109 -0
- package/packages/runtime/src/scheduler/index.ts +4 -1
- package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +521 -231
- package/packages/runtime/src/scheduler/run-journal.ts +62 -0
- package/packages/runtime/src/scheduler/scheduler.ts +722 -281
- package/packages/runtime/src/verification/index.ts +2 -1
- package/packages/runtime/src/verification/verification-compiler.ts +436 -225
- package/packages/runtime/src/verification/verification-manifest.ts +252 -0
- package/packages/runtime/src/workspace/index.ts +5 -5
- package/packages/runtime/src/workspace/strategies/ephemeral-container.ts +126 -121
- package/packages/runtime/src/workspace/strategies/git-worktree.ts +79 -77
- package/packages/runtime/src/workspace/strategies/inplace.ts +38 -35
- package/packages/runtime/src/workspace/workspace-manager.ts +16 -15
- package/packages/runtime/tsconfig.json +17 -17
- package/vscode-extension/.vscodeignore +7 -7
- package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
- package/vscode-extension/package.json +185 -185
- package/vscode-extension/src/extension.js +310 -310
- package/vscode-extension/src/shared/contextLoader.js +137 -137
- package/vscode-extension/src/shared/contractBuilder.js +159 -159
- package/vscode-extension/src/shared/stateReader.js +101 -101
|
@@ -1,310 +1,310 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const vscode = require('vscode');
|
|
4
|
-
const stateReader = require('./shared/stateReader');
|
|
5
|
-
const contextLoader = require('./shared/contextLoader');
|
|
6
|
-
const contractBuilder = require('./shared/contractBuilder');
|
|
7
|
-
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
// Output channel para diagnóstico
|
|
10
|
-
// ---------------------------------------------------------------------------
|
|
11
|
-
|
|
12
|
-
/** @type {vscode.OutputChannel | null} */
|
|
13
|
-
let outputChannel = null;
|
|
14
|
-
|
|
15
|
-
function log(message) {
|
|
16
|
-
if (outputChannel) outputChannel.appendLine(`[OXE Agents] ${message}`);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
// Configuração dos 13 agentes
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
|
|
23
|
-
/** @type {Array<{ id: string, workflow: string, description: string, isSticky: boolean }>} */
|
|
24
|
-
const AGENTS = [
|
|
25
|
-
{ id: 'oxe.router', workflow: 'oxe', isSticky: false },
|
|
26
|
-
{ id: 'oxe.ask', workflow: 'ask', isSticky: false },
|
|
27
|
-
{ id: 'oxe.scan', workflow: 'scan', isSticky: false },
|
|
28
|
-
{ id: 'oxe.spec', workflow: 'spec', isSticky: true },
|
|
29
|
-
{ id: 'oxe.plan', workflow: 'plan', isSticky: true },
|
|
30
|
-
{ id: 'oxe.quick', workflow: 'quick', isSticky: true },
|
|
31
|
-
{ id: 'oxe.execute', workflow: 'execute', isSticky: true },
|
|
32
|
-
{ id: 'oxe.debug', workflow: 'debug', isSticky: false },
|
|
33
|
-
{ id: 'oxe.verify', workflow: 'verify', isSticky: true },
|
|
34
|
-
{ id: 'oxe.review', workflow: 'review-pr', isSticky: false },
|
|
35
|
-
{ id: 'oxe.capabilities', workflow: 'capabilities', isSticky: false },
|
|
36
|
-
{ id: 'oxe.skill', workflow: 'skill', isSticky: false },
|
|
37
|
-
{ id: 'oxe.dashboard', workflow: 'dashboard', isSticky: false },
|
|
38
|
-
];
|
|
39
|
-
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
// Seleção de modelo
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Seleciona o melhor modelo disponível — GPT-4o via Copilot com fallbacks.
|
|
46
|
-
* @returns {Promise<import('vscode').LanguageModelChat | null>}
|
|
47
|
-
*/
|
|
48
|
-
async function selectModel() {
|
|
49
|
-
if (!vscode.lm || typeof vscode.lm.selectChatModels !== 'function') {
|
|
50
|
-
log('vscode.lm.selectChatModels não disponível nesta versão do VS Code.');
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const selectors = [
|
|
55
|
-
{ vendor: 'copilot', family: 'gpt-4o' },
|
|
56
|
-
{ vendor: 'copilot', family: 'claude-sonnet' },
|
|
57
|
-
{ vendor: 'copilot' },
|
|
58
|
-
{},
|
|
59
|
-
];
|
|
60
|
-
|
|
61
|
-
for (const selector of selectors) {
|
|
62
|
-
try {
|
|
63
|
-
const models = await vscode.lm.selectChatModels(selector);
|
|
64
|
-
if (models && models.length > 0) {
|
|
65
|
-
log(`Modelo selecionado: ${models[0].name || models[0].id || JSON.stringify(selector)}`);
|
|
66
|
-
return models[0];
|
|
67
|
-
}
|
|
68
|
-
} catch (err) {
|
|
69
|
-
log(`selectChatModels(${JSON.stringify(selector)}) falhou: ${err.message}`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// ---------------------------------------------------------------------------
|
|
76
|
-
// Conversão de histórico — duck typing para evitar quebra em versões antigas
|
|
77
|
-
// ---------------------------------------------------------------------------
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Converte as últimas N trocas do histórico em mensagens para o LM.
|
|
81
|
-
* Usa duck typing em vez de instanceof para compatibilidade.
|
|
82
|
-
* @param {readonly unknown[]} history
|
|
83
|
-
* @param {number} maxTurns
|
|
84
|
-
* @returns {import('vscode').LanguageModelChatMessage[]}
|
|
85
|
-
*/
|
|
86
|
-
function buildHistoryMessages(history, maxTurns = 3) {
|
|
87
|
-
if (!history || !history.length) return [];
|
|
88
|
-
if (!vscode.LanguageModelChatMessage) return [];
|
|
89
|
-
|
|
90
|
-
const messages = [];
|
|
91
|
-
const recent = history.slice(-maxTurns * 2);
|
|
92
|
-
|
|
93
|
-
for (const turn of recent) {
|
|
94
|
-
if (!turn || typeof turn !== 'object') continue;
|
|
95
|
-
|
|
96
|
-
// ChatRequestTurn: tem propriedade `prompt` (string)
|
|
97
|
-
if (typeof turn.prompt === 'string' && turn.prompt.trim()) {
|
|
98
|
-
try {
|
|
99
|
-
messages.push(vscode.LanguageModelChatMessage.User(turn.prompt));
|
|
100
|
-
} catch { /* API incompatível */ }
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// ChatResponseTurn: tem propriedade `response` (array de parts)
|
|
105
|
-
if (Array.isArray(turn.response)) {
|
|
106
|
-
const text = turn.response
|
|
107
|
-
.filter((part) => part && typeof part === 'object' && part.value && typeof part.value.value === 'string')
|
|
108
|
-
.map((part) => part.value.value)
|
|
109
|
-
.join('');
|
|
110
|
-
if (text.trim()) {
|
|
111
|
-
try {
|
|
112
|
-
messages.push(vscode.LanguageModelChatMessage.Assistant(text));
|
|
113
|
-
} catch { /* API incompatível */ }
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return messages;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ---------------------------------------------------------------------------
|
|
122
|
-
// Verificar se o projeto tem OXE inicializado
|
|
123
|
-
// ---------------------------------------------------------------------------
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Garante que o workspace tem OXE. Retorna o root ou null com mensagem de erro.
|
|
127
|
-
* @param {import('vscode').ChatResponseStream} stream
|
|
128
|
-
* @returns {string | null}
|
|
129
|
-
*/
|
|
130
|
-
function requireOxeProject(stream) {
|
|
131
|
-
const root = stateReader.getProjectRoot(vscode.workspace.workspaceFolders);
|
|
132
|
-
|
|
133
|
-
if (!root) {
|
|
134
|
-
stream.markdown(
|
|
135
|
-
'⚠️ **Nenhum workspace aberto.**\n\nAbra uma pasta de projeto para usar os agentes OXE.\n\n' +
|
|
136
|
-
'```\nFile → Open Folder → selecione a pasta do seu projeto\n```'
|
|
137
|
-
);
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (!stateReader.hasOxe(root)) {
|
|
142
|
-
stream.markdown(
|
|
143
|
-
`⚠️ **Projeto OXE não inicializado** em \`${root}\`.\n\n` +
|
|
144
|
-
'Execute no terminal para instalar o OXE:\n\n' +
|
|
145
|
-
'```bash\nnpx oxe-cc@latest\n```'
|
|
146
|
-
);
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return root;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
// Handler genérico
|
|
155
|
-
// ---------------------------------------------------------------------------
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Cria o handler de um agente OXE.
|
|
159
|
-
* @param {{ id: string, workflow: string }} agentDef
|
|
160
|
-
* @returns {import('vscode').ChatRequestHandler}
|
|
161
|
-
*/
|
|
162
|
-
function makeHandler(agentDef) {
|
|
163
|
-
const { workflow } = agentDef;
|
|
164
|
-
|
|
165
|
-
return async (request, context, stream, token) => {
|
|
166
|
-
log(`Handler invocado: ${agentDef.id} | prompt: "${(request.prompt || '').slice(0, 60)}"${request.command ? ' | cmd: /' + request.command : ''}`);
|
|
167
|
-
|
|
168
|
-
// 1. Verificar projeto
|
|
169
|
-
const projectRoot = requireOxeProject(stream);
|
|
170
|
-
if (!projectRoot) return;
|
|
171
|
-
|
|
172
|
-
// 2. Mostrar progresso
|
|
173
|
-
stream.progress(`Carregando contexto OXE — workflow: ${workflow}…`);
|
|
174
|
-
|
|
175
|
-
// 3. Ler state
|
|
176
|
-
const stateInfo = stateReader.getProjectContext(projectRoot);
|
|
177
|
-
log(`Estado: fase=${stateInfo.phase}, sessão=${stateInfo.session}`);
|
|
178
|
-
|
|
179
|
-
// 4. Carregar context pack
|
|
180
|
-
const pack = contextLoader.loadContextPack(projectRoot, workflow);
|
|
181
|
-
log(`Context pack: ${pack ? `carregado (quality=${pack.context_quality?.score})` : 'não encontrado — usando fallback'}`);
|
|
182
|
-
|
|
183
|
-
// 5. Formatar artefatos
|
|
184
|
-
const artifactsText = contextLoader.formatArtifacts(pack);
|
|
185
|
-
const hypothesesText = contextLoader.formatHypotheses(pack);
|
|
186
|
-
const gapsText = contextLoader.formatGaps(pack);
|
|
187
|
-
|
|
188
|
-
// 6. Construir system prompt
|
|
189
|
-
const systemPrompt = contractBuilder.build(
|
|
190
|
-
workflow,
|
|
191
|
-
pack,
|
|
192
|
-
stateInfo.text,
|
|
193
|
-
request.command,
|
|
194
|
-
stateInfo,
|
|
195
|
-
artifactsText,
|
|
196
|
-
hypothesesText,
|
|
197
|
-
gapsText
|
|
198
|
-
);
|
|
199
|
-
log(`System prompt: ${systemPrompt.length} chars`);
|
|
200
|
-
|
|
201
|
-
// 7. Selecionar modelo
|
|
202
|
-
const model = await selectModel();
|
|
203
|
-
if (!model) {
|
|
204
|
-
stream.markdown(
|
|
205
|
-
'⚠️ **Nenhum modelo de linguagem disponível.**\n\n' +
|
|
206
|
-
'Verifique se o **GitHub Copilot Chat** está instalado, habilitado e autenticado no VS Code.\n\n' +
|
|
207
|
-
'> Extensão necessária: `GitHub.copilot-chat`'
|
|
208
|
-
);
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// 8. Construir mensagens
|
|
213
|
-
const historyMessages = buildHistoryMessages(context.history);
|
|
214
|
-
const userMessage = request.command
|
|
215
|
-
? `[/${request.command}] ${request.prompt}`
|
|
216
|
-
: request.prompt;
|
|
217
|
-
|
|
218
|
-
const messages = [];
|
|
219
|
-
try {
|
|
220
|
-
messages.push(vscode.LanguageModelChatMessage.User(systemPrompt));
|
|
221
|
-
} catch (err) {
|
|
222
|
-
log(`Erro ao criar LanguageModelChatMessage: ${err.message}`);
|
|
223
|
-
stream.markdown('⚠️ API de mensagens não disponível nesta versão do VS Code. Requer VS Code 1.95+.');
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
messages.push(...historyMessages);
|
|
227
|
-
messages.push(vscode.LanguageModelChatMessage.User(userMessage));
|
|
228
|
-
|
|
229
|
-
// 9. Enviar e fazer stream
|
|
230
|
-
try {
|
|
231
|
-
const response = await model.sendRequest(messages, {}, token);
|
|
232
|
-
for await (const chunk of response.text) {
|
|
233
|
-
if (token.isCancellationRequested) break;
|
|
234
|
-
stream.markdown(chunk);
|
|
235
|
-
}
|
|
236
|
-
log(`Resposta concluída para ${agentDef.id}`);
|
|
237
|
-
} catch (err) {
|
|
238
|
-
if (err.name === 'CancellationError' || err.code === 'Cancelled') return;
|
|
239
|
-
|
|
240
|
-
// Tratar erros conhecidos do LM de forma segura (sem depender de statics que podem não existir)
|
|
241
|
-
const errMsg = err.message || String(err);
|
|
242
|
-
if (/blocked/i.test(errMsg)) {
|
|
243
|
-
stream.markdown('⚠️ **Solicitação bloqueada** pelo modelo. Reformule a pergunta e tente novamente.');
|
|
244
|
-
} else if (/not found/i.test(errMsg) || /unavailable/i.test(errMsg)) {
|
|
245
|
-
stream.markdown('⚠️ **Modelo indisponível.** Verifique as configurações do GitHub Copilot.');
|
|
246
|
-
} else if (/permission|quota/i.test(errMsg)) {
|
|
247
|
-
stream.markdown('⚠️ **Sem permissão ou cota esgotada.** Verifique a assinatura do Copilot.');
|
|
248
|
-
} else {
|
|
249
|
-
stream.markdown(`⚠️ **Erro:** ${errMsg}`);
|
|
250
|
-
}
|
|
251
|
-
log(`Erro no handler ${agentDef.id}: ${errMsg}`);
|
|
252
|
-
}
|
|
253
|
-
};
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// ---------------------------------------------------------------------------
|
|
257
|
-
// Activate / Deactivate
|
|
258
|
-
// ---------------------------------------------------------------------------
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* @param {import('vscode').ExtensionContext} context
|
|
262
|
-
*/
|
|
263
|
-
function activate(context) {
|
|
264
|
-
// Criar output channel para diagnóstico
|
|
265
|
-
outputChannel = vscode.window.createOutputChannel('OXE Agents');
|
|
266
|
-
context.subscriptions.push(outputChannel);
|
|
267
|
-
log(`Extensão ativando — VS Code ${vscode.version}`);
|
|
268
|
-
|
|
269
|
-
// Guard: verificar se a API de chat está disponível
|
|
270
|
-
if (!vscode.chat || typeof vscode.chat.createChatParticipant !== 'function') {
|
|
271
|
-
const msg = 'OXE Agents requer GitHub Copilot Chat (GitHub.copilot-chat) instalado e habilitado no VS Code.';
|
|
272
|
-
log(`AVISO: ${msg}`);
|
|
273
|
-
vscode.window.showWarningMessage(msg);
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Registrar todos os agentes
|
|
278
|
-
let registered = 0;
|
|
279
|
-
for (const agentDef of AGENTS) {
|
|
280
|
-
try {
|
|
281
|
-
const participant = vscode.chat.createChatParticipant(agentDef.id, makeHandler(agentDef));
|
|
282
|
-
participant.iconPath = new vscode.ThemeIcon('sparkle');
|
|
283
|
-
context.subscriptions.push(participant);
|
|
284
|
-
registered++;
|
|
285
|
-
log(`Agente registrado: ${agentDef.id}`);
|
|
286
|
-
} catch (err) {
|
|
287
|
-
log(`Falha ao registrar ${agentDef.id}: ${err.message}`);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
log(`${registered}/${AGENTS.length} agentes registrados com sucesso.`);
|
|
292
|
-
|
|
293
|
-
// Notificar na primeira ativação
|
|
294
|
-
const key = 'oxe.agents.v2.activated';
|
|
295
|
-
if (!context.globalState.get(key)) {
|
|
296
|
-
context.globalState.update(key, true);
|
|
297
|
-
vscode.window.showInformationMessage(
|
|
298
|
-
`OXE Agents: ${registered} agentes ativos. Use @oxe, @oxe-plan, @oxe-execute e outros no chat do Copilot.`,
|
|
299
|
-
'Ver log'
|
|
300
|
-
).then((choice) => {
|
|
301
|
-
if (choice === 'Ver log') outputChannel?.show();
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
function deactivate() {
|
|
307
|
-
log('Extensão desativada.');
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
module.exports = { activate, deactivate };
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const vscode = require('vscode');
|
|
4
|
+
const stateReader = require('./shared/stateReader');
|
|
5
|
+
const contextLoader = require('./shared/contextLoader');
|
|
6
|
+
const contractBuilder = require('./shared/contractBuilder');
|
|
7
|
+
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Output channel para diagnóstico
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
|
|
12
|
+
/** @type {vscode.OutputChannel | null} */
|
|
13
|
+
let outputChannel = null;
|
|
14
|
+
|
|
15
|
+
function log(message) {
|
|
16
|
+
if (outputChannel) outputChannel.appendLine(`[OXE Agents] ${message}`);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Configuração dos 13 agentes
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
/** @type {Array<{ id: string, workflow: string, description: string, isSticky: boolean }>} */
|
|
24
|
+
const AGENTS = [
|
|
25
|
+
{ id: 'oxe.router', workflow: 'oxe', isSticky: false },
|
|
26
|
+
{ id: 'oxe.ask', workflow: 'ask', isSticky: false },
|
|
27
|
+
{ id: 'oxe.scan', workflow: 'scan', isSticky: false },
|
|
28
|
+
{ id: 'oxe.spec', workflow: 'spec', isSticky: true },
|
|
29
|
+
{ id: 'oxe.plan', workflow: 'plan', isSticky: true },
|
|
30
|
+
{ id: 'oxe.quick', workflow: 'quick', isSticky: true },
|
|
31
|
+
{ id: 'oxe.execute', workflow: 'execute', isSticky: true },
|
|
32
|
+
{ id: 'oxe.debug', workflow: 'debug', isSticky: false },
|
|
33
|
+
{ id: 'oxe.verify', workflow: 'verify', isSticky: true },
|
|
34
|
+
{ id: 'oxe.review', workflow: 'review-pr', isSticky: false },
|
|
35
|
+
{ id: 'oxe.capabilities', workflow: 'capabilities', isSticky: false },
|
|
36
|
+
{ id: 'oxe.skill', workflow: 'skill', isSticky: false },
|
|
37
|
+
{ id: 'oxe.dashboard', workflow: 'dashboard', isSticky: false },
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Seleção de modelo
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Seleciona o melhor modelo disponível — GPT-4o via Copilot com fallbacks.
|
|
46
|
+
* @returns {Promise<import('vscode').LanguageModelChat | null>}
|
|
47
|
+
*/
|
|
48
|
+
async function selectModel() {
|
|
49
|
+
if (!vscode.lm || typeof vscode.lm.selectChatModels !== 'function') {
|
|
50
|
+
log('vscode.lm.selectChatModels não disponível nesta versão do VS Code.');
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const selectors = [
|
|
55
|
+
{ vendor: 'copilot', family: 'gpt-4o' },
|
|
56
|
+
{ vendor: 'copilot', family: 'claude-sonnet' },
|
|
57
|
+
{ vendor: 'copilot' },
|
|
58
|
+
{},
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
for (const selector of selectors) {
|
|
62
|
+
try {
|
|
63
|
+
const models = await vscode.lm.selectChatModels(selector);
|
|
64
|
+
if (models && models.length > 0) {
|
|
65
|
+
log(`Modelo selecionado: ${models[0].name || models[0].id || JSON.stringify(selector)}`);
|
|
66
|
+
return models[0];
|
|
67
|
+
}
|
|
68
|
+
} catch (err) {
|
|
69
|
+
log(`selectChatModels(${JSON.stringify(selector)}) falhou: ${err.message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// Conversão de histórico — duck typing para evitar quebra em versões antigas
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Converte as últimas N trocas do histórico em mensagens para o LM.
|
|
81
|
+
* Usa duck typing em vez de instanceof para compatibilidade.
|
|
82
|
+
* @param {readonly unknown[]} history
|
|
83
|
+
* @param {number} maxTurns
|
|
84
|
+
* @returns {import('vscode').LanguageModelChatMessage[]}
|
|
85
|
+
*/
|
|
86
|
+
function buildHistoryMessages(history, maxTurns = 3) {
|
|
87
|
+
if (!history || !history.length) return [];
|
|
88
|
+
if (!vscode.LanguageModelChatMessage) return [];
|
|
89
|
+
|
|
90
|
+
const messages = [];
|
|
91
|
+
const recent = history.slice(-maxTurns * 2);
|
|
92
|
+
|
|
93
|
+
for (const turn of recent) {
|
|
94
|
+
if (!turn || typeof turn !== 'object') continue;
|
|
95
|
+
|
|
96
|
+
// ChatRequestTurn: tem propriedade `prompt` (string)
|
|
97
|
+
if (typeof turn.prompt === 'string' && turn.prompt.trim()) {
|
|
98
|
+
try {
|
|
99
|
+
messages.push(vscode.LanguageModelChatMessage.User(turn.prompt));
|
|
100
|
+
} catch { /* API incompatível */ }
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ChatResponseTurn: tem propriedade `response` (array de parts)
|
|
105
|
+
if (Array.isArray(turn.response)) {
|
|
106
|
+
const text = turn.response
|
|
107
|
+
.filter((part) => part && typeof part === 'object' && part.value && typeof part.value.value === 'string')
|
|
108
|
+
.map((part) => part.value.value)
|
|
109
|
+
.join('');
|
|
110
|
+
if (text.trim()) {
|
|
111
|
+
try {
|
|
112
|
+
messages.push(vscode.LanguageModelChatMessage.Assistant(text));
|
|
113
|
+
} catch { /* API incompatível */ }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return messages;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Verificar se o projeto tem OXE inicializado
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Garante que o workspace tem OXE. Retorna o root ou null com mensagem de erro.
|
|
127
|
+
* @param {import('vscode').ChatResponseStream} stream
|
|
128
|
+
* @returns {string | null}
|
|
129
|
+
*/
|
|
130
|
+
function requireOxeProject(stream) {
|
|
131
|
+
const root = stateReader.getProjectRoot(vscode.workspace.workspaceFolders);
|
|
132
|
+
|
|
133
|
+
if (!root) {
|
|
134
|
+
stream.markdown(
|
|
135
|
+
'⚠️ **Nenhum workspace aberto.**\n\nAbra uma pasta de projeto para usar os agentes OXE.\n\n' +
|
|
136
|
+
'```\nFile → Open Folder → selecione a pasta do seu projeto\n```'
|
|
137
|
+
);
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (!stateReader.hasOxe(root)) {
|
|
142
|
+
stream.markdown(
|
|
143
|
+
`⚠️ **Projeto OXE não inicializado** em \`${root}\`.\n\n` +
|
|
144
|
+
'Execute no terminal para instalar o OXE:\n\n' +
|
|
145
|
+
'```bash\nnpx oxe-cc@latest\n```'
|
|
146
|
+
);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return root;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// Handler genérico
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Cria o handler de um agente OXE.
|
|
159
|
+
* @param {{ id: string, workflow: string }} agentDef
|
|
160
|
+
* @returns {import('vscode').ChatRequestHandler}
|
|
161
|
+
*/
|
|
162
|
+
function makeHandler(agentDef) {
|
|
163
|
+
const { workflow } = agentDef;
|
|
164
|
+
|
|
165
|
+
return async (request, context, stream, token) => {
|
|
166
|
+
log(`Handler invocado: ${agentDef.id} | prompt: "${(request.prompt || '').slice(0, 60)}"${request.command ? ' | cmd: /' + request.command : ''}`);
|
|
167
|
+
|
|
168
|
+
// 1. Verificar projeto
|
|
169
|
+
const projectRoot = requireOxeProject(stream);
|
|
170
|
+
if (!projectRoot) return;
|
|
171
|
+
|
|
172
|
+
// 2. Mostrar progresso
|
|
173
|
+
stream.progress(`Carregando contexto OXE — workflow: ${workflow}…`);
|
|
174
|
+
|
|
175
|
+
// 3. Ler state
|
|
176
|
+
const stateInfo = stateReader.getProjectContext(projectRoot);
|
|
177
|
+
log(`Estado: fase=${stateInfo.phase}, sessão=${stateInfo.session}`);
|
|
178
|
+
|
|
179
|
+
// 4. Carregar context pack
|
|
180
|
+
const pack = contextLoader.loadContextPack(projectRoot, workflow);
|
|
181
|
+
log(`Context pack: ${pack ? `carregado (quality=${pack.context_quality?.score})` : 'não encontrado — usando fallback'}`);
|
|
182
|
+
|
|
183
|
+
// 5. Formatar artefatos
|
|
184
|
+
const artifactsText = contextLoader.formatArtifacts(pack);
|
|
185
|
+
const hypothesesText = contextLoader.formatHypotheses(pack);
|
|
186
|
+
const gapsText = contextLoader.formatGaps(pack);
|
|
187
|
+
|
|
188
|
+
// 6. Construir system prompt
|
|
189
|
+
const systemPrompt = contractBuilder.build(
|
|
190
|
+
workflow,
|
|
191
|
+
pack,
|
|
192
|
+
stateInfo.text,
|
|
193
|
+
request.command,
|
|
194
|
+
stateInfo,
|
|
195
|
+
artifactsText,
|
|
196
|
+
hypothesesText,
|
|
197
|
+
gapsText
|
|
198
|
+
);
|
|
199
|
+
log(`System prompt: ${systemPrompt.length} chars`);
|
|
200
|
+
|
|
201
|
+
// 7. Selecionar modelo
|
|
202
|
+
const model = await selectModel();
|
|
203
|
+
if (!model) {
|
|
204
|
+
stream.markdown(
|
|
205
|
+
'⚠️ **Nenhum modelo de linguagem disponível.**\n\n' +
|
|
206
|
+
'Verifique se o **GitHub Copilot Chat** está instalado, habilitado e autenticado no VS Code.\n\n' +
|
|
207
|
+
'> Extensão necessária: `GitHub.copilot-chat`'
|
|
208
|
+
);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// 8. Construir mensagens
|
|
213
|
+
const historyMessages = buildHistoryMessages(context.history);
|
|
214
|
+
const userMessage = request.command
|
|
215
|
+
? `[/${request.command}] ${request.prompt}`
|
|
216
|
+
: request.prompt;
|
|
217
|
+
|
|
218
|
+
const messages = [];
|
|
219
|
+
try {
|
|
220
|
+
messages.push(vscode.LanguageModelChatMessage.User(systemPrompt));
|
|
221
|
+
} catch (err) {
|
|
222
|
+
log(`Erro ao criar LanguageModelChatMessage: ${err.message}`);
|
|
223
|
+
stream.markdown('⚠️ API de mensagens não disponível nesta versão do VS Code. Requer VS Code 1.95+.');
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
messages.push(...historyMessages);
|
|
227
|
+
messages.push(vscode.LanguageModelChatMessage.User(userMessage));
|
|
228
|
+
|
|
229
|
+
// 9. Enviar e fazer stream
|
|
230
|
+
try {
|
|
231
|
+
const response = await model.sendRequest(messages, {}, token);
|
|
232
|
+
for await (const chunk of response.text) {
|
|
233
|
+
if (token.isCancellationRequested) break;
|
|
234
|
+
stream.markdown(chunk);
|
|
235
|
+
}
|
|
236
|
+
log(`Resposta concluída para ${agentDef.id}`);
|
|
237
|
+
} catch (err) {
|
|
238
|
+
if (err.name === 'CancellationError' || err.code === 'Cancelled') return;
|
|
239
|
+
|
|
240
|
+
// Tratar erros conhecidos do LM de forma segura (sem depender de statics que podem não existir)
|
|
241
|
+
const errMsg = err.message || String(err);
|
|
242
|
+
if (/blocked/i.test(errMsg)) {
|
|
243
|
+
stream.markdown('⚠️ **Solicitação bloqueada** pelo modelo. Reformule a pergunta e tente novamente.');
|
|
244
|
+
} else if (/not found/i.test(errMsg) || /unavailable/i.test(errMsg)) {
|
|
245
|
+
stream.markdown('⚠️ **Modelo indisponível.** Verifique as configurações do GitHub Copilot.');
|
|
246
|
+
} else if (/permission|quota/i.test(errMsg)) {
|
|
247
|
+
stream.markdown('⚠️ **Sem permissão ou cota esgotada.** Verifique a assinatura do Copilot.');
|
|
248
|
+
} else {
|
|
249
|
+
stream.markdown(`⚠️ **Erro:** ${errMsg}`);
|
|
250
|
+
}
|
|
251
|
+
log(`Erro no handler ${agentDef.id}: ${errMsg}`);
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// Activate / Deactivate
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* @param {import('vscode').ExtensionContext} context
|
|
262
|
+
*/
|
|
263
|
+
function activate(context) {
|
|
264
|
+
// Criar output channel para diagnóstico
|
|
265
|
+
outputChannel = vscode.window.createOutputChannel('OXE Agents');
|
|
266
|
+
context.subscriptions.push(outputChannel);
|
|
267
|
+
log(`Extensão ativando — VS Code ${vscode.version}`);
|
|
268
|
+
|
|
269
|
+
// Guard: verificar se a API de chat está disponível
|
|
270
|
+
if (!vscode.chat || typeof vscode.chat.createChatParticipant !== 'function') {
|
|
271
|
+
const msg = 'OXE Agents requer GitHub Copilot Chat (GitHub.copilot-chat) instalado e habilitado no VS Code.';
|
|
272
|
+
log(`AVISO: ${msg}`);
|
|
273
|
+
vscode.window.showWarningMessage(msg);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Registrar todos os agentes
|
|
278
|
+
let registered = 0;
|
|
279
|
+
for (const agentDef of AGENTS) {
|
|
280
|
+
try {
|
|
281
|
+
const participant = vscode.chat.createChatParticipant(agentDef.id, makeHandler(agentDef));
|
|
282
|
+
participant.iconPath = new vscode.ThemeIcon('sparkle');
|
|
283
|
+
context.subscriptions.push(participant);
|
|
284
|
+
registered++;
|
|
285
|
+
log(`Agente registrado: ${agentDef.id}`);
|
|
286
|
+
} catch (err) {
|
|
287
|
+
log(`Falha ao registrar ${agentDef.id}: ${err.message}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
log(`${registered}/${AGENTS.length} agentes registrados com sucesso.`);
|
|
292
|
+
|
|
293
|
+
// Notificar na primeira ativação
|
|
294
|
+
const key = 'oxe.agents.v2.activated';
|
|
295
|
+
if (!context.globalState.get(key)) {
|
|
296
|
+
context.globalState.update(key, true);
|
|
297
|
+
vscode.window.showInformationMessage(
|
|
298
|
+
`OXE Agents: ${registered} agentes ativos. Use @oxe, @oxe-plan, @oxe-execute e outros no chat do Copilot.`,
|
|
299
|
+
'Ver log'
|
|
300
|
+
).then((choice) => {
|
|
301
|
+
if (choice === 'Ver log') outputChannel?.show();
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function deactivate() {
|
|
307
|
+
log('Extensão desativada.');
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
module.exports = { activate, deactivate };
|