@orbitpanel/cli 1.9.0 → 1.11.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.
Files changed (41) hide show
  1. package/dist/lib/ai-chat.js +2 -0
  2. package/dist/lib/ai-chat.js.map +1 -1
  3. package/dist/lib/ai-stream.js +2 -0
  4. package/dist/lib/ai-stream.js.map +1 -1
  5. package/dist/lib/command-router.js +21 -0
  6. package/dist/lib/command-router.js.map +1 -1
  7. package/dist/lib/intelligence/action-executor.d.ts +45 -0
  8. package/dist/lib/intelligence/action-executor.js +77 -0
  9. package/dist/lib/intelligence/action-executor.js.map +1 -0
  10. package/dist/lib/intelligence/action-parser.d.ts +63 -0
  11. package/dist/lib/intelligence/action-parser.js +149 -0
  12. package/dist/lib/intelligence/action-parser.js.map +1 -0
  13. package/dist/lib/intelligence/agent-prompt.d.ts +28 -0
  14. package/dist/lib/intelligence/agent-prompt.js +179 -0
  15. package/dist/lib/intelligence/agent-prompt.js.map +1 -0
  16. package/dist/lib/intelligence/capability-map.d.ts +53 -0
  17. package/dist/lib/intelligence/capability-map.js +266 -0
  18. package/dist/lib/intelligence/capability-map.js.map +1 -0
  19. package/dist/lib/intelligence/chat-enrichment.d.ts +32 -0
  20. package/dist/lib/intelligence/chat-enrichment.js +130 -0
  21. package/dist/lib/intelligence/chat-enrichment.js.map +1 -0
  22. package/dist/lib/intelligence/context-packet.d.ts +157 -0
  23. package/dist/lib/intelligence/context-packet.js +129 -0
  24. package/dist/lib/intelligence/context-packet.js.map +1 -0
  25. package/dist/lib/intelligence/diagnose-wiring.d.ts +20 -0
  26. package/dist/lib/intelligence/diagnose-wiring.js +157 -0
  27. package/dist/lib/intelligence/diagnose-wiring.js.map +1 -0
  28. package/dist/lib/intelligence/diagnose.d.ts +116 -0
  29. package/dist/lib/intelligence/diagnose.js +312 -0
  30. package/dist/lib/intelligence/diagnose.js.map +1 -0
  31. package/dist/lib/intelligence/model-config.d.ts +18 -0
  32. package/dist/lib/intelligence/model-config.js +27 -0
  33. package/dist/lib/intelligence/model-config.js.map +1 -0
  34. package/dist/lib/shell-ink.js +23 -1
  35. package/dist/lib/shell-ink.js.map +1 -1
  36. package/dist/lib/shell-render.js +1 -0
  37. package/dist/lib/shell-render.js.map +1 -1
  38. package/dist/lib/shell.js +62 -3
  39. package/dist/lib/shell.js.map +1 -1
  40. package/oclif.manifest.json +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Chat enrichment — Arricchisce il messaggio utente con contesto CLI.
