@tacuchi/agent-workflow-cli 22.4.2 → 23.0.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/README.md +2 -2
- package/dist/adapters/git-cli.js +59 -17
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/adapters/node-file-system.js +55 -1
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/artifacts-service.js +2 -2
- package/dist/application/artifacts-service.js.map +1 -1
- package/dist/application/capability/dispatcher.js +2 -2
- package/dist/application/capability/dispatcher.js.map +1 -1
- package/dist/application/capability/installed-inventory.js +2 -2
- package/dist/application/capability/installed-inventory.js.map +1 -1
- package/dist/application/capability/readiness.js +1 -1
- package/dist/application/capability/readiness.js.map +1 -1
- package/dist/application/check-branch-service.js +2 -2
- package/dist/application/check-branch-service.js.map +1 -1
- package/dist/application/checkpoint/files-touched.js +271 -0
- package/dist/application/checkpoint/files-touched.js.map +1 -0
- package/dist/application/checkpoint/markdown.js +61 -8
- package/dist/application/checkpoint/markdown.js.map +1 -1
- package/dist/application/checkpoint/state-reader.js +8 -2
- package/dist/application/checkpoint/state-reader.js.map +1 -1
- package/dist/application/checkpoint-write-service.js +16 -5
- package/dist/application/checkpoint-write-service.js.map +1 -1
- package/dist/application/claims-ledger.js +330 -0
- package/dist/application/claims-ledger.js.map +1 -0
- package/dist/application/claims-recovery.js +338 -0
- package/dist/application/claims-recovery.js.map +1 -0
- package/dist/application/dev-only-services.js +154 -44
- package/dist/application/dev-only-services.js.map +1 -1
- package/dist/application/elicitation-server.js +382 -0
- package/dist/application/elicitation-server.js.map +1 -0
- package/dist/application/elicitation-stdio.js +48 -0
- package/dist/application/elicitation-stdio.js.map +1 -0
- package/dist/application/flow/advance.js +86 -5
- package/dist/application/flow/advance.js.map +1 -1
- package/dist/application/flow/checkout-observation.js +152 -0
- package/dist/application/flow/checkout-observation.js.map +1 -0
- package/dist/application/flow/flow-service.js +72 -13
- package/dist/application/flow/flow-service.js.map +1 -1
- package/dist/application/flow/internal-actions.js +460 -1
- package/dist/application/flow/internal-actions.js.map +1 -1
- package/dist/application/flow/internal-drive.js +22 -9
- package/dist/application/flow/internal-drive.js.map +1 -1
- package/dist/application/flow/prove.js +205 -0
- package/dist/application/flow/prove.js.map +1 -0
- package/dist/application/flow/run-journey.js +15 -0
- package/dist/application/flow/run-journey.js.map +1 -0
- package/dist/application/flow/run-projection.js +15 -3
- package/dist/application/flow/run-projection.js.map +1 -1
- package/dist/application/flow/run-state-service.js +19 -4
- package/dist/application/flow/run-state-service.js.map +1 -1
- package/dist/application/flow/submit.js +250 -72
- package/dist/application/flow/submit.js.map +1 -1
- package/dist/application/generate-launch-service.js +4 -4
- package/dist/application/generate-launch-service.js.map +1 -1
- package/dist/application/git-flow-service.js +9 -0
- package/dist/application/git-flow-service.js.map +1 -1
- package/dist/application/local-proposal.js +9 -0
- package/dist/application/local-proposal.js.map +1 -1
- package/dist/application/lock-service.js +6 -3
- package/dist/application/lock-service.js.map +1 -1
- package/dist/application/mcp-doctor-service.js.map +1 -1
- package/dist/application/mcp-host-reader.js +30 -13
- package/dist/application/mcp-host-reader.js.map +1 -1
- package/dist/application/mcp-host-writer.js +136 -112
- package/dist/application/mcp-host-writer.js.map +1 -1
- package/dist/application/mcp-remove-service.js +7 -3
- package/dist/application/mcp-remove-service.js.map +1 -1
- package/dist/application/mcp-scope-common.js +1 -3
- package/dist/application/mcp-scope-common.js.map +1 -1
- package/dist/application/mcp-setup-service.js +7 -3
- package/dist/application/mcp-setup-service.js.map +1 -1
- package/dist/application/merge-state-service.js +10 -16
- package/dist/application/merge-state-service.js.map +1 -1
- package/dist/application/multiroot/claude.js +34 -15
- package/dist/application/multiroot/claude.js.map +1 -1
- package/dist/application/multiroot/codex.js +9 -5
- package/dist/application/multiroot/codex.js.map +1 -1
- package/dist/application/multiroot-service.js +20 -11
- package/dist/application/multiroot-service.js.map +1 -1
- package/dist/application/parsers/project-block.js +25 -2
- package/dist/application/parsers/project-block.js.map +1 -1
- package/dist/application/paths-service.js +30 -31
- package/dist/application/paths-service.js.map +1 -1
- package/dist/application/plan-exec-batch-service.js +549 -0
- package/dist/application/plan-exec-batch-service.js.map +1 -0
- package/dist/application/plan-exec-decision-service.js +273 -0
- package/dist/application/plan-exec-decision-service.js.map +1 -0
- package/dist/application/project-md-service.js +2 -2
- package/dist/application/project-md-service.js.map +1 -1
- package/dist/application/project-md-upsert-service.js +4 -4
- package/dist/application/project-md-upsert-service.js.map +1 -1
- package/dist/application/project-tab-data.js +12 -7
- package/dist/application/project-tab-data.js.map +1 -1
- package/dist/application/release-data-service.js +2 -2
- package/dist/application/release-data-service.js.map +1 -1
- package/dist/application/resume-service.js +32 -11
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/retirement/apply.js +84 -0
- package/dist/application/retirement/apply.js.map +1 -1
- package/dist/application/retirement/attribution.js +31 -1
- package/dist/application/retirement/attribution.js.map +1 -1
- package/dist/application/retirement/graph.js +19 -1
- package/dist/application/retirement/graph.js.map +1 -1
- package/dist/application/retirement/journal.js +11 -0
- package/dist/application/retirement/journal.js.map +1 -1
- package/dist/application/retirement/prepare.js +89 -3
- package/dist/application/retirement/prepare.js.map +1 -1
- package/dist/application/retirement/preview.js +16 -0
- package/dist/application/retirement/preview.js.map +1 -1
- package/dist/application/retirement/resolve.js +65 -0
- package/dist/application/retirement/resolve.js.map +1 -1
- package/dist/application/self/host-states.js +2 -0
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-skill.js +53 -19
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/mcp-config.js +28 -30
- package/dist/application/self/mcp-config.js.map +1 -1
- package/dist/application/self/mcp-offer.js +96 -0
- package/dist/application/self/mcp-offer.js.map +1 -0
- package/dist/application/self/mcp-via-state.js +59 -0
- package/dist/application/self/mcp-via-state.js.map +1 -0
- package/dist/application/self/uninstall-skill.js +18 -3
- package/dist/application/self/uninstall-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +37 -8
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/session-close-service.js +24 -1
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/session-create-service.js +7 -0
- package/dist/application/session-create-service.js.map +1 -1
- package/dist/application/session-resume-service.js +2 -2
- package/dist/application/session-resume-service.js.map +1 -1
- package/dist/application/sessions-service.js +2 -4
- package/dist/application/sessions-service.js.map +1 -1
- package/dist/application/skills-resolver-service.js +4 -4
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/source-boundary-policy.js +18 -7
- package/dist/application/source-boundary-policy.js.map +1 -1
- package/dist/application/source-remove-service.js +12 -1
- package/dist/application/source-remove-service.js.map +1 -1
- package/dist/application/sources-service.js +2 -2
- package/dist/application/sources-service.js.map +1 -1
- package/dist/application/status-service.js +4 -0
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/visibility-doctor-service.js +1 -1
- package/dist/application/visibility-doctor-service.js.map +1 -1
- package/dist/application/workline-index-service.js +182 -27
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-init-service.js +85 -265
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/application/workspace-materialization-service.js +300 -0
- package/dist/application/workspace-materialization-service.js.map +1 -0
- package/dist/application/worktree-service.js +32 -3
- package/dist/application/worktree-service.js.map +1 -1
- package/dist/cli/commands/capability.js +4 -7
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/claims.js +72 -0
- package/dist/cli/commands/claims.js.map +1 -0
- package/dist/cli/commands/dev-only.js +73 -25
- package/dist/cli/commands/dev-only.js.map +1 -1
- package/dist/cli/commands/flow.js +145 -42
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/mcp.js +124 -35
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/multiroot.js +40 -7
- package/dist/cli/commands/multiroot.js.map +1 -1
- package/dist/cli/commands/resume.js +9 -3
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/retirement.js +9 -0
- package/dist/cli/commands/retirement.js.map +1 -1
- package/dist/cli/commands/session-create.js +1 -1
- package/dist/cli/commands/session-create.js.map +1 -1
- package/dist/cli/commands/skills.js +1 -1
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/status.js +72 -24
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/workspace-init.js +5 -5
- package/dist/cli/commands/workspace-init.js.map +1 -1
- package/dist/cli/help-groups.js +5 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +112 -39
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.js +3 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/app.js +3 -2
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/components/host-admin-section.js +46 -2
- package/dist/cli/tui/components/host-admin-section.js.map +1 -1
- package/dist/cli/tui/components/workspace-init-form.js +7 -7
- package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +2 -2
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/config-tab.js +4 -3
- package/dist/cli/tui/tabs/config-tab.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab-helpers.js +1 -1
- package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.js +18 -21
- package/dist/cli/tui/tabs/project-tab.js.map +1 -1
- package/dist/cli/tui/workspace-root.js +13 -0
- package/dist/cli/tui/workspace-root.js.map +1 -0
- package/dist/domain/capability/protocol.js +2 -2
- package/dist/domain/capability/protocol.js.map +1 -1
- package/dist/domain/degradation-notice.js +60 -0
- package/dist/domain/degradation-notice.js.map +1 -0
- package/dist/domain/elicitation.js +152 -0
- package/dist/domain/elicitation.js.map +1 -0
- package/dist/domain/flow/answer.js +173 -42
- package/dist/domain/flow/answer.js.map +1 -1
- package/dist/domain/flow/authority.js +180 -127
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/flow/directive.js +47 -1
- package/dist/domain/flow/directive.js.map +1 -1
- package/dist/domain/flow/rules.js +7 -4
- package/dist/domain/flow/rules.js.map +1 -1
- package/dist/domain/flow/run-state.js +636 -31
- package/dist/domain/flow/run-state.js.map +1 -1
- package/dist/domain/harnesses.js +16 -0
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/mcp-entry.js +36 -14
- package/dist/domain/mcp-entry.js.map +1 -1
- package/dist/domain/retirement/proposal.js +1 -0
- package/dist/domain/retirement/proposal.js.map +1 -1
- package/dist/domain/structured-choice-stamp.js +32 -4
- package/dist/domain/structured-choice-stamp.js.map +1 -1
- package/dist/domain/workline-mcp-entry.js +37 -0
- package/dist/domain/workline-mcp-entry.js.map +1 -0
- package/dist/runtime/namespace-resolver.js +104 -18
- package/dist/runtime/namespace-resolver.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/README.md +2 -2
- package/skills/w/SKILL.md +9 -10
- package/skills/w/artifacts/README.md +1 -1
- package/skills/w/commands/README.md +3 -3
- package/skills/w/commands/persist.md +3 -1
- package/skills/w/commands/resume.md +1 -1
- package/skills/w/commands/spec-new.md +2 -2
- package/skills/w/commands/status.md +1 -1
- package/skills/w/commands/workspace-init.md +9 -10
- package/skills/w/context/MANIFEST.json +1 -4
- package/skills/w/harness/HARNESS.md +1 -1
- package/skills/w/loops/quick-loop/LOOP.md +1 -1
- package/skills/w/modules/PROMPT-CONTINUITY.md +1 -1
- package/skills/w/modules/WORKSPACE-SCAFFOLD.md +17 -20
- package/skills/w/schemas/capability-descriptor.schema.json +1 -1
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El servidor propio de Workline: la pieza que convierte una frontera humana en un
|
|
3
|
+
* selector nativo del host.
|
|
4
|
+
*
|
|
5
|
+
* Cómo funciona, y por qué así: el agente llama una herramienta de ESTE servidor
|
|
6
|
+
* con el contenido de la frontera; el servidor le pide la elección al cliente del
|
|
7
|
+
* host por `elicitation/create`, que es protocolo estándar y no un campo interno
|
|
8
|
+
* de nadie; el cliente renderiza su selector; y la elección vuelve como resultado
|
|
9
|
+
* de la herramienta, para que el agente la ponga en el mismo campo del sobre que
|
|
10
|
+
* usa cualquier otra vía. No hay canal paralelo y el protocolo del recorrido no
|
|
11
|
+
* cambia: el motor sigue recibiendo una elección por donde siempre.
|
|
12
|
+
*
|
|
13
|
+
* No habla de transporte. Recibe un `send` y un reloj, así que la misma pieza se
|
|
14
|
+
* maneja desde una entrada y salida reales o desde un cliente falso guionado —
|
|
15
|
+
* que es lo que permite fijar por prueba local un comportamiento cuyo renderizado
|
|
16
|
+
* sólo ocurre dentro de la interfaz interactiva del host.
|
|
17
|
+
*/
|
|
18
|
+
import { degradationNotice, renderLabeledMarkdown } from "../domain/degradation-notice.js";
|
|
19
|
+
import { classifyElicitationReply, elicitationRequestsFor, isFlowControl, orderedOptions, } from "../domain/elicitation.js";
|
|
20
|
+
export const SERVER_NAME = "agent-workflow";
|
|
21
|
+
export const TOOL_NAME = "structured_choice";
|
|
22
|
+
/** Esta implementación habla deliberadamente el lifecycle legacy. */
|
|
23
|
+
const LEGACY_PROTOCOL = "2025-06-18";
|
|
24
|
+
export function createElicitationServer(deps) {
|
|
25
|
+
let pending = null;
|
|
26
|
+
let elicitCounter = 0;
|
|
27
|
+
let lifecycle = "new";
|
|
28
|
+
let clientSupportsElicitation = false;
|
|
29
|
+
function reply(id, result) {
|
|
30
|
+
deps.send({ jsonrpc: "2.0", id, result });
|
|
31
|
+
}
|
|
32
|
+
function replyError(id, code, message) {
|
|
33
|
+
if (id === undefined)
|
|
34
|
+
return;
|
|
35
|
+
deps.send({ jsonrpc: "2.0", id, error: { code, message } });
|
|
36
|
+
}
|
|
37
|
+
function finish(outcome, stoppedAt) {
|
|
38
|
+
if (pending === null)
|
|
39
|
+
return;
|
|
40
|
+
const notice = outcome === "chosen" ? "" : degradationNotice(outcome);
|
|
41
|
+
const result = {
|
|
42
|
+
outcome,
|
|
43
|
+
answers: pending.answers,
|
|
44
|
+
...(stoppedAt === undefined ? {} : { stopped_at: stoppedAt }),
|
|
45
|
+
...(notice === ""
|
|
46
|
+
? {}
|
|
47
|
+
: {
|
|
48
|
+
notice,
|
|
49
|
+
// Sólo las que quedaron sin contestar: repetir las ya resueltas le
|
|
50
|
+
// pediría a la persona que decida dos veces lo mismo.
|
|
51
|
+
fallback_markdown: renderLabeledMarkdown(pending.questions.slice(pending.index)),
|
|
52
|
+
}),
|
|
53
|
+
};
|
|
54
|
+
const toolCallId = pending.toolCallId;
|
|
55
|
+
pending = null;
|
|
56
|
+
// El texto ES el JSON: el agente lo lee para poner la elección en el sobre, y
|
|
57
|
+
// una prosa alrededor sería una segunda forma del mismo dato que puede diferir.
|
|
58
|
+
reply(toolCallId, { content: [{ type: "text", text: JSON.stringify(result) }] });
|
|
59
|
+
}
|
|
60
|
+
function ask() {
|
|
61
|
+
if (pending === null)
|
|
62
|
+
return;
|
|
63
|
+
const request = pending.requests[pending.index];
|
|
64
|
+
if (request === undefined) {
|
|
65
|
+
finish("chosen");
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
elicitCounter += 1;
|
|
69
|
+
pending.elicitId = `aw-elicit-${elicitCounter}`;
|
|
70
|
+
deps.send({
|
|
71
|
+
jsonrpc: "2.0",
|
|
72
|
+
id: pending.elicitId,
|
|
73
|
+
method: "elicitation/create",
|
|
74
|
+
params: request,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function onElicitationReply(message) {
|
|
78
|
+
if (pending === null)
|
|
79
|
+
return;
|
|
80
|
+
const question = pending.questions[pending.index];
|
|
81
|
+
const header = question?.header ?? "";
|
|
82
|
+
const validChoices = question === undefined ? [] : orderedOptions(question).map((option) => option.label);
|
|
83
|
+
const outcome = classifyElicitationReply(message.result ?? message.error ?? null, validChoices);
|
|
84
|
+
if (outcome.kind !== "chosen") {
|
|
85
|
+
// Ninguna de estas avanza la frontera. Lo que cambia entre ellas es qué se
|
|
86
|
+
// le dice a la persona, y por eso vuelven distinguidas en vez de colapsadas.
|
|
87
|
+
finish(outcome.kind, header);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const flow = isFlowControl(outcome.choice);
|
|
91
|
+
pending.answers.push({
|
|
92
|
+
header,
|
|
93
|
+
choice: outcome.choice,
|
|
94
|
+
free: outcome.free,
|
|
95
|
+
flow_control: flow,
|
|
96
|
+
});
|
|
97
|
+
// Pausar o cerrar corta acá: seguir preguntando después de que alguien pidió
|
|
98
|
+
// pausar es no haberle ofrecido pausar.
|
|
99
|
+
if (flow) {
|
|
100
|
+
finish("chosen", header);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
pending.index += 1;
|
|
104
|
+
ask();
|
|
105
|
+
}
|
|
106
|
+
/** Un rechazo con forma de resultado: el cliente recibe respuesta, nunca silencio. */
|
|
107
|
+
function refuse(id, text) {
|
|
108
|
+
reply(id, { isError: true, content: [{ type: "text", text }] });
|
|
109
|
+
}
|
|
110
|
+
function start(id, args) {
|
|
111
|
+
// Una segunda llamada mientras la primera espera dejaría a ESA primera sin
|
|
112
|
+
// respuesta para siempre: el cliente se queda colgado, que es el peor modo de
|
|
113
|
+
// fallo que puede tener un servidor. Se rechaza la nueva y la vigente sigue.
|
|
114
|
+
if (pending !== null) {
|
|
115
|
+
refuse(id, "structured_choice ya está presentando una frontera: contestá esa primero.");
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const parsed = parseQuestions(args);
|
|
119
|
+
if (!parsed.ok) {
|
|
120
|
+
refuse(id, parsed.error);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const questions = parsed.questions;
|
|
124
|
+
pending = {
|
|
125
|
+
toolCallId: id,
|
|
126
|
+
questions,
|
|
127
|
+
requests: elicitationRequestsFor(questions),
|
|
128
|
+
index: 0,
|
|
129
|
+
answers: [],
|
|
130
|
+
elicitId: "",
|
|
131
|
+
};
|
|
132
|
+
ask();
|
|
133
|
+
}
|
|
134
|
+
function replyInitialize(msg) {
|
|
135
|
+
const params = isRecord(msg.params) ? msg.params : {};
|
|
136
|
+
const capabilities = isRecord(params.capabilities) ? params.capabilities : {};
|
|
137
|
+
clientSupportsElicitation = isRecord(capabilities.elicitation);
|
|
138
|
+
lifecycle = "awaiting-initialized";
|
|
139
|
+
reply(msg.id, {
|
|
140
|
+
protocolVersion: LEGACY_PROTOCOL,
|
|
141
|
+
capabilities: { tools: {} },
|
|
142
|
+
serverInfo: { name: SERVER_NAME, version: "1" },
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/** Un método conocido, con lifecycle legacy explícito. */
|
|
146
|
+
function dispatch(method, msg) {
|
|
147
|
+
const lifecycleResult = handleLifecycle(method, msg);
|
|
148
|
+
if (lifecycleResult !== null)
|
|
149
|
+
return lifecycleResult;
|
|
150
|
+
if (requiresInitializedLifecycle(method) && lifecycle !== "ready") {
|
|
151
|
+
replyError(msg.id, -32002, "Server not initialized");
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
if (method === "tools/list") {
|
|
155
|
+
reply(msg.id, { tools: [TOOL_DESCRIPTOR] });
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
if (method === "tools/call")
|
|
159
|
+
return dispatchToolCall(msg);
|
|
160
|
+
return answerUnknownRequest(msg);
|
|
161
|
+
}
|
|
162
|
+
function handleLifecycle(method, msg) {
|
|
163
|
+
if (method === "initialize")
|
|
164
|
+
return handleInitialize(msg);
|
|
165
|
+
if (method === "notifications/initialized") {
|
|
166
|
+
if (lifecycle === "awaiting-initialized")
|
|
167
|
+
lifecycle = "ready";
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
// El SDK dual-era intenta este método antes de probar el lifecycle legacy.
|
|
171
|
+
// Responder method-not-found es el fallback pactado, no un vacío ambiguo.
|
|
172
|
+
if (method === "server/discover") {
|
|
173
|
+
replyError(msg.id, -32601, "Method not found");
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
function handleInitialize(msg) {
|
|
179
|
+
if (lifecycle === "new") {
|
|
180
|
+
replyInitialize(msg);
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
replyError(msg.id, -32600, "initialize sólo puede llamarse una vez por sesión");
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
function dispatchToolCall(msg) {
|
|
187
|
+
const params = isRecord(msg.params) ? msg.params : {};
|
|
188
|
+
// Una herramienta que no es la nuestra igual se CONTESTA: devolver `false`
|
|
189
|
+
// dejaba la llamada sin respuesta, y un cliente esperándola no reintenta.
|
|
190
|
+
if (params.name !== TOOL_NAME) {
|
|
191
|
+
refuse(msg.id, `este servidor sólo expone ${TOOL_NAME}`);
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
if (!clientSupportsElicitation) {
|
|
195
|
+
refuse(msg.id, "el cliente MCP no negoció la capability elicitation; no se puede solicitar un selector.");
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
if (!deps.via.available) {
|
|
199
|
+
refuse(msg.id, "este host no declara una vía MCP de elicitation disponible.");
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
start(msg.id, params.arguments);
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
function answerUnknownRequest(msg) {
|
|
206
|
+
// Cualquier otra petición con id se contesta vacía en vez de dejarse colgada:
|
|
207
|
+
// un cliente esperando una respuesta que nunca llega es peor que una vacía.
|
|
208
|
+
if (msg.id !== undefined) {
|
|
209
|
+
reply(msg.id, {});
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
function requiresInitializedLifecycle(method) {
|
|
215
|
+
return method === "tools/list" || method === "tools/call";
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
handle(message) {
|
|
219
|
+
if (message === null || typeof message !== "object")
|
|
220
|
+
return false;
|
|
221
|
+
const msg = message;
|
|
222
|
+
if (pending !== null && msg.id === pending.elicitId) {
|
|
223
|
+
onElicitationReply(msg);
|
|
224
|
+
return true;
|
|
225
|
+
}
|
|
226
|
+
const method = typeof msg.method === "string" ? msg.method : null;
|
|
227
|
+
return method === null ? false : dispatch(method, msg);
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const TOOL_DESCRIPTOR = {
|
|
232
|
+
name: TOOL_NAME,
|
|
233
|
+
description: "Presenta una frontera humana con el selector nativo de este host y devuelve la elección de la persona. Usala cuando la herramienta de preguntas del propio host no figure entre las de este turno.",
|
|
234
|
+
inputSchema: {
|
|
235
|
+
type: "object",
|
|
236
|
+
required: ["questions"],
|
|
237
|
+
properties: {
|
|
238
|
+
questions: {
|
|
239
|
+
type: "array",
|
|
240
|
+
description: "Hasta 3 preguntas de contenido. El control de flujo lo agrega el servidor.",
|
|
241
|
+
minItems: 1,
|
|
242
|
+
maxItems: 3,
|
|
243
|
+
items: {
|
|
244
|
+
type: "object",
|
|
245
|
+
required: ["header", "question", "options"],
|
|
246
|
+
properties: {
|
|
247
|
+
header: { type: "string", minLength: 1, description: "Rótulo corto de la pregunta." },
|
|
248
|
+
question: { type: "string", minLength: 1 },
|
|
249
|
+
options: {
|
|
250
|
+
type: "array",
|
|
251
|
+
minItems: 2,
|
|
252
|
+
maxItems: 3,
|
|
253
|
+
items: {
|
|
254
|
+
type: "object",
|
|
255
|
+
required: ["label", "consequence"],
|
|
256
|
+
properties: {
|
|
257
|
+
label: { type: "string", minLength: 1 },
|
|
258
|
+
consequence: {
|
|
259
|
+
type: "string",
|
|
260
|
+
minLength: 1,
|
|
261
|
+
description: "Qué pasa si se elige. Viaja siempre con la alternativa.",
|
|
262
|
+
},
|
|
263
|
+
recommended: { type: "boolean" },
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
/**
|
|
274
|
+
* Valida la entrada entera antes de emitir la primera solicitud. No filtra una
|
|
275
|
+
* pregunta u opción inválida para luego seguir con lo que quedó: perder una
|
|
276
|
+
* alternativa cambiaría la frontera que el agente creyó haber enviado.
|
|
277
|
+
*/
|
|
278
|
+
function parseQuestions(args) {
|
|
279
|
+
if (!isRecord(args)) {
|
|
280
|
+
return { ok: false, error: "structured_choice necesita un objeto con questions." };
|
|
281
|
+
}
|
|
282
|
+
const raw = args.questions;
|
|
283
|
+
if (!Array.isArray(raw) || raw.length < 1 || raw.length > 3) {
|
|
284
|
+
return { ok: false, error: "structured_choice requiere entre 1 y 3 preguntas." };
|
|
285
|
+
}
|
|
286
|
+
const questions = [];
|
|
287
|
+
for (const [questionIndex, item] of raw.entries()) {
|
|
288
|
+
const parsed = parseQuestion(item, questionIndex + 1);
|
|
289
|
+
if (!parsed.ok)
|
|
290
|
+
return parsed;
|
|
291
|
+
questions.push(parsed.question);
|
|
292
|
+
}
|
|
293
|
+
return { ok: true, questions };
|
|
294
|
+
}
|
|
295
|
+
function parseQuestion(raw, position) {
|
|
296
|
+
if (!isRecord(raw))
|
|
297
|
+
return { ok: false, error: `La pregunta ${position} debe ser un objeto.` };
|
|
298
|
+
const header = nonEmptyString(raw.header);
|
|
299
|
+
const question = nonEmptyString(raw.question);
|
|
300
|
+
if (header === null || question === null) {
|
|
301
|
+
return { ok: false, error: `La pregunta ${position} necesita header y question no vacíos.` };
|
|
302
|
+
}
|
|
303
|
+
const options = parseOptions(raw.options, position);
|
|
304
|
+
if (!options.ok)
|
|
305
|
+
return options;
|
|
306
|
+
return { ok: true, question: { header, question, options: options.options } };
|
|
307
|
+
}
|
|
308
|
+
function parseOptions(raw, questionPosition) {
|
|
309
|
+
if (!Array.isArray(raw) || raw.length < 2 || raw.length > 3) {
|
|
310
|
+
return {
|
|
311
|
+
ok: false,
|
|
312
|
+
error: `La pregunta ${questionPosition} requiere entre 2 y 3 alternativas de contenido.`,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
const labels = new Set();
|
|
316
|
+
const options = [];
|
|
317
|
+
let recommendations = 0;
|
|
318
|
+
for (const [optionIndex, rawOption] of raw.entries()) {
|
|
319
|
+
const parsed = parseOption(rawOption, questionPosition, optionIndex + 1);
|
|
320
|
+
if (!parsed.ok)
|
|
321
|
+
return parsed;
|
|
322
|
+
if (labels.has(parsed.option.label)) {
|
|
323
|
+
return {
|
|
324
|
+
ok: false,
|
|
325
|
+
error: `La alternativa '${parsed.option.label}' se repite en la pregunta ${questionPosition}.`,
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
labels.add(parsed.option.label);
|
|
329
|
+
if (parsed.option.recommended === true)
|
|
330
|
+
recommendations += 1;
|
|
331
|
+
options.push(parsed.option);
|
|
332
|
+
}
|
|
333
|
+
if (recommendations !== 1) {
|
|
334
|
+
return {
|
|
335
|
+
ok: false,
|
|
336
|
+
error: `La pregunta ${questionPosition} debe tener exactamente una alternativa recomendada.`,
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
return { ok: true, options };
|
|
340
|
+
}
|
|
341
|
+
function parseOption(raw, questionPosition, optionPosition) {
|
|
342
|
+
if (!isRecord(raw)) {
|
|
343
|
+
return {
|
|
344
|
+
ok: false,
|
|
345
|
+
error: `La alternativa ${optionPosition} de la pregunta ${questionPosition} debe ser un objeto.`,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
const label = nonEmptyString(raw.label);
|
|
349
|
+
const consequence = nonEmptyString(raw.consequence);
|
|
350
|
+
if (label === null || consequence === null) {
|
|
351
|
+
return {
|
|
352
|
+
ok: false,
|
|
353
|
+
error: `La alternativa ${optionPosition} de la pregunta ${questionPosition} necesita label y consequence no vacíos.`,
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
if (isFlowControl(label)) {
|
|
357
|
+
return {
|
|
358
|
+
ok: false,
|
|
359
|
+
error: `La alternativa '${label}' de la pregunta ${questionPosition} está reservada para control de flujo.`,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
if (raw.recommended !== undefined && typeof raw.recommended !== "boolean") {
|
|
363
|
+
return {
|
|
364
|
+
ok: false,
|
|
365
|
+
error: `recommended de la alternativa ${optionPosition} de la pregunta ${questionPosition} debe ser booleano.`,
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
return {
|
|
369
|
+
ok: true,
|
|
370
|
+
option: { label, consequence, ...(raw.recommended === true ? { recommended: true } : {}) },
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
function isRecord(value) {
|
|
374
|
+
return value !== null && typeof value === "object";
|
|
375
|
+
}
|
|
376
|
+
function nonEmptyString(value) {
|
|
377
|
+
if (typeof value !== "string")
|
|
378
|
+
return null;
|
|
379
|
+
const trimmed = value.trim();
|
|
380
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=elicitation-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicitation-server.js","sourceRoot":"","sources":["../../src/application/elicitation-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* El servidor de elicitation, atado a una entrada y una salida reales.
|
|
3
|
+
*
|
|
4
|
+
* Separado del servidor por la misma razón por la que el lanzador de dbhub separa
|
|
5
|
+
* banner de protocolo: **la salida estándar ES el canal JSON-RPC**, y una sola
|
|
6
|
+
* línea de diagnóstico ahí corrompe la sesión de cualquier cliente MCP. Acá viven
|
|
7
|
+
* el troceado por líneas y esa regla; la lógica no sabe de transporte y por eso se
|
|
8
|
+
* puede manejar desde una prueba con un cliente falso.
|
|
9
|
+
*/
|
|
10
|
+
import { createElicitationServer } from "./elicitation-server.js";
|
|
11
|
+
/**
|
|
12
|
+
* Corre hasta que la entrada se cierra, que es como un host termina a su servidor.
|
|
13
|
+
*
|
|
14
|
+
* Una línea que no parsea se reporta por diagnóstico y se descarta: cortar la
|
|
15
|
+
* sesión entera por un mensaje suelto dejaría al host sin servidor por un byte.
|
|
16
|
+
*/
|
|
17
|
+
export function runElicitationStdio(deps) {
|
|
18
|
+
const server = createElicitationServer({
|
|
19
|
+
send: (message) => deps.output.write(`${JSON.stringify(message)}\n`),
|
|
20
|
+
via: deps.via,
|
|
21
|
+
});
|
|
22
|
+
/** Un mensaje suelto: cortar la sesión por un byte dejaría al host sin servidor. */
|
|
23
|
+
function feed(line) {
|
|
24
|
+
try {
|
|
25
|
+
server.handle(JSON.parse(line));
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
deps.diagnostics.write(`aw mcp serve: línea ilegible descartada: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let buffer = "";
|
|
32
|
+
return new Promise((resolve) => {
|
|
33
|
+
deps.input.on("data", (chunk) => {
|
|
34
|
+
buffer += chunk.toString();
|
|
35
|
+
const complete = buffer.split("\n");
|
|
36
|
+
// La última porción queda sin `\n`: es una línea a medio llegar, no un mensaje.
|
|
37
|
+
buffer = complete.pop() ?? "";
|
|
38
|
+
for (const line of complete) {
|
|
39
|
+
const trimmed = line.trim();
|
|
40
|
+
if (trimmed.length > 0)
|
|
41
|
+
feed(trimmed);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
deps.input.on("end", () => resolve());
|
|
45
|
+
deps.input.on("close", () => resolve());
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=elicitation-stdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elicitation-stdio.js","sourceRoot":"","sources":["../../src/application/elicitation-stdio.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAYlE;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAe;IACjD,MAAM,MAAM,GAAG,uBAAuB,CAAC;QACrC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QACpE,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC,CAAC;IAEH,oFAAoF;IACpF,SAAS,IAAI,CAAC,IAAY;QACxB,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,CAAC,KAAK,CACpB,4CAA4C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CACvG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpC,gFAAgF;YAChF,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC"}
|