@stigmer/mcp-server 3.3.0 → 3.4.1

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 (154) hide show
  1. package/README.md +60 -13
  2. package/cli/mcp-server-stigmer.js +5 -1
  3. package/domains/agentexecutions/approve.d.ts +9 -0
  4. package/domains/agentexecutions/approve.d.ts.map +1 -0
  5. package/domains/agentexecutions/approve.js +46 -0
  6. package/domains/agentexecutions/approve.js.map +1 -0
  7. package/domains/agentexecutions/fetch.d.ts +28 -0
  8. package/domains/agentexecutions/fetch.d.ts.map +1 -0
  9. package/domains/agentexecutions/fetch.js +82 -0
  10. package/domains/agentexecutions/fetch.js.map +1 -0
  11. package/domains/agentexecutions/run.d.ts +27 -0
  12. package/domains/agentexecutions/run.d.ts.map +1 -0
  13. package/domains/agentexecutions/run.js +87 -0
  14. package/domains/agentexecutions/run.js.map +1 -0
  15. package/domains/agentexecutions/tools.d.ts +5 -0
  16. package/domains/agentexecutions/tools.d.ts.map +1 -0
  17. package/domains/agentexecutions/tools.js +97 -0
  18. package/domains/agentexecutions/tools.js.map +1 -0
  19. package/domains/client.d.ts +8 -0
  20. package/domains/client.d.ts.map +1 -1
  21. package/domains/client.js +9 -0
  22. package/domains/client.js.map +1 -1
  23. package/domains/datastores/apply.d.ts +4 -0
  24. package/domains/datastores/apply.d.ts.map +1 -0
  25. package/domains/datastores/apply.js +28 -0
  26. package/domains/datastores/apply.js.map +1 -0
  27. package/domains/datastores/delete.d.ts +3 -0
  28. package/domains/datastores/delete.d.ts.map +1 -0
  29. package/domains/datastores/delete.js +38 -0
  30. package/domains/datastores/delete.js.map +1 -0
  31. package/domains/datastores/fetch.d.ts +3 -0
  32. package/domains/datastores/fetch.d.ts.map +1 -0
  33. package/domains/datastores/fetch.js +23 -0
  34. package/domains/datastores/fetch.js.map +1 -0
  35. package/domains/datastores/resources.d.ts +5 -0
  36. package/domains/datastores/resources.d.ts.map +1 -0
  37. package/domains/datastores/resources.js +16 -0
  38. package/domains/datastores/resources.js.map +1 -0
  39. package/domains/datastores/tools.d.ts +5 -0
  40. package/domains/datastores/tools.d.ts.map +1 -0
  41. package/domains/datastores/tools.js +46 -0
  42. package/domains/datastores/tools.js.map +1 -0
  43. package/domains/environments/apply.d.ts +4 -0
  44. package/domains/environments/apply.d.ts.map +1 -0
  45. package/domains/environments/apply.js +30 -0
  46. package/domains/environments/apply.js.map +1 -0
  47. package/domains/environments/delete.d.ts +3 -0
  48. package/domains/environments/delete.d.ts.map +1 -0
  49. package/domains/environments/delete.js +36 -0
  50. package/domains/environments/delete.js.map +1 -0
  51. package/domains/environments/fetch.d.ts +6 -0
  52. package/domains/environments/fetch.d.ts.map +1 -0
  53. package/domains/environments/fetch.js +30 -0
  54. package/domains/environments/fetch.js.map +1 -0
  55. package/domains/environments/resources.d.ts +5 -0
  56. package/domains/environments/resources.d.ts.map +1 -0
  57. package/domains/environments/resources.js +16 -0
  58. package/domains/environments/resources.js.map +1 -0
  59. package/domains/environments/tools.d.ts +5 -0
  60. package/domains/environments/tools.d.ts.map +1 -0
  61. package/domains/environments/tools.js +51 -0
  62. package/domains/environments/tools.js.map +1 -0
  63. package/domains/executions/cancel.d.ts +9 -0
  64. package/domains/executions/cancel.d.ts.map +1 -0
  65. package/domains/executions/cancel.js +114 -0
  66. package/domains/executions/cancel.js.map +1 -0
  67. package/domains/executions/tools.d.ts +5 -0
  68. package/domains/executions/tools.d.ts.map +1 -0
  69. package/domains/executions/tools.js +28 -0
  70. package/domains/executions/tools.js.map +1 -0
  71. package/domains/records/tools.d.ts.map +1 -1
  72. package/domains/records/tools.js +7 -3
  73. package/domains/records/tools.js.map +1 -1
  74. package/domains/resourceuri.d.ts.map +1 -1
  75. package/domains/resourceuri.js +2 -0
  76. package/domains/resourceuri.js.map +1 -1
  77. package/domains/search/tools.d.ts.map +1 -1
  78. package/domains/search/tools.js +10 -7
  79. package/domains/search/tools.js.map +1 -1
  80. package/domains/skills/tools.d.ts.map +1 -1
  81. package/domains/skills/tools.js +25 -1
  82. package/domains/skills/tools.js.map +1 -1
  83. package/domains/skills/versions.d.ts +9 -0
  84. package/domains/skills/versions.d.ts.map +1 -0
  85. package/domains/skills/versions.js +31 -0
  86. package/domains/skills/versions.js.map +1 -0
  87. package/domains/workflowexecutions/approvals.d.ts +17 -0
  88. package/domains/workflowexecutions/approvals.d.ts.map +1 -0
  89. package/domains/workflowexecutions/approvals.js +61 -0
  90. package/domains/workflowexecutions/approvals.js.map +1 -0
  91. package/domains/workflowexecutions/run.d.ts +12 -0
  92. package/domains/workflowexecutions/run.d.ts.map +1 -0
  93. package/domains/workflowexecutions/run.js +69 -0
  94. package/domains/workflowexecutions/run.js.map +1 -0
  95. package/domains/workflowexecutions/tools.d.ts.map +1 -1
  96. package/domains/workflowexecutions/tools.js +89 -6
  97. package/domains/workflowexecutions/tools.js.map +1 -1
  98. package/domains/workflows/tools.d.ts.map +1 -1
  99. package/domains/workflows/tools.js +69 -5
  100. package/domains/workflows/tools.js.map +1 -1
  101. package/domains/workflows/versions.d.ts +29 -0
  102. package/domains/workflows/versions.d.ts.map +1 -0
  103. package/domains/workflows/versions.js +99 -0
  104. package/domains/workflows/versions.js.map +1 -0
  105. package/gen/datastore.d.ts +861 -0
  106. package/gen/datastore.d.ts.map +1 -0
  107. package/gen/datastore.js +267 -0
  108. package/gen/datastore.js.map +1 -0
  109. package/gen/environment.d.ts +77 -0
  110. package/gen/environment.d.ts.map +1 -0
  111. package/gen/environment.js +62 -0
  112. package/gen/environment.js.map +1 -0
  113. package/package.json +3 -3
  114. package/server.d.ts.map +1 -1
  115. package/server.js +12 -0
  116. package/server.js.map +1 -1
  117. package/src/domains/agentexecutions/approve.ts +67 -0
  118. package/src/domains/agentexecutions/fetch.ts +112 -0
  119. package/src/domains/agentexecutions/run.ts +112 -0
  120. package/src/domains/agentexecutions/tools.ts +139 -0
  121. package/src/domains/apply.integration.test.ts +82 -6
  122. package/src/domains/client.ts +9 -0
  123. package/src/domains/datastores/apply.ts +33 -0
  124. package/src/domains/datastores/delete.ts +47 -0
  125. package/src/domains/datastores/fetch.ts +32 -0
  126. package/src/domains/datastores/resources.ts +21 -0
  127. package/src/domains/datastores/tools.ts +76 -0
  128. package/src/domains/deletes.integration.test.ts +49 -2
  129. package/src/domains/environments/apply.ts +40 -0
  130. package/src/domains/environments/delete.ts +45 -0
  131. package/src/domains/environments/fetch.ts +39 -0
  132. package/src/domains/environments/resources.ts +21 -0
  133. package/src/domains/environments/tools.ts +81 -0
  134. package/src/domains/executions/cancel.ts +148 -0
  135. package/src/domains/executions/tools.ts +45 -0
  136. package/src/domains/executions.integration.test.ts +376 -0
  137. package/src/domains/reads.integration.test.ts +51 -5
  138. package/src/domains/records/tools.ts +7 -3
  139. package/src/domains/resources.integration.test.ts +38 -2
  140. package/src/domains/resourceuri.test.ts +11 -2
  141. package/src/domains/resourceuri.ts +2 -0
  142. package/src/domains/search/search.integration.test.ts +18 -2
  143. package/src/domains/search/tools.ts +12 -7
  144. package/src/domains/skills/tools.ts +34 -1
  145. package/src/domains/skills/versions.ts +47 -0
  146. package/src/domains/versions.integration.test.ts +212 -0
  147. package/src/domains/workflowexecutions/approvals.ts +102 -0
  148. package/src/domains/workflowexecutions/run.ts +87 -0
  149. package/src/domains/workflowexecutions/tools.ts +120 -6
  150. package/src/domains/workflows/tools.ts +90 -7
  151. package/src/domains/workflows/versions.ts +147 -0
  152. package/src/gen/datastore.ts +264 -0
  153. package/src/gen/environment.ts +66 -0
  154. package/src/server.ts +12 -0
