@sensigo/realm-mcp 0.44.0 → 0.46.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/dist/bin-identity.d.ts +11 -0
- package/dist/bin-identity.d.ts.map +1 -0
- package/dist/bin-identity.js +47 -0
- package/dist/bin-identity.js.map +1 -0
- package/dist/brand.d.ts +3 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +7 -0
- package/dist/brand.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/json-trace-buffer-store.d.ts +44 -31
- package/dist/json-trace-buffer-store.d.ts.map +1 -1
- package/dist/json-trace-buffer-store.js +72 -49
- package/dist/json-trace-buffer-store.js.map +1 -1
- package/dist/protocol/generator.js +2 -2
- package/dist/protocol/generator.js.map +1 -1
- package/dist/server.d.ts +13 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +30 -4
- package/dist/server.js.map +1 -1
- package/dist/test-support/declared.d.ts +2 -0
- package/dist/test-support/declared.d.ts.map +1 -0
- package/dist/test-support/declared.js +9 -0
- package/dist/test-support/declared.js.map +1 -0
- package/dist/tools/abandon-run.d.ts.map +1 -1
- package/dist/tools/abandon-run.js +28 -6
- package/dist/tools/abandon-run.js.map +1 -1
- package/dist/tools/append-trace.d.ts +2 -0
- package/dist/tools/append-trace.d.ts.map +1 -1
- package/dist/tools/append-trace.js +22 -71
- package/dist/tools/append-trace.js.map +1 -1
- package/dist/tools/assert-tool-stores.d.ts +26 -0
- package/dist/tools/assert-tool-stores.d.ts.map +1 -0
- package/dist/tools/assert-tool-stores.js +54 -0
- package/dist/tools/assert-tool-stores.js.map +1 -0
- package/dist/tools/create-workflow.d.ts.map +1 -1
- package/dist/tools/create-workflow.js +2 -0
- package/dist/tools/create-workflow.js.map +1 -1
- package/dist/tools/execute-step.d.ts.map +1 -1
- package/dist/tools/execute-step.js +19 -1
- package/dist/tools/execute-step.js.map +1 -1
- package/dist/tools/get-run-state.d.ts +33 -1
- package/dist/tools/get-run-state.d.ts.map +1 -1
- package/dist/tools/get-run-state.js +99 -4
- package/dist/tools/get-run-state.js.map +1 -1
- package/dist/tools/get-workflow-protocol.d.ts.map +1 -1
- package/dist/tools/get-workflow-protocol.js +2 -0
- package/dist/tools/get-workflow-protocol.js.map +1 -1
- package/dist/tools/list-workflows.d.ts +43 -6
- package/dist/tools/list-workflows.d.ts.map +1 -1
- package/dist/tools/list-workflows.js +43 -4
- package/dist/tools/list-workflows.js.map +1 -1
- package/dist/tools/start-run-batch.d.ts.map +1 -1
- package/dist/tools/start-run-batch.js +7 -0
- package/dist/tools/start-run-batch.js.map +1 -1
- package/dist/tools/start-run.d.ts +9 -1
- package/dist/tools/start-run.d.ts.map +1 -1
- package/dist/tools/start-run.js +25 -3
- package/dist/tools/start-run.js.map +1 -1
- package/dist/tools/submit-human-response.d.ts +36 -0
- package/dist/tools/submit-human-response.d.ts.map +1 -1
- package/dist/tools/submit-human-response.js +105 -13
- package/dist/tools/submit-human-response.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +4 -4
|
@@ -1,20 +1,59 @@
|
|
|
1
1
|
import { JsonWorkflowStore } from '@sensigo/realm';
|
|
2
2
|
import { sseJsonStringify } from '../sse-json.js';
|
|
3
|
+
import { assertToolStores } from './assert-tool-stores.js';
|
|
4
|
+
const HEALTHY_HINT = 'Call get_workflow_protocol with a workflow_id before calling start_run. If no workflow matches your task, use create_workflow to define and start your own plan.';
|
|
3
5
|
/**
|
|
4
6
|
* Business logic for the list_workflows tool.
|
|
5
|
-
* Returns a summary of all registered workflows.
|
|
7
|
+
* Returns a summary of all registered workflows AND every registered copy that could not be read.
|
|
8
|
+
* The "use create_workflow" steer is offered only when every copy was read: a copy that could not
|
|
9
|
+
* be read may still be a registered workflow that only needs its file repaired, and realm cannot
|
|
10
|
+
* tell which until an operator looks — so the steer is withdrawn rather than guessed.
|
|
6
11
|
*/
|
|
7
12
|
export async function handleListWorkflows(stores) {
|
|
13
|
+
assertToolStores(stores, 'handleListWorkflows');
|
|
8
14
|
const store = stores?.workflowStore ?? new JsonWorkflowStore();
|
|
9
|
-
const workflows = await store.
|
|
15
|
+
const { workflows, unreadable } = await store.listWithDiagnostics();
|
|
16
|
+
const broken = unreadable.find((u) => u.class === 'registry_broken');
|
|
17
|
+
if (broken !== undefined) {
|
|
18
|
+
return {
|
|
19
|
+
status: 'error',
|
|
20
|
+
error_code: 'STATE_WORKFLOW_UNREADABLE',
|
|
21
|
+
error_details: {
|
|
22
|
+
class: 'registry_broken',
|
|
23
|
+
...(broken.errno !== undefined ? { errno: broken.errno } : {}),
|
|
24
|
+
path: broken.file,
|
|
25
|
+
},
|
|
26
|
+
errors: [
|
|
27
|
+
`${broken.reason}.${broken.repair !== undefined ? ` To repair: ${broken.repair}.` : ''}`,
|
|
28
|
+
],
|
|
29
|
+
agent_action: 'stop',
|
|
30
|
+
workflows: [],
|
|
31
|
+
unreadable: [],
|
|
32
|
+
// (audit round 2, S1: no claim about what the registry holds — realm could not read it.)
|
|
33
|
+
hint: 'Realm could not read the registry directory, so it cannot tell you what is registered there; nothing can be listed or started until an operator repairs it. Do not create a workflow to work around it.',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const entries = unreadable.map((u) => ({
|
|
37
|
+
file: u.file,
|
|
38
|
+
class: u.class,
|
|
39
|
+
...(u.errno !== undefined ? { errno: u.errno } : {}),
|
|
40
|
+
reason: u.reason,
|
|
41
|
+
...(u.repair !== undefined ? { repair: u.repair } : {}),
|
|
42
|
+
}));
|
|
43
|
+
const count = `${String(entries.length)} registered workflow ${entries.length === 1 ? 'copy' : 'copies'} could not be read`;
|
|
10
44
|
return {
|
|
45
|
+
status: 'ok',
|
|
11
46
|
workflows: workflows.map((w) => ({ id: w.id, name: w.name, version: w.version })),
|
|
12
|
-
|
|
47
|
+
unreadable: entries,
|
|
48
|
+
warnings: entries.length === 0 ? [] : [`${count} — see 'unreadable'.`],
|
|
49
|
+
hint: entries.length === 0
|
|
50
|
+
? HEALTHY_HINT
|
|
51
|
+
: `${count} — 'unreadable' names each file, the reason and the repair (an operator's act). Do not create a workflow to replace one listed there until an operator has looked: the entry may be a registered workflow that only needs its file repaired. Call get_workflow_protocol with a workflow_id before calling start_run.`,
|
|
13
52
|
};
|
|
14
53
|
}
|
|
15
54
|
/** Registers the list_workflows MCP tool on the server. */
|
|
16
55
|
export function registerListWorkflows(server, opts) {
|
|
17
|
-
server.tool('list_workflows', 'List all registered Realm workflows.', async () => {
|
|
56
|
+
server.tool('list_workflows', 'List all registered Realm workflows; names every registered copy that could not be read, and refuses when the registry directory itself cannot be read.', async () => {
|
|
18
57
|
const result = await handleListWorkflows(opts);
|
|
19
58
|
return { content: [{ type: 'text', text: sseJsonStringify(result) }] };
|
|
20
59
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-workflows.js","sourceRoot":"","sources":["../../src/tools/list-workflows.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list-workflows.js","sourceRoot":"","sources":["../../src/tools/list-workflows.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-run-batch.d.ts","sourceRoot":"","sources":["../../src/tools/start-run-batch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAYL,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"start-run-batch.d.ts","sourceRoot":"","sources":["../../src/tools/start-run-batch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAYL,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAUtD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,gGAAgG;QAChG,OAAO,EAAE,OAAO,CAAC;QACjB,8FAA8F;QAC9F,SAAS,EAAE,QAAQ,CAAC;QACpB,+CAA+C;QAC/C,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,4GAA4G;QAC5G,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;IACH;;;;OAIG;IACH,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;CACJ;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IACxF,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;IACjF,aAAa,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;CACrD,EACD,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,mBAAmB,CAAC,CAqJ9B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAiErF"}
|
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { JsonWorkflowStore, JsonFileStore, WorkflowError, buildPreExecutionErrorEnvelope, validateRunParams, hashParams, unmetCapabilities, capabilityWarning, createDefaultRegistry, deriveRunPhase, } from '@sensigo/realm';
|
|
4
4
|
import { sseJsonStringify } from '../sse-json.js';
|
|
5
|
+
import { assertToolStores, markServedByTool, registryRole } from './assert-tool-stores.js';
|
|
6
|
+
import { assertRegistryLine, ExtensionRegistry as RealmExtensionRegistry } from '@sensigo/realm';
|
|
5
7
|
/** Lightweight structured telemetry. stderr is safe under the MCP stdio/SSE transport. */
|
|
6
8
|
function logBatchDedup(fields) {
|
|
7
9
|
console.error(JSON.stringify({ event: 'idempotency_dedup', ...fields }));
|
|
8
10
|
}
|
|
9
11
|
export async function handleStartRunBatch(args, stores) {
|
|
12
|
+
assertToolStores(stores, 'handleStartRunBatch');
|
|
10
13
|
const workflowStore = stores?.workflowStore ?? new JsonWorkflowStore();
|
|
11
14
|
const runStore = stores?.runStore ?? new JsonFileStore();
|
|
12
15
|
const cap = args.max_items ?? 100;
|
|
@@ -26,6 +29,9 @@ export async function handleStartRunBatch(args, stores) {
|
|
|
26
29
|
const registry = stores?.registryProvider !== undefined
|
|
27
30
|
? await stores.registryProvider(definition)
|
|
28
31
|
: stores?.registry;
|
|
32
|
+
// issue #620 PR-C: the registry rule — refused only on proof (another realm version), before any
|
|
33
|
+
// write. Covers the provider's result and the construction-time registry alike.
|
|
34
|
+
assertRegistryLine(registry, registryRole(stores, 'start_run_batch', 'handleStartRunBatch'), RealmExtensionRegistry);
|
|
29
35
|
// #134 pre-flight (WARN-only, never refuse): capability gaps are workflow-invariant, so compute ONCE
|
|
30
36
|
// and attach to every item. Caveated — a batch item may ultimately be driven by a DIFFERENT runner
|
|
31
37
|
// than the one whose registry we see at creation time. The `?? createDefaultRegistry()` fallback is the
|
|
@@ -129,6 +135,7 @@ export async function handleStartRunBatch(args, stores) {
|
|
|
129
135
|
return { started, failed };
|
|
130
136
|
}
|
|
131
137
|
export function registerStartRunBatch(server, opts) {
|
|
138
|
+
markServedByTool(opts);
|
|
132
139
|
server.tool('start_run_batch', 'Atomically enqueue multiple runs of the same workflow. All items are validated before any run is created. If idempotency keys are provided, duplicate runs are returned instead of created.', {
|
|
133
140
|
workflow_id: z.string(),
|
|
134
141
|
items: z.array(z.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-run-batch.js","sourceRoot":"","sources":["../../src/tools/start-run-batch.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,8BAA8B,EAC9B,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GAGf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"start-run-batch.js","sourceRoot":"","sources":["../../src/tools/start-run-batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { JsonWorkflowStore, type ResponseEnvelope, type RunStore, type TraceBufferStore, type FailedAttemptStore, ExtensionRegistry } from '@sensigo/realm';
|
|
2
|
+
import { JsonWorkflowStore, type ResponseEnvelope, type RunStore, type TraceBufferStore, type FailedAttemptStore, ExtensionRegistry, type Attributed } from '@sensigo/realm';
|
|
3
3
|
/**
|
|
4
4
|
* Structural (not nominal) shape of `FailedAttemptStore`'s public surface, derived via `Pick` so a
|
|
5
5
|
* duck-typed cloud-backed object can satisfy it too — the concrete `FailedAttemptStore` class has
|
|
@@ -24,6 +24,13 @@ export interface HandleRunStores {
|
|
|
24
24
|
traceBufferStore?: TraceBufferStore;
|
|
25
25
|
/** Durable per-run sidecar for failed agent-attempt telemetry (observability P3). */
|
|
26
26
|
failedAttemptStore?: FailedAttemptStoreLike;
|
|
27
|
+
/**
|
|
28
|
+
* Issue #625 (holder slice): the host PROGRAM this server runs as — its name, how that name is
|
|
29
|
+
* known, and its channel. Written as `holder` on the claim of every step a tool call takes and
|
|
30
|
+
* as `driven_by` on that call's evidence, and on the cleanup steps an answer drains. A label,
|
|
31
|
+
* never compared, never a reason to refuse. Absent ⇒ none recorded.
|
|
32
|
+
*/
|
|
33
|
+
driver?: Attributed;
|
|
27
34
|
}
|
|
28
35
|
/**
|
|
29
36
|
* Business logic for the start_run tool.
|
|
@@ -37,6 +44,7 @@ export declare function handleStartRun(args: {
|
|
|
37
44
|
on_live_match?: 'use_existing' | 'fail' | undefined;
|
|
38
45
|
}, stores?: HandleRunStores): Promise<ResponseEnvelope & {
|
|
39
46
|
deduped: boolean;
|
|
47
|
+
rerun_of?: string;
|
|
40
48
|
}>;
|
|
41
49
|
/** Registers the start_run MCP tool on the server. */
|
|
42
50
|
export declare function registerStartRun(server: McpServer, opts?: HandleRunStores): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-run.d.ts","sourceRoot":"","sources":["../../src/tools/start-run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAEL,iBAAiB,EAajB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"start-run.d.ts","sourceRoot":"","sources":["../../src/tools/start-run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAEL,iBAAiB,EAajB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,iBAAiB,EACjB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAC;AAUxB;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,kBAAkB,EAClB,QAAQ,GAAG,MAAM,GAAG,iBAAiB,GAAG,aAAa,CACtD,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CACjB,UAAU,EAAE,OAAO,gBAAgB,EAAE,kBAAkB,KACpD,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChC,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,sBAAsB,CAAC;IAC5C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAKD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE;IACJ,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,iBAAiB,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;IACjF,aAAa,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;CACrD,EACD,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyIrE;AAED,sDAAsD;AACtD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CA0DhF"}
|
package/dist/tools/start-run.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { validateRunParams, JsonWorkflowStore, JsonFileStore, executeChain, buildNextActions, findEligibleSteps, hashParams, WorkflowError, buildPreExecutionErrorEnvelope, unmetCapabilities, capabilityWarning, createDefaultRegistry, deriveRunPhase, } from '@sensigo/realm';
|
|
4
4
|
import { sseJsonStringify } from '../sse-json.js';
|
|
5
|
+
import { assertToolStores, markServedByTool, registryRole } from './assert-tool-stores.js';
|
|
6
|
+
import { assertRegistryLine, ExtensionRegistry as RealmExtensionRegistry } from '@sensigo/realm';
|
|
5
7
|
/** Lightweight structured telemetry. stderr is safe under the MCP stdio/SSE transport. */
|
|
6
8
|
function logDedup(fields) {
|
|
7
9
|
console.error(JSON.stringify({ event: 'idempotency_dedup', ...fields }));
|
|
@@ -13,6 +15,7 @@ const passthroughDispatcher = async () => ({});
|
|
|
13
15
|
* Creates a run and immediately chains through any leading auto steps.
|
|
14
16
|
*/
|
|
15
17
|
export async function handleStartRun(args, stores) {
|
|
18
|
+
assertToolStores(stores, 'handleStartRun');
|
|
16
19
|
const workflowStore = stores?.workflowStore ?? new JsonWorkflowStore();
|
|
17
20
|
const runStore = stores?.runStore ?? new JsonFileStore();
|
|
18
21
|
const definition = await workflowStore.get(args.workflow_id);
|
|
@@ -28,6 +31,9 @@ export async function handleStartRun(args, stores) {
|
|
|
28
31
|
const registry = stores?.registryProvider !== undefined
|
|
29
32
|
? await stores.registryProvider(definition)
|
|
30
33
|
: stores?.registry;
|
|
34
|
+
// issue #620 PR-C: the registry rule — refused only on proof (another realm version), before any
|
|
35
|
+
// write. Covers the provider's result and the construction-time registry alike.
|
|
36
|
+
assertRegistryLine(registry, registryRole(stores, 'start_run', 'handleStartRun'), RealmExtensionRegistry);
|
|
31
37
|
const { run, created } = await runStore.create({
|
|
32
38
|
workflowId: definition.id,
|
|
33
39
|
workflowVersion: definition.version,
|
|
@@ -81,6 +87,7 @@ export async function handleStartRun(args, stores) {
|
|
|
81
87
|
input: params,
|
|
82
88
|
dispatcher: passthroughDispatcher,
|
|
83
89
|
...(registry !== undefined ? { registry } : {}),
|
|
90
|
+
...(stores?.driver !== undefined ? { driver: stores.driver } : {}),
|
|
84
91
|
});
|
|
85
92
|
// Source run_phase from the final run so the spread can't drop it.
|
|
86
93
|
const finalRun = await runStore.get(run.id).catch(() => run);
|
|
@@ -91,6 +98,16 @@ export async function handleStartRun(args, stores) {
|
|
|
91
98
|
evidence: [],
|
|
92
99
|
run_phase: finalRun.run_phase,
|
|
93
100
|
warnings: [...result.warnings, ...warnings],
|
|
101
|
+
// issue #558 PR-C (walk): a superseding run says so in the response that created it — the
|
|
102
|
+
// agent should not need a second call to learn that `on_terminal_match: 'rerun'` replaced a run.
|
|
103
|
+
...(finalRun.rerun_of !== undefined
|
|
104
|
+
? {
|
|
105
|
+
rerun_of: finalRun.rerun_of,
|
|
106
|
+
// walk 2: the hint is what an agent reads first; a supersede must be said there, not
|
|
107
|
+
// only carried as a key below the next_actions block.
|
|
108
|
+
context_hint: `${result.context_hint} This run supersedes run '${finalRun.rerun_of}' under the same idempotency key (on_terminal_match).`,
|
|
109
|
+
}
|
|
110
|
+
: {}),
|
|
94
111
|
deduped,
|
|
95
112
|
};
|
|
96
113
|
}
|
|
@@ -106,14 +123,18 @@ export async function handleStartRun(args, stores) {
|
|
|
106
123
|
errors: [],
|
|
107
124
|
context_hint: deduped
|
|
108
125
|
? `Matched existing run '${run.id}' (idempotent) in phase '${derivedPhase}'; no new run created.`
|
|
109
|
-
:
|
|
126
|
+
: run.rerun_of !== undefined
|
|
127
|
+
? `Run '${run.id}' created for workflow '${definition.id}'; it supersedes run '${run.rerun_of}' under the same idempotency key (on_terminal_match).`
|
|
128
|
+
: `Run '${run.id}' created for workflow '${definition.id}'.`,
|
|
110
129
|
run_phase: derivedPhase,
|
|
130
|
+
...(run.rerun_of !== undefined ? { rerun_of: run.rerun_of } : {}),
|
|
111
131
|
deduped,
|
|
112
132
|
next_actions: nextActions,
|
|
113
133
|
};
|
|
114
134
|
}
|
|
115
135
|
/** Registers the start_run MCP tool on the server. */
|
|
116
136
|
export function registerStartRun(server, opts) {
|
|
137
|
+
markServedByTool(opts);
|
|
117
138
|
server.tool('start_run', 'Create a new workflow run and chain through initial auto steps.', {
|
|
118
139
|
workflow_id: z.string(),
|
|
119
140
|
params: z.record(z.unknown()).optional().default({}),
|
|
@@ -123,12 +144,13 @@ export function registerStartRun(server, opts) {
|
|
|
123
144
|
}, async (args) => {
|
|
124
145
|
try {
|
|
125
146
|
const result = await handleStartRun(args, opts);
|
|
126
|
-
// Override command to 'start_run': MCP callers invoked start_run, not
|
|
127
|
-
// the first auto step that executeChain may have executed.
|
|
128
147
|
return {
|
|
129
148
|
content: [
|
|
130
149
|
{
|
|
131
150
|
type: 'text',
|
|
151
|
+
// Override command to 'start_run': MCP callers invoked start_run, not the first auto
|
|
152
|
+
// step executeChain may have run. The step a non-ok reply belongs to stays named in
|
|
153
|
+
// `stopped_step` (issue #676 review).
|
|
132
154
|
text: sseJsonStringify({ ...result, command: 'start_run' }),
|
|
133
155
|
},
|
|
134
156
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-run.js","sourceRoot":"","sources":["../../src/tools/start-run.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,
|
|
1
|
+
{"version":3,"file":"start-run.js","sourceRoot":"","sources":["../../src/tools/start-run.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,8BAA8B,EAC9B,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,GAQf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,IAAI,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAEjG,0FAA0F;AAC1F,SAAS,QAAQ,CAAC,MAA+B;IAC/C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AAyCD,+EAA+E;AAC/E,MAAM,qBAAqB,GAAmB,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAMC,EACD,MAAwB;IAExB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,MAAM,EAAE,aAAa,IAAI,IAAI,iBAAiB,EAAE,CAAC;IACvE,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,aAAa,EAAE,CAAC;IACzD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAEjC,iGAAiG;IACjG,+FAA+F;IAC/F,uFAAuF;IACvF,IAAI,UAAU,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC3C,iBAAiB,CAAC,MAAM,EAAE,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,wFAAwF;IACxF,0FAA0F;IAC1F,MAAM,QAAQ,GACZ,MAAM,EAAE,gBAAgB,KAAK,SAAS;QACpC,CAAC,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAC3C,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC;IACvB,iGAAiG;IACjG,gFAAgF;IAChF,kBAAkB,CAChB,QAAQ,EACR,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,CAAC,EACnD,sBAAsB,CACvB,CAAC;IAEF,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC7C,UAAU,EAAE,UAAU,CAAC,EAAE;QACzB,eAAe,EAAE,UAAU,CAAC,OAAO;QACnC,MAAM;QACN,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC,CAAC;IACH,yEAAyE;IACzE,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC;IACzB,8FAA8F;IAC9F,4FAA4F;IAC5F,iFAAiF;IACjF,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEzC,oGAAoG;IACpG,oGAAoG;IACpG,sGAAsG;IACtG,0EAA0E;IAC1E,MAAM,QAAQ,GAAa,iBAAiB,CAAC,UAAU,EAAE,QAAQ,IAAI,qBAAqB,EAAE,CAAC,CAAC,GAAG,CAC/F,iBAAiB,CAClB,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,wFAAwF;QACxF,iDAAiD;QACjD,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,iDAAiD,YAAY,IAAI,CAAC,CAAC;QACnF,CAAC;QACD,mEAAmE;QACnE,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxF,QAAQ,CAAC,IAAI,CACX,qIAAqI,CACtI,CAAC;QACJ,CAAC;QACD,4FAA4F;QAC5F,wFAAwF;QACxF,0FAA0F;QAC1F,qDAAqD;QACrD,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,MAAM,CAC5E,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAC9B,CAAC,MAAM,CAAC;QACT,IAAI,GAAG,CAAC,cAAc,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;YACpD,QAAQ,CAAC,IAAI,CACX,wBAAwB,qBAAqB,qDAAqD,GAAG,CAAC,EAAE,EAAE,CAC3G,CAAC;QACJ,CAAC;QACD,QAAQ,CAAC;YACP,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,UAAU,CAAC,EAAE;YAC1B,MAAM,EAAE,GAAG,CAAC,EAAE;YACd,SAAS,EAAE,YAAY;SACxB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC;IAE5F,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE;YACtD,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,OAAO,EAAE,aAAa;YACtB,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,qBAAqB;YACjC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC,CAAC;QACH,mEAAmE;QACnE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO;YACL,GAAG,MAAM;YACT,MAAM,EAAE,GAAG,CAAC,EAAE;YACd,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC7B,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC;YAC3C,0FAA0F;YAC1F,iGAAiG;YACjG,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS;gBACjC,CAAC,CAAC;oBACE,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,qFAAqF;oBACrF,sDAAsD;oBACtD,YAAY,EAAE,GAAG,MAAM,CAAC,YAAY,6BAA6B,QAAQ,CAAC,QAAQ,uDAAuD;iBAC1I;gBACH,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;SACR,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO;QACL,OAAO,EAAE,WAAW;QACpB,MAAM,EAAE,GAAG,CAAC,EAAE;QACd,WAAW,EAAE,GAAG,CAAC,OAAO;QACxB,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;QACZ,QAAQ;QACR,MAAM,EAAE,EAAE;QACV,YAAY,EAAE,OAAO;YACnB,CAAC,CAAC,yBAAyB,GAAG,CAAC,EAAE,4BAA4B,YAAY,wBAAwB;YACjG,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS;gBAC1B,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,2BAA2B,UAAU,CAAC,EAAE,yBAAyB,GAAG,CAAC,QAAQ,uDAAuD;gBACpJ,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,2BAA2B,UAAU,CAAC,EAAE,IAAI;QAChE,SAAS,EAAE,YAAY;QACvB,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO;QACP,YAAY,EAAE,WAAW;KAC1B,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,IAAsB;IACxE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,IAAI,CACT,WAAW,EACX,iEAAiE,EACjE;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACtC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;QACrF,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;KAC3D,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAChD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,qFAAqF;wBACrF,oFAAoF;wBACpF,sCAAsC;wBACtC,IAAI,EAAE,gBAAgB,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;qBAC5D;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,WAAW,GACf,GAAG,YAAY,aAAa;gBAC1B,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;oBAClE,IAAI,EAAE,iBAAiB;oBACvB,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,MAAM;oBACnB,SAAS,EAAE,KAAK;iBACjB,CAAC,CAAC;YACT,MAAM,WAAW,GACf,WAAW,CAAC,IAAI,KAAK,0BAA0B;gBAC7C,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,cAAc;gBAC7C,CAAC,CAAC,oDAAoD,CAAC;YAC3D,MAAM,QAAQ,GAAqB,8BAA8B,CAC/D,WAAW,EACX,EAAE,EACF,CAAC,EACD,WAAW,EACX,WAAW,CACZ,CAAC;YACF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC;qBACjC;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,41 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
1
2
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
3
|
import { type ResponseEnvelope } from '@sensigo/realm';
|
|
3
4
|
import type { HandleRunStores } from './start-run.js';
|
|
5
|
+
/**
|
|
6
|
+
* Issue #625 (holder slice): one warning per argument this tool does not take, naming the near miss
|
|
7
|
+
* when there is one. `server.tool` strips unknown keys before the handler runs, so a misnamed
|
|
8
|
+
* `claimToken` used to vanish without a word and the answer read as "no claim_token passed".
|
|
9
|
+
*/
|
|
10
|
+
export declare function unknownKeyWarnings(args: Record<string, unknown>): string[];
|
|
11
|
+
/**
|
|
12
|
+
* The tool's input schema. Pass-through: `registerTool` hands the handler every key, where
|
|
13
|
+
* `server.tool` strips them first (the form `create_workflow` already uses and documents).
|
|
14
|
+
*
|
|
15
|
+
* `claim_token` has NO minimum length on purpose: with `.min(1)` the SDK would refuse an empty
|
|
16
|
+
* token with `MCP error -32602` and the answer would not be recorded — the damage this argument
|
|
17
|
+
* must never do. The engine judges an empty string as a wrong value (`mismatch`) and records the
|
|
18
|
+
* answer.
|
|
19
|
+
*/
|
|
20
|
+
export declare const submitHumanResponseArgsSchema: z.ZodObject<{
|
|
21
|
+
run_id: z.ZodString;
|
|
22
|
+
gate_id: z.ZodString;
|
|
23
|
+
choice: z.ZodString;
|
|
24
|
+
responded_by: z.ZodOptional<z.ZodString>;
|
|
25
|
+
claim_token: z.ZodOptional<z.ZodString>;
|
|
26
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
27
|
+
run_id: z.ZodString;
|
|
28
|
+
gate_id: z.ZodString;
|
|
29
|
+
choice: z.ZodString;
|
|
30
|
+
responded_by: z.ZodOptional<z.ZodString>;
|
|
31
|
+
claim_token: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
33
|
+
run_id: z.ZodString;
|
|
34
|
+
gate_id: z.ZodString;
|
|
35
|
+
choice: z.ZodString;
|
|
36
|
+
responded_by: z.ZodOptional<z.ZodString>;
|
|
37
|
+
claim_token: z.ZodOptional<z.ZodString>;
|
|
38
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
4
39
|
/**
|
|
5
40
|
* Business logic for the submit_human_response tool.
|
|
6
41
|
* Validates the gate_id and choice, then advances the run past the gate.
|
|
@@ -10,6 +45,7 @@ export declare function handleSubmitHumanResponse(args: {
|
|
|
10
45
|
gate_id: string;
|
|
11
46
|
choice: string;
|
|
12
47
|
responded_by?: string | undefined;
|
|
48
|
+
claim_token?: string | undefined;
|
|
13
49
|
}, stores?: HandleRunStores): Promise<ResponseEnvelope>;
|
|
14
50
|
/** Registers the submit_human_response MCP tool on the server. */
|
|
15
51
|
export declare function registerSubmitHumanResponse(server: McpServer, opts?: HandleRunStores): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-human-response.d.ts","sourceRoot":"","sources":["../../src/tools/submit-human-response.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"submit-human-response.d.ts","sourceRoot":"","sources":["../../src/tools/submit-human-response.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EASL,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAiBtD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAS1E;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;gCAkB1B,CAAC;AAEjB;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE;IACJ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC,EACD,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,CAAC,CA2D3B;AAED,kEAAkE;AAClE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAiE3F"}
|
|
@@ -1,50 +1,142 @@
|
|
|
1
1
|
// submit-human-response tool — advances a gate-waiting run with a human choice.
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import { JsonWorkflowStore, JsonFileStore, submitHumanResponse, WorkflowError, buildPreExecutionErrorEnvelope, getWorkflowForRun, } from '@sensigo/realm';
|
|
3
|
+
import { JsonWorkflowStore, JsonFileStore, submitHumanResponse, WorkflowError, boundStatedName, identityRefusalLine, buildPreExecutionErrorEnvelope, getWorkflowForRun, } from '@sensigo/realm';
|
|
4
4
|
import { sseJsonStringify } from '../sse-json.js';
|
|
5
|
+
import { assertToolStores, markServedByTool, registryRole } from './assert-tool-stores.js';
|
|
6
|
+
import { assertRegistryLine, ExtensionRegistry as RealmExtensionRegistry } from '@sensigo/realm';
|
|
7
|
+
/** The arguments this tool takes. Anything else is named in the reply's `warnings`, not dropped. */
|
|
8
|
+
const KNOWN_ARGS = ['run_id', 'gate_id', 'choice', 'responded_by', 'claim_token'];
|
|
9
|
+
/**
|
|
10
|
+
* Near misses for the one argument whose absence changes what a reply says. The house `closestKey`
|
|
11
|
+
* (threshold 2) cannot reach `token` or `claimToken` from `claim_token`, so the map is explicit.
|
|
12
|
+
*/
|
|
13
|
+
const NEAR_MISSES = {
|
|
14
|
+
claimToken: 'claim_token',
|
|
15
|
+
token: 'claim_token',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Issue #625 (holder slice): one warning per argument this tool does not take, naming the near miss
|
|
19
|
+
* when there is one. `server.tool` strips unknown keys before the handler runs, so a misnamed
|
|
20
|
+
* `claimToken` used to vanish without a word and the answer read as "no claim_token passed".
|
|
21
|
+
*/
|
|
22
|
+
export function unknownKeyWarnings(args) {
|
|
23
|
+
return Object.keys(args)
|
|
24
|
+
.filter((key) => !KNOWN_ARGS.includes(key))
|
|
25
|
+
.map((key) => {
|
|
26
|
+
const near = NEAR_MISSES[key];
|
|
27
|
+
return near !== undefined
|
|
28
|
+
? `submit_human_response: unknown argument '${key}' was ignored — did you mean '${near}'?`
|
|
29
|
+
: `submit_human_response: unknown argument '${key}' was ignored.`;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The tool's input schema. Pass-through: `registerTool` hands the handler every key, where
|
|
34
|
+
* `server.tool` strips them first (the form `create_workflow` already uses and documents).
|
|
35
|
+
*
|
|
36
|
+
* `claim_token` has NO minimum length on purpose: with `.min(1)` the SDK would refuse an empty
|
|
37
|
+
* token with `MCP error -32602` and the answer would not be recorded — the damage this argument
|
|
38
|
+
* must never do. The engine judges an empty string as a wrong value (`mismatch`) and records the
|
|
39
|
+
* answer.
|
|
40
|
+
*/
|
|
41
|
+
export const submitHumanResponseArgsSchema = z
|
|
42
|
+
.object({
|
|
43
|
+
run_id: z.string(),
|
|
44
|
+
gate_id: z.string(),
|
|
45
|
+
choice: z.string(),
|
|
46
|
+
responded_by: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('Who made the choice, as the caller states it — not verified. At most 200 characters, no control characters.'),
|
|
50
|
+
claim_token: z
|
|
51
|
+
.string()
|
|
52
|
+
.optional()
|
|
53
|
+
.describe('The value from gate.claim_token on the reply that opened this question. Pass it back unchanged; it shows this answer comes from the conversation that opened the question. Never required.'),
|
|
54
|
+
})
|
|
55
|
+
.passthrough();
|
|
5
56
|
/**
|
|
6
57
|
* Business logic for the submit_human_response tool.
|
|
7
58
|
* Validates the gate_id and choice, then advances the run past the gate.
|
|
8
59
|
*/
|
|
9
60
|
export async function handleSubmitHumanResponse(args, stores) {
|
|
61
|
+
// issue #620 PR-C + the admission order (framework v1.27 §4): what the host handed in is checked
|
|
62
|
+
// first, then what this caller sent.
|
|
63
|
+
assertToolStores(stores, 'handleSubmitHumanResponse');
|
|
64
|
+
// Issue #625: `responded_by` is bounded exactly as `realm run respond --by` is — refused before
|
|
65
|
+
// anything is read or written, so nothing is recorded (#604's `responded_by` member: one helper
|
|
66
|
+
// guards both doors).
|
|
67
|
+
// The checked name (spaces at either end removed) is what is passed on and stored.
|
|
68
|
+
let respondedBy;
|
|
69
|
+
if (args.responded_by !== undefined) {
|
|
70
|
+
try {
|
|
71
|
+
respondedBy = boundStatedName(args.responded_by, 'responded_by');
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
throw new WorkflowError(identityRefusalLine('responded_by', err, 'nothing was recorded'), {
|
|
75
|
+
code: 'VALIDATION_ACTOR_INVALID',
|
|
76
|
+
category: 'VALIDATION',
|
|
77
|
+
agentAction: 'report_to_user',
|
|
78
|
+
retryable: false,
|
|
79
|
+
details: err instanceof WorkflowError ? err.details : {},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
10
83
|
const workflowStore = stores?.workflowStore ?? new JsonWorkflowStore();
|
|
11
84
|
const runStore = stores?.runStore ?? new JsonFileStore();
|
|
12
85
|
const run = await runStore.get(args.run_id);
|
|
13
86
|
// issue #456: code-keyed one-time-register remedy. Verb "retry" — deliberately neutral: the
|
|
14
87
|
// register command in the sentence is for the human this agent's report_to_user relays to.
|
|
15
|
-
const definition = await getWorkflowForRun(workflowStore, run, {
|
|
88
|
+
const definition = await getWorkflowForRun(workflowStore, run, {
|
|
89
|
+
retryVerb: 'retry',
|
|
90
|
+
verb: 'retry',
|
|
91
|
+
});
|
|
16
92
|
// Per-definition registry (project extensions) — awaited before the call (fail-fast),
|
|
17
93
|
// provider wins over `registry`. Mirrors execute-step.ts. Threaded into submitHumanResponse
|
|
18
94
|
// so that resolving a gate which COMPLETES the run fires its finalizers with project handlers.
|
|
19
95
|
const registry = stores?.registryProvider !== undefined
|
|
20
96
|
? await stores.registryProvider(definition)
|
|
21
97
|
: stores?.registry;
|
|
98
|
+
// issue #620 PR-C: the registry rule — refused only on proof (another realm version), before any
|
|
99
|
+
// write. Covers the provider's result and the construction-time registry alike.
|
|
100
|
+
assertRegistryLine(registry, registryRole(stores, 'submit_human_response', 'handleSubmitHumanResponse'), RealmExtensionRegistry);
|
|
22
101
|
return submitHumanResponse(runStore, definition, {
|
|
23
102
|
runId: args.run_id,
|
|
24
103
|
gateId: args.gate_id,
|
|
25
104
|
choice: args.choice,
|
|
26
105
|
...(registry !== undefined ? { registry } : {}),
|
|
27
|
-
// issue #279 (increment 2, PR-D; design record D-5):
|
|
28
|
-
|
|
106
|
+
// issue #279 (increment 2, PR-D; design record D-5): stored as checked above (spaces at either
|
|
107
|
+
// end removed); never verified.
|
|
108
|
+
...(respondedBy !== undefined ? { respondedBy } : {}),
|
|
109
|
+
// issue #625: judged inside the answer's write, never a reason to refuse it.
|
|
110
|
+
...(args.claim_token !== undefined ? { claimToken: args.claim_token } : {}),
|
|
111
|
+
...(stores?.driver !== undefined ? { driver: stores.driver } : {}),
|
|
29
112
|
});
|
|
30
113
|
}
|
|
31
114
|
/** Registers the submit_human_response MCP tool on the server. */
|
|
32
115
|
export function registerSubmitHumanResponse(server, opts) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}, async (
|
|
116
|
+
markServedByTool(opts);
|
|
117
|
+
// issue #625: `registerTool` with a pass-through schema — `server.tool` strips unknown keys before
|
|
118
|
+
// the handler sees them (see `create-workflow.ts`), so a misnamed `claimToken` would vanish
|
|
119
|
+
// without a word.
|
|
120
|
+
server.registerTool('submit_human_response', {
|
|
121
|
+
description: "Advance a gate-waiting run by submitting the human's choice.",
|
|
122
|
+
inputSchema: submitHumanResponseArgsSchema,
|
|
123
|
+
}, async (rawArgs) => {
|
|
124
|
+
const args = rawArgs;
|
|
41
125
|
try {
|
|
42
126
|
const result = await handleSubmitHumanResponse(args, opts);
|
|
127
|
+
const unknown = unknownKeyWarnings(args);
|
|
43
128
|
return {
|
|
44
129
|
content: [
|
|
45
130
|
{
|
|
46
131
|
type: 'text',
|
|
47
|
-
text: sseJsonStringify({
|
|
132
|
+
text: sseJsonStringify({
|
|
133
|
+
...result,
|
|
134
|
+
data: {},
|
|
135
|
+
evidence: [],
|
|
136
|
+
// An unknown argument is named FIRST: a caller that sent `claimToken` reads the
|
|
137
|
+
// did-you-mean before the reply's own "No claim_token was passed" sentence.
|
|
138
|
+
...(unknown.length > 0 ? { warnings: [...unknown, ...result.warnings] } : {}),
|
|
139
|
+
}),
|
|
48
140
|
},
|
|
49
141
|
],
|
|
50
142
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-human-response.js","sourceRoot":"","sources":["../../src/tools/submit-human-response.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,8BAA8B,EAC9B,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"submit-human-response.js","sourceRoot":"","sources":["../../src/tools/submit-human-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,WAAW,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sensigo/realm-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.46.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
-
"description": "MCP server for Realm
|
|
7
|
+
"description": "MCP server for Realm: lets an AI agent run Realm workflows.",
|
|
8
8
|
"license": "Apache-2.0",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
11
|
"url": "https://github.com/sensigo-hq/realm.git"
|
|
12
12
|
},
|
|
13
|
-
"homepage": "https://
|
|
13
|
+
"homepage": "https://realmengine.dev",
|
|
14
14
|
"keywords": [
|
|
15
15
|
"mcp",
|
|
16
16
|
"model-context-protocol",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@modelcontextprotocol/sdk": "1.30.0",
|
|
49
|
-
"@sensigo/realm": "
|
|
49
|
+
"@sensigo/realm": "0.46.0",
|
|
50
50
|
"proper-lockfile": "^4.1.2",
|
|
51
51
|
"zod": "^3.25.7"
|
|
52
52
|
},
|