3
+ *
4
+ * Questo modulo è il punto di integrazione tra il CLI Intelligence Layer
5
+ * e il flusso AI chat esistente. Arricchisce il messaggio inviato al backend
6
+ * con informazioni sul contesto locale che il backend non conosce.
7
+ *
8
+ * NON modifica il system prompt del backend (non ne ha controllo).
9
+ * NON aggiunge dipendenze nuove.
10
+ * NON fa I/O — usa solo dati già disponibili in OrbitStore.
11
+ *
12
+ * Approccio: prefissa il messaggio utente con un blocco di contesto leggero
13
+ * racchiuso in tag XML-like che il backend LLM può leggere ma che non
14
+ * interferiscono con il messaggio dell'utente.
15
+ */
16
+ import { buildContextPacket } from './context-packet.js';
17
+ import { computeSessionStats } from '../session-summary-format.js';
18
+ import { getSetupLevel, getNextStep } from '../info-engine.js';
19
+ /**
20
+ * Costruisce un ContextPacketInput dai dati già presenti in OrbitState.
21
+ * Pure function — nessun I/O, nessun side effect.
22
+ */
23
+ export function buildContextInputFromState(state, cwd) {
24
+ // Derive InfoState (same logic as /info command in command-router.ts)
25
+ let tasksOpen = 0;
26
+ let tasksDone = 0;
27
+ let notesTotal = 0;
28
+ let notesAgent = 0;
29
+ let decisions = 0;
30
+ let sessionLong = false;
31
+ if (state.session) {
32
+ const stats = computeSessionStats(state.session);
33
+ tasksOpen = stats.tasksOpen;
34
+ tasksDone = stats.tasksDone;
35
+ notesTotal = stats.notesTotal;
36
+ notesAgent = stats.notesAgent;
37
+ decisions = stats.decisions;
38
+ const startMs = new Date(state.session.started_at).getTime();
39
+ sessionLong = (Date.now() - startMs) > 2 * 60 * 60 * 1000;
40
+ }
41
+ const infoState = {
42
+ hasToken: !!state.tokenEntry,
43
+ hasSite: !!state.siteLink,
44
+ hasSession: !!state.session,
45
+ hasManifest: !!state.manifest,
46
+ projectName: state.manifest?.name ?? state.siteLink?.name ?? null,
47
+ environment: state.manifest?.environment ?? state.siteLink?.environment ?? null,
48
+ healthLevel: state.contextHealth.level,
49
+ tasksOpen,
50
+ sessionLong,
51
+ tasksDone,
52
+ notesTotal,
53
+ notesAgent,
54
+ decisions,
55
+ };
56
+ return {
57
+ hasToken: !!state.tokenEntry,
58
+ hasSite: !!state.siteLink,
59
+ hasManifest: !!state.manifest,
60
+ projectName: infoState.projectName,
61
+ platform: state.manifest?.platform ?? state.siteLink?.platform ?? null,
62
+ environment: infoState.environment,
63
+ healthLevel: state.contextHealth.level,
64
+ healthIssues: state.contextHealth.issues.map(i => i.message),
65
+ setupLevel: getSetupLevel(infoState),
66
+ nextStep: getNextStep(infoState),
67
+ session: state.session ? {
68
+ id: state.session.id,
69
+ started_at: state.session.started_at,
70
+ notes: state.session.notes,
71
+ } : null,
72
+ gitBranch: state.gitBranch,
73
+ gitDirty: null, // Not available without I/O
74
+ cwd,
75
+ lastError: state.lastError,
76
+ backendReachable: null, // Not verified yet
77
+ mcpServerActive: false,
78
+ };
79
+ }
80
+ /**
81
+ * Formatta un contesto compatto (~150-200 token) da anteporre al messaggio utente.
82
+ * Il formato è un blocco racchiuso in tag che il LLM può leggere.
83
+ */
84
+ export function formatContextPrefix(state, cwd) {
85
+ const input = buildContextInputFromState(state, cwd);
86
+ const packet = buildContextPacket(input);
87
+ const lines = [];
88
+ lines.push('<cli-context>');
89
+ // Project
90
+ const p = packet.project;
91
+ if (p.name) {
92
+ lines.push(`Progetto: ${p.name} (${p.platform ?? '?'}, ${p.environment ?? '?'})`);
93
+ }
94
+ lines.push(`Setup: ${p.setupLevel} | Contesto: ${p.healthLevel}`);
95
+ // Session
96
+ const s = packet.session;
97
+ if (s.active) {
98
+ lines.push(`Sessione attiva: ${s.durationMinutes ?? '?'}min, ${s.counts.notesTotal} note, ${s.counts.tasksOpen} task aperti, ${s.counts.decisions} decisioni`);
99
+ if (s.recentEntries.length > 0) {
100
+ const latest = s.recentEntries[s.recentEntries.length - 1];
101
+ lines.push(`Ultima entry: [${latest.kind}] ${latest.text}`);
102
+ }
103
+ }
104
+ else {
105
+ lines.push('Nessuna sessione attiva');
106
+ }
107
+ // Tech
108
+ if (packet.tech.gitBranch) {
109
+ lines.push(`Branch: ${packet.tech.gitBranch}`);
110
+ }
111
+ // Next step
112
+ lines.push(`Suggerimento: ${p.nextStep.cmd} — ${p.nextStep.reason}`);
113
+ lines.push('</cli-context>');
114
+ return lines.join('\n');
115
+ }
116
+ /**
117
+ * Arricchisce il messaggio utente con il contesto CLI.
118
+ * Se il contesto non è disponibile, ritorna il messaggio originale (fallback).
119
+ */
120
+ export function enrichMessageWithContext(userMessage, state, cwd) {
121
+ try {
122
+ const prefix = formatContextPrefix(state, cwd);
123
+ return `${prefix}\n\n${userMessage}`;
124
+ }
125
+ catch {
126
+ // Fallback: ritorna il messaggio originale senza contesto
127
+ return userMessage;
128
+ }
129
+ }
130
+ //# sourceMappingURL=chat-enrichment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-enrichment.js","sourceRoot":"","sources":["../../../src/lib/intelligence/chat-enrichment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * CLI Context Packet — Snapshot del contesto locale per il CLI Intelligence Layer.
3
+ *
4
+ * Questo è il payload che viene passato al modello LLM ogni volta che
5
+ * il CLI Intelligence Layer deve ragionare sullo stato corrente.
6
+ *
7
+ * PRINCIPI:
8
+ * - Proiezione da OrbitState + SessionSummary + InfoState (nessuna fonte nuova)
9
+ * - Minimale ma sufficiente (~1.5-2K token serializzato)
10
+ * - Stabile: i campi cambiano poco tra invocazioni successive
11
+ * - Nessun dato sensibile (token, credenziali, path assoluti)
12
+ *
13
+ * NON contiene:
14
+ * - Token o credenziali
15
+ * - Testi completi di note/decisioni (solo conteggi e ultime 3)
16
+ * - Stato backend (memory, RAG, audit) — quello è responsabilità del backend
17
+ */
18
+ import type { ContextHealthLevel, NoteKind, NoteSource } from '../../types.js';
19
+ import type { SetupLevel } from '../info-engine.js';
20
+ /** Stato del progetto locale */
21
+ export interface ProjectContext {
22
+ /** Nome del progetto (da manifest o legacy site link) */
23
+ name: string | null;
24
+ /** Piattaforma: wordpress, prestashop, custom */
25
+ platform: string | null;
26
+ /** Ambiente: local, dev, staging, production */
27
+ environment: string | null;
28
+ /** Se il manifest .orbit/project.json è presente */
29
+ hasManifest: boolean;
30
+ /** Livello di maturità configurazione */
31
+ setupLevel: SetupLevel;
32
+ /** Salute del contesto (ok, info, warning, critical) */
33
+ healthLevel: ContextHealthLevel;
34
+ /** Sommario dei problemi di contesto (max 3) */
35
+ healthIssues: string[];
36
+ /** Prossimo passo suggerito dall'info engine */
37
+ nextStep: {
38
+ cmd: string;
39
+ reason: string;
40
+ };
41
+ }
42
+ /** Stato della sessione locale attiva */
43
+ export interface SessionContext {
44
+ /** Se c'è una sessione attiva */
45
+ active: boolean;
46
+ /** ID sessione (abbreviato a 8 char per leggibilità) */
47
+ id: string | null;
48
+ /** Durata in minuti */
49
+ durationMinutes: number | null;
50
+ /** Branch git corrente */
51
+ gitBranch: string | null;
52
+ /** Conteggi */
53
+ counts: {
54
+ notesTotal: number;
55
+ notesUser: number;
56
+ notesAgent: number;
57
+ tasksOpen: number;
58
+ tasksDone: number;
59
+ decisions: number;
60
+ warnings: number;
61
+ };
62
+ /** Ultime 3 entry (testo troncato a 80 char) */
63
+ recentEntries: RecentEntry[];
64
+ /** Se la sessione è lunga (>2h) */
65
+ isLong: boolean;
66
+ }
67
+ /** Entry recente nel diario sessione (leggera) */
68
+ export interface RecentEntry {
69
+ kind: NoteKind;
70
+ source: NoteSource;
71
+ text: string;
72
+ minutesAgo: number;
73
+ }
74
+ /** Capacità disponibili al momento */
75
+ export interface CapabilitiesContext {
76
+ /** Comandi slash disponibili */
77
+ availableCommands: string[];
78
+ /** Se autenticato con token valido */
79
+ authenticated: boolean;
80
+ /** Se il backend è raggiungibile (null = non verificato) */
81
+ backendReachable: boolean | null;
82
+ /** Se il MCP server locale è attivo (solo per info) */
83
+ mcpServerActive: boolean;
84
+ /** Livello di capability corrente */
85
+ capabilityLevel: CapabilityLevel;
86
+ }
87
+ /** Livello di capability basato sullo stato */
88
+ export type CapabilityLevel = 'offline' | 'readonly' | 'local_write' | 'full';
89
+ /** Stato tecnico dell'ambiente */
90
+ export interface TechContext {
91
+ /** Working directory (basename solo, non path completo) */
92
+ cwd: string;
93
+ /** Branch git */
94
+ gitBranch: string | null;
95
+ /** Se ci sono modifiche non committate (null = non verificato) */
96
+ gitDirty: boolean | null;
97
+ /** Ultimo errore transiente (null se nessuno) */
98
+ lastError: string | null;
99
+ }
100
+ /** Context Packet completo */
101
+ export interface ContextPacket {
102
+ /** Versione dello schema (per compatibilità futura) */
103
+ version: 1;
104
+ /** Timestamp di generazione ISO 8601 */
105
+ generatedAt: string;
106
+ /** Stato progetto */
107
+ project: ProjectContext;
108
+ /** Stato sessione */
109
+ session: SessionContext;
110
+ /** Capacità disponibili */
111
+ capabilities: CapabilitiesContext;
112
+ /** Stato tecnico */
113
+ tech: TechContext;
114
+ }
115
+ /** Input per il builder — usa solo strutture già esistenti nella CLI */
116
+ export interface ContextPacketInput {
117
+ /** OrbitState.* fields selezionati */
118
+ hasToken: boolean;
119
+ hasSite: boolean;
120
+ hasManifest: boolean;
121
+ projectName: string | null;
122
+ platform: string | null;
123
+ environment: string | null;
124
+ healthLevel: ContextHealthLevel;
125
+ healthIssues: string[];
126
+ setupLevel: SetupLevel;
127
+ nextStep: {
128
+ cmd: string;
129
+ reason: string;
130
+ };
131
+ /** SessionState o null */
132
+ session: {
133
+ id: string;
134
+ started_at: string;
135
+ notes: Array<{
136
+ text: string;
137
+ timestamp: string;
138
+ kind?: NoteKind;
139
+ source?: NoteSource;
140
+ taskStatus?: 'open' | 'done';
141
+ }>;
142
+ } | null;
143
+ /** Git */
144
+ gitBranch: string | null;
145
+ gitDirty: boolean | null;
146
+ /** Tech */
147
+ cwd: string;
148
+ lastError: string | null;
149
+ /** Capabilities */
150
+ backendReachable: boolean | null;
151
+ mcpServerActive: boolean;
152
+ }
153
+ /**
154
+ * Assembla un ContextPacket da input già disponibili nella CLI.
155
+ * Pure function — nessun side effect, nessuna chiamata I/O.
156
+ */
157
+ export declare function buildContextPacket(input: ContextPacketInput): ContextPacket;
@@ -0,0 +1,129 @@
1
+ /**
2
+ * CLI Context Packet — Snapshot del contesto locale per il CLI Intelligence Layer.
3
+ *
4
+ * Questo è il payload che viene passato al modello LLM ogni volta che
5
+ * il CLI Intelligence Layer deve ragionare sullo stato corrente.
6
+ *
7
+ * PRINCIPI:
8
+ * - Proiezione da OrbitState + SessionSummary + InfoState (nessuna fonte nuova)
9
+ * - Minimale ma sufficiente (~1.5-2K token serializzato)
10
+ * - Stabile: i campi cambiano poco tra invocazioni successive
11
+ * - Nessun dato sensibile (token, credenziali, path assoluti)
12
+ *
13
+ * NON contiene:
14
+ * - Token o credenziali
15
+ * - Testi completi di note/decisioni (solo conteggi e ultime 3)
16
+ * - Stato backend (memory, RAG, audit) — quello è responsabilità del backend
17
+ */
18
+ /**
19
+ * Assembla un ContextPacket da input già disponibili nella CLI.
20
+ * Pure function — nessun side effect, nessuna chiamata I/O.
21
+ */
22
+ export function buildContextPacket(input) {
23
+ const now = new Date();
24
+ // Session counts
25
+ const notes = input.session?.notes ?? [];
26
+ const notesUser = notes.filter(n => !n.source || n.source === 'user').length;
27
+ const notesAgent = notes.filter(n => n.source === 'mcp' || n.source === 'ai').length;
28
+ const tasksOpen = notes.filter(n => n.kind === 'task' && n.taskStatus === 'open').length;
29
+ const tasksDone = notes.filter(n => n.kind === 'task' && n.taskStatus === 'done').length;
30
+ const decisions = notes.filter(n => n.kind === 'decision').length;
31
+ const warnings = notes.filter(n => n.kind === 'warning').length;
32
+ // Duration
33
+ let durationMinutes = null;
34
+ if (input.session?.started_at) {
35
+ const startMs = new Date(input.session.started_at).getTime();
36
+ durationMinutes = Math.round((now.getTime() - startMs) / 60_000);
37
+ }
38
+ // Recent entries (last 3, text truncated)
39
+ const recentEntries = notes
40
+ .slice(-3)
41
+ .map(n => ({
42
+ kind: (n.kind ?? 'note'),
43
+ source: (n.source ?? 'user'),
44
+ text: n.text.length > 80 ? n.text.slice(0, 77) + '...' : n.text,
45
+ minutesAgo: Math.round((now.getTime() - new Date(n.timestamp).getTime()) / 60_000),
46
+ }));
47
+ // Capability level
48
+ let capabilityLevel = 'offline';
49
+ if (input.hasToken && input.backendReachable) {
50
+ capabilityLevel = 'full';
51
+ }
52
+ else if (input.hasToken && input.backendReachable === null) {
53
+ capabilityLevel = 'local_write'; // assume local until verified
54
+ }
55
+ else if (input.hasToken) {
56
+ capabilityLevel = 'local_write';
57
+ }
58
+ else if (input.backendReachable) {
59
+ capabilityLevel = 'readonly';
60
+ }
61
+ // Available commands (based on state)
62
+ const availableCommands = buildAvailableCommands(input);
63
+ return {
64
+ version: 1,
65
+ generatedAt: now.toISOString(),
66
+ project: {
67
+ name: input.projectName,
68
+ platform: input.platform,
69
+ environment: input.environment,
70
+ hasManifest: input.hasManifest,
71
+ setupLevel: input.setupLevel,
72
+ healthLevel: input.healthLevel,
73
+ healthIssues: input.healthIssues.slice(0, 3),
74
+ nextStep: input.nextStep,
75
+ },
76
+ session: {
77
+ active: input.session !== null,
78
+ id: input.session?.id?.slice(0, 8) ?? null,
79
+ durationMinutes,
80
+ gitBranch: input.gitBranch,
81
+ counts: {
82
+ notesTotal: notes.length,
83
+ notesUser,
84
+ notesAgent,
85
+ tasksOpen,
86
+ tasksDone,
87
+ decisions,
88
+ warnings,
89
+ },
90
+ recentEntries,
91
+ isLong: durationMinutes !== null && durationMinutes > 120,
92
+ },
93
+ capabilities: {
94
+ availableCommands,
95
+ authenticated: input.hasToken,
96
+ backendReachable: input.backendReachable,
97
+ mcpServerActive: input.mcpServerActive,
98
+ capabilityLevel,
99
+ },
100
+ tech: {
101
+ cwd: input.cwd.split('/').pop() ?? input.cwd,
102
+ gitBranch: input.gitBranch,
103
+ gitDirty: input.gitDirty,
104
+ lastError: input.lastError,
105
+ },
106
+ };
107
+ }
108
+ /** Comandi disponibili in base allo stato corrente */
109
+ function buildAvailableCommands(input) {
110
+ const cmds = ['/help', '/info', '/context', '/doctor', '/status'];
111
+ if (!input.hasToken) {
112
+ cmds.push('/auth', '/login');
113
+ return cmds;
114
+ }
115
+ cmds.push('/sites', '/link', '/unlink', '/init');
116
+ if (!input.hasSite && !input.hasManifest) {
117
+ return cmds;
118
+ }
119
+ // Site connected
120
+ cmds.push('/list', '/get', '/history');
121
+ if (input.session) {
122
+ cmds.push('/note', '/task add', '/task done', '/decision', '/session end', '/session info', '/report');
123
+ }
124
+ else {
125
+ cmds.push('/session start');
126
+ }
127
+ return cmds;
128
+ }
129
+ //# sourceMappingURL=context-packet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-packet.js","sourceRoot":"","sources":["../../../src/lib/intelligence/context-packet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Diagnose wiring — Collega diagnose.ts al runtime reale della CLI.
3
+ *
4
+ * Responsabilità:
5
+ * - buildDiagnoseInputFromState(): OrbitState → DiagnoseInput
6
+ * - buildRealDiagnoseIO(): crea DiagnoseIO con fetch reali
7
+ * - formatDiagnoseOutput(): DiagnoseReport → stringa formattata per CLI
8
+ */
9
+ import type { OrbitState } from '../../state/types.js';
10
+ import type { DiagnoseInput, DiagnoseIO, DiagnoseReport } from './diagnose.js';
11
+ /** Costruisce DiagnoseInput dai dati in OrbitState. Pure function. */
12
+ export declare function buildDiagnoseInputFromState(state: OrbitState): DiagnoseInput;
13
+ /** Crea un DiagnoseIO reale con fetch HTTP. */
14
+ export declare function buildRealDiagnoseIO(apiUrl: string, token: string): DiagnoseIO;
15
+ export interface DiagnoseOutputOptions {
16
+ /** Se mostrare colori (default: true) */
17
+ colors?: boolean;
18
+ }
19
+ /** Formatta il DiagnoseReport come stringa per output CLI. */
20
+ export declare function formatDiagnoseOutput(report: DiagnoseReport): string;
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Diagnose wiring — Collega diagnose.ts al runtime reale della CLI.
3
+ *
4
+ * Responsabilità:
5
+ * - buildDiagnoseInputFromState(): OrbitState → DiagnoseInput
6
+ * - buildRealDiagnoseIO(): crea DiagnoseIO con fetch reali
7
+ * - formatDiagnoseOutput(): DiagnoseReport → stringa formattata per CLI
8
+ */
9
+ import chalk from 'chalk';
10
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
11
+ // STATE → INPUT ADAPTER
12
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
13
+ /** Costruisce DiagnoseInput dai dati in OrbitState. Pure function. */
14
+ export function buildDiagnoseInputFromState(state) {
15
+ let sessionDurationMinutes = null;
16
+ let tasksOpen = 0;
17
+ if (state.session) {
18
+ const startMs = new Date(state.session.started_at).getTime();
19
+ sessionDurationMinutes = Math.round((Date.now() - startMs) / 60_000);
20
+ tasksOpen = state.session.notes.filter(n => n.kind === 'task' && n.taskStatus === 'open').length;
21
+ }
22
+ return {
23
+ hasToken: !!state.tokenEntry,
24
+ hasSite: !!state.siteLink,
25
+ hasManifest: !!state.manifest,
26
+ healthLevel: state.contextHealth.level,
27
+ healthIssues: state.contextHealth.issues.map(i => i.message),
28
+ hasSession: !!state.session,
29
+ sessionDurationMinutes,
30
+ tasksOpen,
31
+ includeRemoteChecks: !!state.tokenEntry,
32
+ };
33
+ }
34
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
35
+ // REAL I/O ADAPTER
36
+ // ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
37
+ const DIAGNOSE_TIMEOUT_MS = 10_000;
38
+ /** Crea un DiagnoseIO reale con fetch HTTP. */
39
+ export function buildRealDiagnoseIO(apiUrl, token) {
40
+ return {
41
+ async validateToken() {
42
+ const controller = new AbortController();
43
+ const timer = setTimeout(() => controller.abort(), DIAGNOSE_TIMEOUT_MS);
44
+ try {
45
+ const res = await fetch(`${apiUrl}/api/v1/auth/me`, {
46
+ headers: {
47
+ 'Authorization': `Bearer ${token}`,
48
+ 'User-Agent': '@orbitpanel/cli',
49
+ },
50
+ signal: controller.signal,
51
+ });
52
+ if (res.ok) {
53
+ return { valid: true };
54
+ }
55
+ const body = await res.json().catch(() => ({}));
56
+ return { valid: false, error: body.detail ?? `HTTP ${res.status}` };
57
+ }
58
+ catch (err) {
59
+ throw new Error(err instanceof Error ? err.message : 'Network error');
60
+ }
61
+ finally {
62
+ clearTimeout(timer);
63
+ }
64
+ },
65
+ async pingBackend() {
66
+ const controller = new AbortController();
67
+ const timer = setTimeout(() => controller.abort(), DIAGNOSE_TIMEOUT_MS);
68
+ const start = Date.now();
69
+ try {
70
+ const res = await fetch(`${apiUrl}/api/v1/auth/me`, {
71
+ headers: {
72
+ 'Authorization': `Bearer ${token}`,
73
+ 'User-Agent': '@orbitpanel/cli',
74
+ },
75
+ signal: controller.signal,
76
+ });
77
+ const latencyMs = Date.now() - start;
78
+ return { reachable: res.status !== 0, latencyMs };
79
+ }
80
+ catch (err) {
81
+ return {
82
+ reachable: false,
83
+ latencyMs: Date.now() - start,
84
+ error: err instanceof Error ? err.message : 'timeout',
85
+ };
86
+ }
87
+ finally {
88
+ clearTimeout(timer);
89
+ }
90
+ },
91
+ async getGitBranch() {
92
+ try {
93
+ const { execSync } = await import('node:child_process');
94
+ return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim() || null;
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ },
100
+ async getGitDirty() {
101
+ try {
102
+ const { execSync } = await import('node:child_process');
103
+ const output = execSync('git status --porcelain', { encoding: 'utf-8' }).trim();
104
+ return output.length > 0;
105
+ }
106
+ catch {
107
+ return null;
108
+ }
109
+ },
110
+ };
111
+ }
112
+ const STATUS_ICONS = {
113
+ pass: chalk.green('PASS'),
114
+ warn: chalk.yellow('WARN'),
115
+ fail: chalk.red('FAIL'),
116
+ skip: chalk.dim('SKIP'),
117
+ };
118
+ const CHECK_ICONS = {
119
+ pass: chalk.green('✓'),
120
+ warn: chalk.yellow('⚠'),
121
+ fail: chalk.red('✗'),
122
+ skip: chalk.dim('○'),
123
+ };
124
+ /** Formatta il DiagnoseReport come stringa per output CLI. */
125
+ export function formatDiagnoseOutput(report) {
126
+ const lines = [];
127
+ // Header
128
+ const overallIcon = STATUS_ICONS[report.overallStatus] ?? report.overallStatus;
129
+ lines.push('');
130
+ lines.push(` ${chalk.bold.rgb(37, 99, 235)('Diagnostica')} ${overallIcon} ${chalk.dim(`(${report.totalDurationMs}ms)`)}`);
131
+ lines.push('');
132
+ // Checks
133
+ for (const check of report.checks) {
134
+ const icon = CHECK_ICONS[check.status] ?? '?';
135
+ const scopeTag = check.scope === 'remote' ? chalk.dim(' [remoto]') : '';
136
+ lines.push(` ${icon} ${chalk.white(check.label)}${scopeTag}`);
137
+ lines.push(` ${chalk.dim(check.detail)}`);
138
+ }
139
+ // Suggestions
140
+ if (report.suggestions.length > 0) {
141
+ lines.push('');
142
+ lines.push(` ${chalk.bold.rgb(37, 99, 235)('Suggerimenti:')}`);
143
+ for (const s of report.suggestions) {
144
+ const priority = s.priority === 'high' ? chalk.red('!') : s.priority === 'medium' ? chalk.yellow('!') : chalk.dim('i');
145
+ const cmd = s.command ? ` ${chalk.cyan(s.command)}` : '';
146
+ const taskHint = s.proposeTask ? chalk.dim(' (consiglio: crea un task)') : '';
147
+ lines.push(` ${priority} ${s.text}${cmd}${taskHint}`);
148
+ }
149
+ }
150
+ else if (report.overallStatus === 'pass') {
151
+ lines.push('');
152
+ lines.push(` ${chalk.green('✓')} ${chalk.dim('Nessun problema rilevato. Tutto ok.')}`);
153
+ }
154
+ lines.push('');
155
+ return lines.join('\n');
156
+ }
157
+ //# sourceMappingURL=diagnose-wiring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose-wiring.js","sourceRoot":"","sources":["../../../src/lib/intelligence/diagnose-wiring.ts"],"names":[],"mappings":"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"}