@@ -0,0 +1,23 @@
1
+ // Datastore-definition read path: the single RPC both the get_datastore tool
2
+ // and the datastore resource template delegate to. This is the *structure*
3
+ // surface (collections, constraints, grants); living records are served by the
4
+ // record tools (records/), whose agent-facing summary is describe_datastore.
5
+ import { DatastoreSchema } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
6
+ import { DatastoreQueryController } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/query_pb";
7
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
8
+ import { withClient } from "../client.js";
9
+ import { toProtoJson } from "../marshal.js";
10
+ import { rpcError } from "../rpcerr.js";
11
+ /** Retrieve a datastore by org and slug, returning its protojson representation. */
12
+ export async function fetchDatastore(serverAddress, token, org, slug) {
13
+ return withClient(DatastoreQueryController, serverAddress, token, async (client, callOptions) => {
14
+ try {
15
+ const datastore = await client.getByReference({ org, kind: ApiResourceKind.datastore, slug }, callOptions);
16
+ return toProtoJson(DatastoreSchema, datastore);
17
+ }
18
+ catch (err) {
19
+ throw rpcError(err, `datastore "${slug}" in org "${org}"`);
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/domains/datastores/fetch.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,6EAA6E;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,wDAAwD,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,0DAA0D,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAEtH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,aAAqB,EACrB,KAAa,EACb,GAAW,EACX,IAAY;IAEZ,OAAO,UAAU,CAAC,wBAAwB,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;QAC9F,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,cAAc,CAC3C,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,EAC9C,WAAW,CACZ,CAAC;YACF,OAAO,WAAW,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,GAAG,EAAE,cAAc,IAAI,aAAa,GAAG,GAAG,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { BackendTarget } from "../client.js";
3
+ /** Register the datastore resource template; returns the registered resource names. */
4
+ export declare function registerDatastoreResources(server: McpServer, target: BackendTarget): string[];
5
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/domains/datastores/resources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,uFAAuF;AACvF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAW7F"}
@@ -0,0 +1,16 @@
1
+ // Datastore resource template (stigmer://datastores/{org}/{slug}).
2
+ import { registerResource } from "../resourcehandler.js";
3
+ import { fetchDatastore } from "./fetch.js";
4
+ /** Register the datastore resource template; returns the registered resource names. */
5
+ export function registerDatastoreResources(server, target) {
6
+ registerResource(server, target, {
7
+ name: "stigmer_datastore",
8
+ title: "Stigmer Datastore",
9
+ description: "Full definition of a Stigmer datastore (collections, constraints, grants), " +
10
+ "identified by organization and slug.",
11
+ template: "stigmer://datastores/{org}/{slug}",
12
+ fetch: fetchDatastore,
13
+ });
14
+ return ["stigmer_datastore"];
15
+ }
16
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/domains/datastores/resources.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAKnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,uFAAuF;AACvF,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,MAAqB;IACjF,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE;QAC/B,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,6EAA6E;YAC7E,sCAAsC;QACxC,QAAQ,EAAE,mCAAmC;QAC7C,KAAK,EAAE,cAAc;KACtB,CAAC,CAAC;IACH,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type BackendTarget } from "../client.js";
3
+ /** Register every Datastore-domain tool; returns the registered tool names. */
4
+ export declare function registerDatastoreTools(server: McpServer, target: BackendTarget): string[];
5
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/domains/datastores/tools.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAMhE,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CA0DzF"}
@@ -0,0 +1,46 @@
1
+ // MCP tools for the Datastore *definition* domain — the structure surface
2
+ // (collections, fields, constraints, roles, grants). The record tools
3
+ // (records/tools.ts) operate on the living data inside these structures;
4
+ // before this domain existed, an assistant could insert records into a
5
+ // datastore it had no way to create.
6
+ import { z } from "zod";
7
+ import { DatastoreInputShape } from "../../gen/datastore.js";
8
+ import { resolveToken } from "../client.js";
9
+ import { textOrError } from "../toolresult.js";
10
+ import { applyDatastore } from "./apply.js";
11
+ import { deleteDatastore } from "./delete.js";
12
+ import { fetchDatastore } from "./fetch.js";
13
+ /** Register every Datastore-domain tool; returns the registered tool names. */
14
+ export function registerDatastoreTools(server, target) {
15
+ server.registerTool("get_datastore", {
16
+ description: "Get the full definition of a Stigmer datastore by its org and slug: collections, field " +
17
+ "declarations, constraints, roles, and grants. For the record-facing view of the same " +
18
+ "structure (allowed verbs, readable fields), use describe_datastore; for the data " +
19
+ "itself, use the record tools.",
20
+ inputSchema: {
21
+ org: z.string().describe("Organization slug that owns the datastore (e.g. stigmer)."),
22
+ slug: z
23
+ .string()
24
+ .describe("Datastore slug — the unique identifier within the org (e.g. clinic-bookings)."),
25
+ },
26
+ }, (args, extra) => textOrError(() => fetchDatastore(target.serverAddress, resolveToken(extra, target.apiKey), args.org, args.slug)));
27
+ server.registerTool("apply_datastore", {
28
+ description: "Create or update a Stigmer datastore definition (idempotent). The manifest is " +
29
+ "authoritative for structure only — schema changes sync on apply (the server enforces " +
30
+ "its additive-plus change rules), and records are never touched; use the record tools " +
31
+ "to manage data.",
32
+ inputSchema: DatastoreInputShape,
33
+ }, (args, extra) => textOrError(() => applyDatastore(target.serverAddress, resolveToken(extra, target.apiKey), args)));
34
+ server.registerTool("delete_datastore", {
35
+ description: "Delete a Stigmer datastore by its org and slug, destroying its collections and all " +
36
+ "records in them. This is irreversible. Returns the deleted datastore definition.",
37
+ inputSchema: {
38
+ org: z.string().describe("Organization slug that owns the datastore (e.g. stigmer)."),
39
+ slug: z
40
+ .string()
41
+ .describe("Datastore slug — the unique identifier within the org (e.g. clinic-bookings)."),
42
+ },
43
+ }, (args, extra) => textOrError(() => deleteDatastore(target.serverAddress, resolveToken(extra, target.apiKey), args.org, args.slug)));
44
+ return ["get_datastore", "apply_datastore", "delete_datastore"];
45
+ }
46
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/domains/datastores/tools.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,sEAAsE;AACtE,yEAAyE;AACzE,uEAAuE;AACvE,qCAAqC;AAGrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAsB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,+EAA+E;AAC/E,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAqB;IAC7E,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EACT,yFAAyF;YACzF,uFAAuF;YACvF,mFAAmF;YACnF,+BAA+B;QACjC,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;YACrF,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CAAC,+EAA+E,CAAC;SAC7F;KACF,EACD,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,WAAW,CAAC,GAAG,EAAE,CACf,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAC9F,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EACT,gFAAgF;YAChF,uFAAuF;YACvF,uFAAuF;YACvF,iBAAiB;QACnB,WAAW,EAAE,mBAAmB;KACjC,EACD,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,WAAW,CAAC,GAAG,EAAE,CACf,cAAc,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAC/E,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EACT,qFAAqF;YACrF,kFAAkF;QACpF,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;YACrF,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CAAC,+EAA+E,CAAC;SAC7F;KACF,EACD,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,WAAW,CAAC,GAAG,EAAE,CACf,eAAe,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAC/F,CACJ,CAAC;IAEF,OAAO,CAAC,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type EnvironmentInput } from "../../gen/environment.js";
2
+ /** Create or update an environment, returning the persisted resource as protojson. */
3
+ export declare function applyEnvironment(serverAddress: string, token: string, input: EnvironmentInput): Promise<string>;
4
+ //# sourceMappingURL=apply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../../src/domains/environments/apply.ts"],"names":[],"mappings":"AAaA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAK1F,sFAAsF;AACtF,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
@@ -0,0 +1,30 @@
1
+ // Environment apply path: create-or-update via EnvironmentCommandController.apply.
2
+ // The flat MCP input is projected into a fully-formed Environment proto by the
3
+ // generated environmentInputToProto bridge (codegen, src/gen/environment.ts).
4
+ //
5
+ // Secret round-trip contract: a get → edit → apply loop is safe even when
6
+ // secrets are present. The server redacts secret values to ***REDACTED*** on
7
+ // read, and its update pipeline treats an echoed marker as "preserve the
8
+ // existing secret" — so callers only ever send real secret values when
9
+ // setting or rotating them.
10
+ import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
11
+ import { EnvironmentCommandController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/command_pb";
12
+ import { environmentInputToProto } from "../../gen/environment.js";
13
+ import { withClient } from "../client.js";
14
+ import { toProtoJson } from "../marshal.js";
15
+ import { rpcError } from "../rpcerr.js";
16
+ /** Create or update an environment, returning the persisted resource as protojson. */
17
+ export async function applyEnvironment(serverAddress, token, input) {
18
+ const environment = environmentInputToProto(input);
19
+ const desc = `environment "${environment.metadata?.slug ?? ""}" in org "${environment.metadata?.org ?? ""}"`;
20
+ return withClient(EnvironmentCommandController, serverAddress, token, async (client, callOptions) => {
21
+ try {
22
+ const result = await client.apply(environment, callOptions);
23
+ return toProtoJson(EnvironmentSchema, result);
24
+ }
25
+ catch (err) {
26
+ throw rpcError(err, desc);
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/domains/environments/apply.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,+EAA+E;AAC/E,8EAA8E;AAC9E,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,yEAAyE;AACzE,uEAAuE;AACvE,4BAA4B;AAE5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,0DAA0D,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,8DAA8D,CAAC;AAE5G,OAAO,EAAE,uBAAuB,EAAyB,MAAM,0BAA0B,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,KAAa,EACb,KAAuB;IAEvB,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,gBAAgB,WAAW,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,aAAa,WAAW,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC;IAC7G,OAAO,UAAU,CACf,4BAA4B,EAC5B,aAAa,EACb,KAAK,EACL,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAC5D,OAAO,WAAW,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Delete an environment by org and slug, returning the deleted resource as protojson. */
2
+ export declare function deleteEnvironment(serverAddress: string, token: string, org: string, slug: string): Promise<string>;
3
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/domains/environments/delete.ts"],"names":[],"mappings":"AAeA,0FAA0F;AAC1F,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
@@ -0,0 +1,36 @@
1
+ // Environment delete path: resolve org/slug → id via the Query controller,
2
+ // then delete via the Command controller, both over a single shared transport.
3
+ // Like McpServer, the command controller takes the generic
4
+ // ApiResourceDeleteInput{resource_id}.
5
+ import { createClient } from "@connectrpc/connect";
6
+ import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
7
+ import { EnvironmentCommandController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/command_pb";
8
+ import { EnvironmentQueryController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/query_pb";
9
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
10
+ import { withTransport } from "../client.js";
11
+ import { toProtoJson } from "../marshal.js";
12
+ import { rpcError } from "../rpcerr.js";
13
+ /** Delete an environment by org and slug, returning the deleted resource as protojson. */
14
+ export async function deleteEnvironment(serverAddress, token, org, slug) {
15
+ const desc = `environment "${slug}" in org "${org}"`;
16
+ return withTransport(serverAddress, token, async (transport, callOptions) => {
17
+ const query = createClient(EnvironmentQueryController, transport);
18
+ let id;
19
+ try {
20
+ const environment = await query.getByReference({ org, kind: ApiResourceKind.environment, slug }, callOptions);
21
+ id = environment.metadata?.id ?? "";
22
+ }
23
+ catch (err) {
24
+ throw rpcError(err, desc);
25
+ }
26
+ const command = createClient(EnvironmentCommandController, transport);
27
+ try {
28
+ const deleted = await command.delete({ resourceId: id }, callOptions);
29
+ return toProtoJson(EnvironmentSchema, deleted);
30
+ }
31
+ catch (err) {
32
+ throw rpcError(err, desc);
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/domains/environments/delete.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,2DAA2D;AAC3D,uCAAuC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0DAA0D,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,EAAE,0BAA0B,EAAE,MAAM,4DAA4D,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAEtH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,aAAqB,EACrB,KAAa,EACb,GAAW,EACX,IAAY;IAEZ,MAAM,IAAI,GAAG,gBAAgB,IAAI,aAAa,GAAG,GAAG,CAAC;IACrD,OAAO,aAAa,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE;QAC1E,MAAM,KAAK,GAAG,YAAY,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;QAClE,IAAI,EAAU,CAAC;QACf,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,cAAc,CAC5C,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,EAAE,IAAI,EAAE,EAChD,WAAW,CACZ,CAAC;YACF,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,OAAO,GAAG,YAAY,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;YACtE,OAAO,WAAW,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Retrieve an environment by org and slug, returning its protojson
3
+ * representation (secret values arrive already redacted by the server).
4
+ */
5
+ export declare function fetchEnvironment(serverAddress: string, token: string, org: string, slug: string): Promise<string>;
6
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/domains/environments/fetch.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAYjB"}
@@ -0,0 +1,30 @@
1
+ // Environment read path: the single RPC both the get_environment tool and the
2
+ // environment resource template delegate to.
3
+ //
4
+ // Secret handling happens entirely server-side: the response pipeline replaces
5
+ // every is_secret value with the ***REDACTED*** sentinel before it leaves the
6
+ // server (backend environment domain, preserve_redacted_secrets.go), so this
7
+ // layer adds no redaction logic of its own — the server is the single
8
+ // enforcement point.
9
+ import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
10
+ import { EnvironmentQueryController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/query_pb";
11
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
12
+ import { withClient } from "../client.js";
13
+ import { toProtoJson } from "../marshal.js";
14
+ import { rpcError } from "../rpcerr.js";
15
+ /**
16
+ * Retrieve an environment by org and slug, returning its protojson
17
+ * representation (secret values arrive already redacted by the server).
18
+ */
19
+ export async function fetchEnvironment(serverAddress, token, org, slug) {
20
+ return withClient(EnvironmentQueryController, serverAddress, token, async (client, callOptions) => {
21
+ try {
22
+ const environment = await client.getByReference({ org, kind: ApiResourceKind.environment, slug }, callOptions);
23
+ return toProtoJson(EnvironmentSchema, environment);
24
+ }
25
+ catch (err) {
26
+ throw rpcError(err, `environment "${slug}" in org "${org}"`);
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/domains/environments/fetch.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6CAA6C;AAC7C,EAAE;AACF,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAC7E,sEAAsE;AACtE,qBAAqB;AAErB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0DAA0D,CAAC;AAC7F,OAAO,EAAE,0BAA0B,EAAE,MAAM,4DAA4D,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAEtH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,KAAa,EACb,GAAW,EACX,IAAY;IAEZ,OAAO,UAAU,CAAC,0BAA0B,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE;QAChG,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,cAAc,CAC7C,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,EAAE,IAAI,EAAE,EAChD,WAAW,CACZ,CAAC;YACF,OAAO,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,GAAG,EAAE,gBAAgB,IAAI,aAAa,GAAG,GAAG,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { BackendTarget } from "../client.js";
3
+ /** Register the environment resource template; returns the registered resource names. */
4
+ export declare function registerEnvironmentResources(server: McpServer, target: BackendTarget): string[];
5
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/domains/environments/resources.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,yFAAyF;AACzF,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CAW/F"}
@@ -0,0 +1,16 @@
1
+ // Environment resource template (stigmer://environments/{org}/{slug}).
2
+ import { registerResource } from "../resourcehandler.js";
3
+ import { fetchEnvironment } from "./fetch.js";
4
+ /** Register the environment resource template; returns the registered resource names. */
5
+ export function registerEnvironmentResources(server, target) {
6
+ registerResource(server, target, {
7
+ name: "stigmer_environment",
8
+ title: "Stigmer Environment",
9
+ description: "Full definition of a Stigmer environment, identified by organization and slug. " +
10
+ "Secret values are redacted.",
11
+ template: "stigmer://environments/{org}/{slug}",
12
+ fetch: fetchEnvironment,
13
+ });
14
+ return ["stigmer_environment"];
15
+ }
16
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/domains/environments/resources.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAKvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,yFAAyF;AACzF,MAAM,UAAU,4BAA4B,CAAC,MAAiB,EAAE,MAAqB;IACnF,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE;QAC/B,IAAI,EAAE,qBAAqB;QAC3B,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,iFAAiF;YACjF,6BAA6B;QAC/B,QAAQ,EAAE,qCAAqC;QAC/C,KAAK,EAAE,gBAAgB;KACxB,CAAC,CAAC;IACH,OAAO,CAAC,qBAAqB,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type BackendTarget } from "../client.js";
3
+ /** Register every Environment-domain tool; returns the registered tool names. */
4
+ export declare function registerEnvironmentTools(server: McpServer, target: BackendTarget): string[];
5
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/domains/environments/tools.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAMhE,iFAAiF;AACjF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CA0D3F"}
@@ -0,0 +1,51 @@
1
+ // MCP tools for the Environment domain. Environments hold the configuration
2
+ // and secrets that agents, workflows, and MCP servers resolve at runtime —
3
+ // without these tools, an assistant authoring an agent hits a dead end the
4
+ // moment env config is involved.
5
+ //
6
+ // The secret contract every description teaches: reads return secret values
7
+ // redacted to ***REDACTED*** (server-enforced); an apply that echoes the
8
+ // marker back preserves the existing secret, so get → edit → apply is always
9
+ // safe. Secret values are only ever sent when setting or rotating them, and
10
+ // they can never be read back through MCP.
11
+ import { z } from "zod";
12
+ import { EnvironmentInputShape } from "../../gen/environment.js";
13
+ import { resolveToken } from "../client.js";
14
+ import { textOrError } from "../toolresult.js";
15
+ import { applyEnvironment } from "./apply.js";
16
+ import { deleteEnvironment } from "./delete.js";
17
+ import { fetchEnvironment } from "./fetch.js";
18
+ /** Register every Environment-domain tool; returns the registered tool names. */
19
+ export function registerEnvironmentTools(server, target) {
20
+ server.registerTool("get_environment", {
21
+ description: "Get full details of a Stigmer environment by its org and slug, including its variable " +
22
+ "declarations. Secret values are redacted to ***REDACTED*** — they can never be read " +
23
+ "back through this tool.",
24
+ inputSchema: {
25
+ org: z.string().describe("Organization slug that owns the environment (e.g. stigmer)."),
26
+ slug: z
27
+ .string()
28
+ .describe("Environment slug — the unique identifier within the org (e.g. github-creds)."),
29
+ },
30
+ }, (args, extra) => textOrError(() => fetchEnvironment(target.serverAddress, resolveToken(extra, target.apiKey), args.org, args.slug)));
31
+ server.registerTool("apply_environment", {
32
+ description: "Create or update a Stigmer environment (idempotent). The spec is applied in full, so " +
33
+ "include every variable the environment should keep. When updating, secret values read " +
34
+ "back as ***REDACTED*** — echoing that marker preserves the existing secret, so a " +
35
+ "get → edit → apply round-trip never destroys secrets; send a real value only to set " +
36
+ "or rotate one.",
37
+ inputSchema: EnvironmentInputShape,
38
+ }, (args, extra) => textOrError(() => applyEnvironment(target.serverAddress, resolveToken(extra, target.apiKey), args)));
39
+ server.registerTool("delete_environment", {
40
+ description: "Delete a Stigmer environment by its org and slug. Returns the deleted environment. " +
41
+ "Agents and workflows referencing it will fail to resolve their variables at run time.",
42
+ inputSchema: {
43
+ org: z.string().describe("Organization slug that owns the environment (e.g. stigmer)."),
44
+ slug: z
45
+ .string()
46
+ .describe("Environment slug — the unique identifier within the org (e.g. github-creds)."),
47
+ },
48
+ }, (args, extra) => textOrError(() => deleteEnvironment(target.serverAddress, resolveToken(extra, target.apiKey), args.org, args.slug)));
49
+ return ["get_environment", "apply_environment", "delete_environment"];
50
+ }
51
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/domains/environments/tools.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,2EAA2E;AAC3E,2EAA2E;AAC3E,iCAAiC;AACjC,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,4EAA4E;AAC5E,2CAA2C;AAG3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAsB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,iFAAiF;AACjF,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAqB;IAC/E,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EACT,wFAAwF;YACxF,sFAAsF;YACtF,yBAAyB;QAC3B,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;YACvF,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CAAC,8EAA8E,CAAC;SAC5F;KACF,EACD,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,WAAW,CAAC,GAAG,EAAE,CACf,gBAAgB,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAChG,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,WAAW,EACT,uFAAuF;YACvF,wFAAwF;YACxF,mFAAmF;YACnF,sFAAsF;YACtF,gBAAgB;QAClB,WAAW,EAAE,qBAAqB;KACnC,EACD,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,WAAW,CAAC,GAAG,EAAE,CACf,gBAAgB,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CACjF,CACJ,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EACT,qFAAqF;YACrF,uFAAuF;QACzF,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;YACvF,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,CAAC,8EAA8E,CAAC;SAC5F;KACF,EACD,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,WAAW,CAAC,GAAG,EAAE,CACf,iBAAiB,CAAC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CACjG,CACJ,CAAC;IAEF,OAAO,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Cancel an execution of either kind. Returns a wrapper documenting whether a
3
+ * cancel was actually issued: `{"already_terminal": bool, "execution": …}`.
4
+ * Agent executions are returned in the compact projection (their status embeds
5
+ * the full message history); workflow executions as plain protojson, matching
6
+ * get_workflow_execution.
7
+ */
8
+ export declare function cancelExecution(serverAddress: string, token: string, executionId: string, reason: string): Promise<string>;
9
+ //# sourceMappingURL=cancel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../../src/domains/executions/cancel.ts"],"names":[],"mappings":"AA+DA;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAIjB"}
@@ -0,0 +1,114 @@
1
+ // Cross-kind execution cancellation for the cancel_execution tool.
2
+ //
3
+ // Executions are the one place the MCP surface routes on ID prefix rather
4
+ // than a kind argument: agent (aex_*) and workflow (wex_*) executions live on
5
+ // dedicated controllers but cancel with identical arguments, so one tool
6
+ // serves both — mirroring the CLI's routing seam
7
+ // (client-apps/cli/src/resources/execution.ts), including its cancel
8
+ // semantics: read the execution first and short-circuit with
9
+ // "already terminal" instead of issuing a futile cancel, so the
10
+ // success/no-op distinction comes from authoritative state.
11
+ import { createClient } from "@connectrpc/connect";
12
+ import { AgentExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/command_pb";
13
+ import { ExecutionPhase as AgentExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
14
+ import { AgentExecutionQueryController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/query_pb";
15
+ import { WorkflowExecutionSchema, } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
16
+ import { WorkflowExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/command_pb";
17
+ import { ExecutionPhase as WorkflowExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
18
+ import { WorkflowExecutionQueryController } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/query_pb";
19
+ import { compactExecution, DEFAULT_MESSAGE_LIMIT } from "../agentexecutions/fetch.js";
20
+ import { withTransport } from "../client.js";
21
+ import { toProtoJson } from "../marshal.js";
22
+ import { rpcError } from "../rpcerr.js";
23
+ // Terminal phases per kind. The two ExecutionPhase enums live in different
24
+ // proto packages with different numeric values (agent TERMINATED is 8,
25
+ // workflow TERMINATED is 6), so these are deliberately separate sets.
26
+ const TERMINAL_AGENT_PHASES = new Set([
27
+ AgentExecutionPhase.EXECUTION_COMPLETED,
28
+ AgentExecutionPhase.EXECUTION_FAILED,
29
+ AgentExecutionPhase.EXECUTION_CANCELLED,
30
+ AgentExecutionPhase.EXECUTION_TERMINATED,
31
+ ]);
32
+ const TERMINAL_WORKFLOW_PHASES = new Set([
33
+ WorkflowExecutionPhase.EXECUTION_COMPLETED,
34
+ WorkflowExecutionPhase.EXECUTION_FAILED,
35
+ WorkflowExecutionPhase.EXECUTION_CANCELLED,
36
+ WorkflowExecutionPhase.EXECUTION_TERMINATED,
37
+ ]);
38
+ /**
39
+ * Resolve an execution ID to its controller family by prefix. Matching is
40
+ * case-sensitive and accepts both separators the backend does ("_" canonical,
41
+ * "-" legacy), mirroring the CLI's resolveExecutionType.
42
+ */
43
+ function resolveExecutionType(id) {
44
+ const trimmed = id.trim();
45
+ if (trimmed.startsWith("aex_") || trimmed.startsWith("aex-"))
46
+ return "agent";
47
+ if (trimmed.startsWith("wex_") || trimmed.startsWith("wex-"))
48
+ return "workflow";
49
+ throw new Error(`unrecognized execution ID format: ${id}\n\n` +
50
+ "Expected formats:\n" +
51
+ " Agent execution: aex_<26-char-ulid>\n" +
52
+ " Workflow execution: wex_<26-char-ulid>");
53
+ }
54
+ /**
55
+ * Cancel an execution of either kind. Returns a wrapper documenting whether a
56
+ * cancel was actually issued: `{"already_terminal": bool, "execution": …}`.
57
+ * Agent executions are returned in the compact projection (their status embeds
58
+ * the full message history); workflow executions as plain protojson, matching
59
+ * get_workflow_execution.
60
+ */
61
+ export async function cancelExecution(serverAddress, token, executionId, reason) {
62
+ return resolveExecutionType(executionId) === "agent"
63
+ ? cancelAgentExecution(serverAddress, token, executionId, reason)
64
+ : cancelWorkflowExecution(serverAddress, token, executionId, reason);
65
+ }
66
+ async function cancelAgentExecution(serverAddress, token, id, reason) {
67
+ const desc = `agent execution "${id}"`;
68
+ return withTransport(serverAddress, token, async (transport, callOptions) => {
69
+ try {
70
+ const query = createClient(AgentExecutionQueryController, transport);
71
+ const current = await query.get({ value: id }, callOptions);
72
+ const phase = current.status?.phase ?? AgentExecutionPhase.EXECUTION_PHASE_UNSPECIFIED;
73
+ if (TERMINAL_AGENT_PHASES.has(phase)) {
74
+ return wrapAgent(current, true);
75
+ }
76
+ const command = createClient(AgentExecutionCommandController, transport);
77
+ const cancelled = await command.cancel({ id, reason }, callOptions);
78
+ return wrapAgent(cancelled, false);
79
+ }
80
+ catch (err) {
81
+ throw rpcError(err, desc);
82
+ }
83
+ });
84
+ }
85
+ async function cancelWorkflowExecution(serverAddress, token, id, reason) {
86
+ const desc = `workflow execution "${id}"`;
87
+ return withTransport(serverAddress, token, async (transport, callOptions) => {
88
+ try {
89
+ const query = createClient(WorkflowExecutionQueryController, transport);
90
+ const current = await query.get({ value: id }, callOptions);
91
+ const phase = current.status?.phase ?? WorkflowExecutionPhase.EXECUTION_PHASE_UNSPECIFIED;
92
+ if (TERMINAL_WORKFLOW_PHASES.has(phase)) {
93
+ return wrapWorkflow(current, true);
94
+ }
95
+ const command = createClient(WorkflowExecutionCommandController, transport);
96
+ const cancelled = await command.cancel({ id, reason }, callOptions);
97
+ return wrapWorkflow(cancelled, false);
98
+ }
99
+ catch (err) {
100
+ throw rpcError(err, desc);
101
+ }
102
+ });
103
+ }
104
+ function wrapAgent(execution, alreadyTerminal) {
105
+ const { totalMessages, data } = compactExecution(execution, DEFAULT_MESSAGE_LIMIT);
106
+ return JSON.stringify({ already_terminal: alreadyTerminal, view: "compact", total_messages: totalMessages, execution: data }, null, 2);
107
+ }
108
+ function wrapWorkflow(execution, alreadyTerminal) {
109
+ return JSON.stringify({
110
+ already_terminal: alreadyTerminal,
111
+ execution: JSON.parse(toProtoJson(WorkflowExecutionSchema, execution)),
112
+ }, null, 2);
113
+ }
114
+ //# sourceMappingURL=cancel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel.js","sourceRoot":"","sources":["../../../src/domains/executions/cancel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type BackendTarget } from "../client.js";
3
+ /** Register the cross-kind execution-control tools; returns the registered tool names. */
4
+ export declare function registerExecutionControlTools(server: McpServer, target: BackendTarget): string[];
5
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/domains/executions/tools.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAIhE,0FAA0F;AAC1F,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,EAAE,CA6BhG"}
@@ -0,0 +1,28 @@
1
+ // Cross-kind execution-control tools. Currently just cancel_execution — the
2
+ // one control verb whose argument shape is identical for agent and workflow
3
+ // executions, so a single ID-prefix-dispatched tool serves both (the
4
+ // "crisp schemas over fewer tools" principle cuts the other way for
5
+ // approvals, whose shapes are disjoint). pause/resume/terminate stay
6
+ // CLI-only until a real MCP need shows up.
7
+ import { z } from "zod";
8
+ import { resolveToken } from "../client.js";
9
+ import { textOrError } from "../toolresult.js";
10
+ import { cancelExecution } from "./cancel.js";
11
+ /** Register the cross-kind execution-control tools; returns the registered tool names. */
12
+ export function registerExecutionControlTools(server, target) {
13
+ server.registerTool("cancel_execution", {
14
+ description: "Gracefully cancel a running agent (aex_*) or workflow (wex_*) execution — the kind is " +
15
+ "inferred from the ID prefix. Cancellation is terminal: the run stops after cleanup and " +
16
+ "cannot be resumed. Executions already in a terminal phase are returned with " +
17
+ "already_terminal=true instead of an error.",
18
+ inputSchema: {
19
+ execution_id: z.string().describe("Execution ID to cancel (aex_* or wex_* format)."),
20
+ reason: z
21
+ .string()
22
+ .optional()
23
+ .describe("Human-readable reason for the cancellation, stored in the audit trail."),
24
+ },
25
+ }, (args, extra) => textOrError(() => cancelExecution(target.serverAddress, resolveToken(extra, target.apiKey), args.execution_id, args.reason ?? "")));
26
+ return ["cancel_execution"];
27
+ }
28
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/domains/executions/tools.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,qEAAqE;AACrE,oEAAoE;AACpE,qEAAqE;AACrE,2CAA2C;AAG3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAsB,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,0FAA0F;AAC1F,MAAM,UAAU,6BAA6B,CAAC,MAAiB,EAAE,MAAqB;IACpF,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EACT,wFAAwF;YACxF,yFAAyF;YACzF,8EAA8E;YAC9E,4CAA4C;QAC9C,WAAW,EAAE;YACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;YACpF,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wEAAwE,CAAC;SACtF;KACF,EACD,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,WAAW,CAAC,GAAG,EAAE,CACf,eAAe,CACb,MAAM,CAAC,aAAa,EACpB,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAClC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,MAAM,IAAI,EAAE,CAClB,CACF,CACJ,CAAC;IAEF,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC9B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/domains/records/tools.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAWhE,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAyBpD,+EAA+E;AAC/E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,kBAAkB,GAC3B,MAAM,EAAE,CA0IV"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/domains/records/tools.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAWhE,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAyBpD,+EAA+E;AAC/E,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,kBAAkB,GAC3B,MAAM,EAAE,CA8IV"}
@@ -54,8 +54,10 @@ export function registerRecordTools(server, target, audience) {
54
54
  server.registerTool("describe_datastore", {
55
55
  description: "Describe a datastore: its collections, field declarations and encodings, constraint " +
56
56
  "messages, data partitions, and the verbs you are allowed to use per collection " +
57
- "(empty access means you are not allowed to touch that collection). Call this before " +
58
- `the first record operation against an unfamiliar datastore. ${ENCODINGS}`,
57
+ "(empty access means you are not allowed to touch that collection). A read verb may " +
58
+ "carry readable_fields: reads then return only those fields, and only they may appear " +
59
+ "in filter conditions and order_by (empty readable_fields means every field). Call " +
60
+ `this before the first record operation against an unfamiliar datastore. ${ENCODINGS}`,
59
61
  inputSchema: {
60
62
  datastore: z.string().describe("Datastore slug (e.g. clinic)."),
61
63
  ...orgShape,
@@ -65,7 +67,9 @@ export function registerRecordTools(server, target, audience) {
65
67
  server.registerTool("find_records", {
66
68
  description: "Find records in a datastore collection with a typed filter (conditions are AND-combined). " +
67
69
  "Returns records plus total/limit/offset for paging. Results are ordered by created_at " +
68
- `descending unless order_by is given. ${ENCODINGS}`,
70
+ "descending unless order_by is given. Records carry only the fields your grant allows " +
71
+ "(describe_datastore lists them as readable_fields); conditions and order_by on other " +
72
+ `fields are rejected. ${ENCODINGS}`,
69
73
  inputSchema: {
70
74
  datastore: z.string().describe("Datastore slug (e.g. clinic)."),
71
75
  ...orgShape,