@stigmer/cli 3.3.0 → 3.4.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/commands/delete.js +5 -2
- package/commands/delete.js.map +1 -1
- package/package.json +5 -5
- package/resources/delete.d.ts +5 -1
- package/resources/delete.d.ts.map +1 -1
- package/resources/delete.js +40 -8
- package/resources/delete.js.map +1 -1
- package/resources/get-bindings.d.ts.map +1 -1
- package/resources/get-bindings.js +8 -0
- package/resources/get-bindings.js.map +1 -1
- package/src/commands/delete.ts +5 -2
- package/src/resources/delete.ts +48 -9
- package/src/resources/get-bindings.ts +8 -0
- package/src/resources/mutate-verbs.integration.test.ts +178 -1
- package/src/resources/read-verbs.integration.test.ts +111 -1
package/commands/delete.js
CHANGED
|
@@ -11,7 +11,7 @@ export function registerDelete(program) {
|
|
|
11
11
|
const del = program
|
|
12
12
|
.command("delete <type> <reference>")
|
|
13
13
|
.description("delete a resource by type and reference (slug, org/slug, or ID)")
|
|
14
|
-
.option("-f, --force", "skip the confirmation prompt")
|
|
14
|
+
.option("-f, --force", "skip the confirmation prompt and acknowledge destructive side effects (e.g. destroying a datastore's records)")
|
|
15
15
|
.action((type, reference, options, command) => runDelete(type, reference, options, command));
|
|
16
16
|
addResultFlags(del);
|
|
17
17
|
}
|
|
@@ -26,7 +26,10 @@ async function runDelete(type, reference, options, command) {
|
|
|
26
26
|
const client = connectBackend();
|
|
27
27
|
ensureAuthenticated(client.config);
|
|
28
28
|
const org = resolveOrganization(client.config, globalOrg(command));
|
|
29
|
-
|
|
29
|
+
// `-f/--force` carries double duty by design: it skips the prompt below AND
|
|
30
|
+
// rides the delete RPC as the force acknowledgment for kinds with
|
|
31
|
+
// server-side destruction guards (e.g. a non-empty datastore).
|
|
32
|
+
const plan = await planDelete(client.stigmer, type, reference, org, options.force === true);
|
|
30
33
|
if (options.force !== true) {
|
|
31
34
|
renderResult(plan.warning, format);
|
|
32
35
|
const confirmed = await confirm(plan.confirmPrompt);
|
package/commands/delete.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,qDAAqD;AAGrD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMtE,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,2BAA2B,CAAC;SACpC,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,qDAAqD;AAGrD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMtE,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,GAAG,GAAG,OAAO;SAChB,OAAO,CAAC,2BAA2B,CAAC;SACpC,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,aAAa,EAAE,+GAA+G,CAAC;SACtI,MAAM,CAAC,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAoB,EAAE,OAAgB,EAAE,EAAE,CAClF,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAC7C,CAAC;IACJ,cAAc,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,SAAiB,EAAE,OAAoB,EAAE,OAAgB;IAC9F,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAErC,MAAM,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5F,MAAM,CAAC,eAAe,CAAC;QACvB,MAAM,CAAC,wBAAwB,CAAC;QAChC,MAAM,CAAC,sBAAsB,CAAC;QAC9B,MAAM,CAAC,6BAA6B,CAAC;KACtC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAEnE,4EAA4E;IAC5E,kEAAkE;IAClE,+DAA+D;IAC/D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAE5F,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC3B,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,kEAAkE;YAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;IACH,CAAC;IAED,YAAY,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stigmer/cli",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "Stigmer command-line interface — manage agents, workflows, MCP servers, skills, and executions from the terminal",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"@connectrpc/connect": "^2.0.0",
|
|
36
36
|
"@connectrpc/connect-node": "^2.1.1",
|
|
37
37
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
38
|
-
"@stigmer/ink": "3.
|
|
39
|
-
"@stigmer/mcp-server": "3.
|
|
40
|
-
"@stigmer/protos": "3.
|
|
41
|
-
"@stigmer/sdk": "3.
|
|
38
|
+
"@stigmer/ink": "3.4.0",
|
|
39
|
+
"@stigmer/mcp-server": "3.4.0",
|
|
40
|
+
"@stigmer/protos": "3.4.0",
|
|
41
|
+
"@stigmer/sdk": "3.4.0",
|
|
42
42
|
"commander": "^12.1.0",
|
|
43
43
|
"fflate": "^0.8.3",
|
|
44
44
|
"ink": "^7.0.0",
|
package/resources/delete.d.ts
CHANGED
|
@@ -13,6 +13,10 @@ export interface DeletePlan {
|
|
|
13
13
|
* Build the delete plan for a `<type> <reference>` pair. Routes the three
|
|
14
14
|
* special cases first, then the registry-driven standard path. Throws on
|
|
15
15
|
* unknown/unsupported types before any network call.
|
|
16
|
+
*
|
|
17
|
+
* `force` is the caller's acknowledgment of destructive side effects; it rides
|
|
18
|
+
* the delete RPC for kinds whose contract carries a force field (see
|
|
19
|
+
* DELETE_HANDLERS). The command layer maps `-f/--force` onto it.
|
|
16
20
|
*/
|
|
17
|
-
export declare function planDelete(client: Stigmer, typeArg: string, reference: string, org: string): Promise<DeletePlan>;
|
|
21
|
+
export declare function planDelete(client: Stigmer, typeArg: string, reference: string, org: string, force?: boolean): Promise<DeletePlan>;
|
|
18
22
|
//# sourceMappingURL=delete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/resources/delete.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,gEAAgE;IAChE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,0DAA0D;IAC1D,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/resources/delete.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAOnD,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,gEAAgE;IAChE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,0DAA0D;IAC1D,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACnC;AAgDD;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,UAAQ,GACZ,OAAO,CAAC,UAAU,CAAC,CAwBrB"}
|
package/resources/delete.js
CHANGED
|
@@ -27,30 +27,51 @@ import { getterFor } from "./get-bindings.js";
|
|
|
27
27
|
import { parseReference } from "./reference.js";
|
|
28
28
|
// Kinds the unified delete handles directly, each bound to its SDK delete call.
|
|
29
29
|
// Kinds that carry a Delete verb but no entry here (identity_provider,
|
|
30
|
-
// oauth_app,
|
|
30
|
+
// oauth_app, agent_share, workflow_instance, session) fall through to a
|
|
31
31
|
// "not implemented" usage error, matching Go's default branch.
|
|
32
|
-
//
|
|
32
|
+
// Kinds whose delete takes a DeleteResourceInput (not an ID) thread the force
|
|
33
|
+
// acknowledgment through; today only the datastore server honors it (the
|
|
34
|
+
// non-empty guard), but force is the contract's generic ack carrier.
|
|
33
35
|
const DELETE_HANDLERS = new Map([
|
|
34
36
|
[ApiResourceKind.agent, (c, id) => c.agent.delete(id)],
|
|
35
37
|
[ApiResourceKind.agent_instance, (c, id) => c.agentInstance.delete(id)],
|
|
36
38
|
[ApiResourceKind.workflow, (c, id) => c.workflow.delete(id)],
|
|
37
|
-
[ApiResourceKind.mcp_server, (c, id) => c.mcpServer.delete({ resourceId: id })],
|
|
39
|
+
[ApiResourceKind.mcp_server, (c, id, force) => c.mcpServer.delete({ resourceId: id, force })],
|
|
38
40
|
[ApiResourceKind.project, (c, id) => c.project.delete(id)],
|
|
41
|
+
[ApiResourceKind.datastore, (c, id, force) => c.datastore.delete({ resourceId: id, force })],
|
|
42
|
+
[ApiResourceKind.environment, (c, id, force) => c.environment.delete({ resourceId: id, force })],
|
|
43
|
+
[ApiResourceKind.agent_channel, (c, id) => c.agentChannel.delete(id)],
|
|
44
|
+
[ApiResourceKind.channel_app, (c, id, force) => c.channelapp.delete({ resourceId: id, force })],
|
|
39
45
|
[ApiResourceKind.skill, (c, id) => c.skill.delete(id)],
|
|
40
46
|
[ApiResourceKind.api_key, (c, id) => c.apiKey.delete(id)],
|
|
41
47
|
]);
|
|
48
|
+
// The deletable-types list for the unknown-type error, derived from the
|
|
49
|
+
// handler map (plus the two special-cased routes) so it can never drift from
|
|
50
|
+
// what the dispatch below actually supports. Deliberately NOT derived from the
|
|
51
|
+
// registry's verb matrix — that declares Delete for kinds this dispatch does
|
|
52
|
+
// not wire, and listing those would over-promise.
|
|
53
|
+
function availableDeleteTypes() {
|
|
54
|
+
const wired = [...DELETE_HANDLERS.keys()]
|
|
55
|
+
.map((kind) => defaultRegistry().getByKind(kind)?.singular)
|
|
56
|
+
.filter((singular) => singular !== undefined);
|
|
57
|
+
return [...wired, "execution", "organization"].join(", ");
|
|
58
|
+
}
|
|
42
59
|
/**
|
|
43
60
|
* Build the delete plan for a `<type> <reference>` pair. Routes the three
|
|
44
61
|
* special cases first, then the registry-driven standard path. Throws on
|
|
45
62
|
* unknown/unsupported types before any network call.
|
|
63
|
+
*
|
|
64
|
+
* `force` is the caller's acknowledgment of destructive side effects; it rides
|
|
65
|
+
* the delete RPC for kinds whose contract carries a force field (see
|
|
66
|
+
* DELETE_HANDLERS). The command layer maps `-f/--force` onto it.
|
|
46
67
|
*/
|
|
47
|
-
export async function planDelete(client, typeArg, reference, org) {
|
|
68
|
+
export async function planDelete(client, typeArg, reference, org, force = false) {
|
|
48
69
|
if (isExecutionAlias(typeArg)) {
|
|
49
70
|
return planExecutionCancel(client, reference);
|
|
50
71
|
}
|
|
51
72
|
const info = defaultRegistry().getByAlias(typeArg);
|
|
52
73
|
if (info === undefined) {
|
|
53
|
-
throw new UsageError(`unknown resource type: ${typeArg}\n\nAvailable types:
|
|
74
|
+
throw new UsageError(`unknown resource type: ${typeArg}\n\nAvailable types: ${availableDeleteTypes()}`);
|
|
54
75
|
}
|
|
55
76
|
if (info.kind === ApiResourceKind.organization) {
|
|
56
77
|
return planOrganizationDelete(client, reference);
|
|
@@ -62,9 +83,9 @@ export async function planDelete(client, typeArg, reference, org) {
|
|
|
62
83
|
if (deleteFn === undefined) {
|
|
63
84
|
throw new UsageError(`delete not implemented for ${info.displayName}`);
|
|
64
85
|
}
|
|
65
|
-
return planStandardDelete(client, info, reference, org, deleteFn);
|
|
86
|
+
return planStandardDelete(client, info, reference, org, deleteFn, force);
|
|
66
87
|
}
|
|
67
|
-
async function planStandardDelete(client, info, reference, org, deleteFn) {
|
|
88
|
+
async function planStandardDelete(client, info, reference, org, deleteFn, force) {
|
|
68
89
|
// Safe by construction: every DELETE_HANDLERS key also has a get binding.
|
|
69
90
|
const getter = getterFor(info.kind);
|
|
70
91
|
if (getter === undefined) {
|
|
@@ -78,7 +99,7 @@ async function planStandardDelete(client, info, reference, org, deleteFn) {
|
|
|
78
99
|
return {
|
|
79
100
|
warning: buildDeleteWarning(info, resource),
|
|
80
101
|
confirmPrompt: "Proceed with deletion? [y/N]",
|
|
81
|
-
perform: async () => buildDeleteSuccess(info, await deleteFn(client, id)),
|
|
102
|
+
perform: async () => buildDeleteSuccess(info, await deleteFn(client, id, force)),
|
|
82
103
|
};
|
|
83
104
|
}
|
|
84
105
|
async function planOrganizationDelete(client, reference) {
|
|
@@ -142,6 +163,17 @@ function buildDeleteWarning(info, message) {
|
|
|
142
163
|
section.field("Tag", tag);
|
|
143
164
|
warning.hint("This will delete the skill and all its versions.");
|
|
144
165
|
}
|
|
166
|
+
if (info.kind === ApiResourceKind.datastore) {
|
|
167
|
+
// Mirrors the server's non-empty guard (GuardNonEmptyStep): the delete of
|
|
168
|
+
// a datastore holding records is refused unless force acknowledges it.
|
|
169
|
+
warning.hint("All records held by this datastore will be destroyed.");
|
|
170
|
+
warning.hint("A datastore holding records is refused unless --force acknowledges destroying them.");
|
|
171
|
+
}
|
|
172
|
+
if (info.kind === ApiResourceKind.agent_channel) {
|
|
173
|
+
// The server's documented distinction: delete is the connection's full
|
|
174
|
+
// teardown; disabling is the config-preserving pause.
|
|
175
|
+
warning.hint("Delete is the connection's full teardown; to pause instead, apply with spec.enabled: false.");
|
|
176
|
+
}
|
|
145
177
|
warning.hint("This action cannot be undone.");
|
|
146
178
|
return warning;
|
|
147
179
|
}
|
package/resources/delete.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/resources/delete.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,4EAA4E;AAC5E,qCAAqC;AACrC,EAAE;AACF,qEAAqE;AACrE,sEAAsE;AACtE,qDAAqD;AACrD,EAAE;AACF,0EAA0E;AAC1E,+EAA+E;AAC/E,4EAA4E;AAC5E,uCAAuC;AACvC,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,sCAAsC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AACtH,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAE9F,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAiB,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9G,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/resources/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bindings.d.ts","sourceRoot":"","sources":["../../src/resources/get-bindings.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-bindings.d.ts","sourceRoot":"","sources":["../../src/resources/get-bindings.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAU/D,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAGtH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAgBjF,wBAAgB,SAAS,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAEnE"}
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
// proto-kind registry and the high-level SDK sub-clients for the `get` verb;
|
|
4
4
|
// the schema travels with the message so rendering stays kind-agnostic.
|
|
5
5
|
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
6
|
+
import { AgentChannelSchema } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
6
7
|
import { AgentInstanceSchema } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/api_pb";
|
|
8
|
+
import { ChannelAppSchema } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/api_pb";
|
|
9
|
+
import { DatastoreSchema } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
|
|
10
|
+
import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
|
|
7
11
|
import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
8
12
|
import { SkillSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/api_pb";
|
|
9
13
|
import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
@@ -17,6 +21,10 @@ const GET_BINDINGS = new Map([
|
|
|
17
21
|
[ApiResourceKind.workflow, refGetter(ApiResourceKind.workflow, WorkflowSchema, (c) => c.workflow)],
|
|
18
22
|
[ApiResourceKind.mcp_server, refGetter(ApiResourceKind.mcp_server, McpServerSchema, (c) => c.mcpServer)],
|
|
19
23
|
[ApiResourceKind.project, refGetter(ApiResourceKind.project, ProjectSchema, (c) => c.project)],
|
|
24
|
+
[ApiResourceKind.datastore, refGetter(ApiResourceKind.datastore, DatastoreSchema, (c) => c.datastore)],
|
|
25
|
+
[ApiResourceKind.environment, refGetter(ApiResourceKind.environment, EnvironmentSchema, (c) => c.environment)],
|
|
26
|
+
[ApiResourceKind.agent_channel, refGetter(ApiResourceKind.agent_channel, AgentChannelSchema, (c) => c.agentChannel)],
|
|
27
|
+
[ApiResourceKind.channel_app, refGetter(ApiResourceKind.channel_app, ChannelAppSchema, (c) => c.channelapp)],
|
|
20
28
|
[ApiResourceKind.skill, refGetter(ApiResourceKind.skill, SkillSchema, (c) => c.skill)],
|
|
21
29
|
[ApiResourceKind.api_key, idOnlyGetter(ApiKeySchema, (c) => c.apiKey, "API keys")],
|
|
22
30
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-bindings.js","sourceRoot":"","sources":["../../src/resources/get-bindings.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"get-bindings.js","sourceRoot":"","sources":["../../src/resources/get-bindings.ts"],"names":[],"mappings":"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"}
|
package/src/commands/delete.ts
CHANGED
|
@@ -19,7 +19,7 @@ export function registerDelete(program: Command): void {
|
|
|
19
19
|
const del = program
|
|
20
20
|
.command("delete <type> <reference>")
|
|
21
21
|
.description("delete a resource by type and reference (slug, org/slug, or ID)")
|
|
22
|
-
.option("-f, --force", "skip the confirmation prompt")
|
|
22
|
+
.option("-f, --force", "skip the confirmation prompt and acknowledge destructive side effects (e.g. destroying a datastore's records)")
|
|
23
23
|
.action((type: string, reference: string, options: DeleteFlags, command: Command) =>
|
|
24
24
|
runDelete(type, reference, options, command),
|
|
25
25
|
);
|
|
@@ -40,7 +40,10 @@ async function runDelete(type: string, reference: string, options: DeleteFlags,
|
|
|
40
40
|
ensureAuthenticated(client.config);
|
|
41
41
|
const org = resolveOrganization(client.config, globalOrg(command));
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
// `-f/--force` carries double duty by design: it skips the prompt below AND
|
|
44
|
+
// rides the delete RPC as the force acknowledgment for kinds with
|
|
45
|
+
// server-side destruction guards (e.g. a non-empty datastore).
|
|
46
|
+
const plan = await planDelete(client.stigmer, type, reference, org, options.force === true);
|
|
44
47
|
|
|
45
48
|
if (options.force !== true) {
|
|
46
49
|
renderResult(plan.warning, format);
|
package/src/resources/delete.ts
CHANGED
|
@@ -45,33 +45,60 @@ interface HasMetadata {
|
|
|
45
45
|
readonly metadata?: { readonly id?: string; readonly name?: string; readonly slug?: string; readonly org?: string };
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
// `force` is the RPC-level acknowledgment of destructive side effects (e.g. a
|
|
49
|
+
// datastore's held records) — distinct from, but carried by, the CLI's
|
|
50
|
+
// `-f/--force` flag. Kinds whose delete RPC takes a plain typed ID have no
|
|
51
|
+
// force field and simply ignore the argument.
|
|
52
|
+
type DeleteFn = (client: Stigmer, id: string, force: boolean) => Promise<HasMetadata>;
|
|
49
53
|
|
|
50
54
|
// Kinds the unified delete handles directly, each bound to its SDK delete call.
|
|
51
55
|
// Kinds that carry a Delete verb but no entry here (identity_provider,
|
|
52
|
-
// oauth_app,
|
|
56
|
+
// oauth_app, agent_share, workflow_instance, session) fall through to a
|
|
53
57
|
// "not implemented" usage error, matching Go's default branch.
|
|
54
|
-
//
|
|
58
|
+
// Kinds whose delete takes a DeleteResourceInput (not an ID) thread the force
|
|
59
|
+
// acknowledgment through; today only the datastore server honors it (the
|
|
60
|
+
// non-empty guard), but force is the contract's generic ack carrier.
|
|
55
61
|
const DELETE_HANDLERS: ReadonlyMap<ApiResourceKind, DeleteFn> = new Map<ApiResourceKind, DeleteFn>([
|
|
56
62
|
[ApiResourceKind.agent, (c, id) => c.agent.delete(id)],
|
|
57
63
|
[ApiResourceKind.agent_instance, (c, id) => c.agentInstance.delete(id)],
|
|
58
64
|
[ApiResourceKind.workflow, (c, id) => c.workflow.delete(id)],
|
|
59
|
-
[ApiResourceKind.mcp_server, (c, id) => c.mcpServer.delete({ resourceId: id })],
|
|
65
|
+
[ApiResourceKind.mcp_server, (c, id, force) => c.mcpServer.delete({ resourceId: id, force })],
|
|
60
66
|
[ApiResourceKind.project, (c, id) => c.project.delete(id)],
|
|
67
|
+
[ApiResourceKind.datastore, (c, id, force) => c.datastore.delete({ resourceId: id, force })],
|
|
68
|
+
[ApiResourceKind.environment, (c, id, force) => c.environment.delete({ resourceId: id, force })],
|
|
69
|
+
[ApiResourceKind.agent_channel, (c, id) => c.agentChannel.delete(id)],
|
|
70
|
+
[ApiResourceKind.channel_app, (c, id, force) => c.channelapp.delete({ resourceId: id, force })],
|
|
61
71
|
[ApiResourceKind.skill, (c, id) => c.skill.delete(id)],
|
|
62
72
|
[ApiResourceKind.api_key, (c, id) => c.apiKey.delete(id)],
|
|
63
73
|
]);
|
|
64
74
|
|
|
75
|
+
// The deletable-types list for the unknown-type error, derived from the
|
|
76
|
+
// handler map (plus the two special-cased routes) so it can never drift from
|
|
77
|
+
// what the dispatch below actually supports. Deliberately NOT derived from the
|
|
78
|
+
// registry's verb matrix — that declares Delete for kinds this dispatch does
|
|
79
|
+
// not wire, and listing those would over-promise.
|
|
80
|
+
function availableDeleteTypes(): string {
|
|
81
|
+
const wired = [...DELETE_HANDLERS.keys()]
|
|
82
|
+
.map((kind) => defaultRegistry().getByKind(kind)?.singular)
|
|
83
|
+
.filter((singular): singular is string => singular !== undefined);
|
|
84
|
+
return [...wired, "execution", "organization"].join(", ");
|
|
85
|
+
}
|
|
86
|
+
|
|
65
87
|
/**
|
|
66
88
|
* Build the delete plan for a `<type> <reference>` pair. Routes the three
|
|
67
89
|
* special cases first, then the registry-driven standard path. Throws on
|
|
68
90
|
* unknown/unsupported types before any network call.
|
|
91
|
+
*
|
|
92
|
+
* `force` is the caller's acknowledgment of destructive side effects; it rides
|
|
93
|
+
* the delete RPC for kinds whose contract carries a force field (see
|
|
94
|
+
* DELETE_HANDLERS). The command layer maps `-f/--force` onto it.
|
|
69
95
|
*/
|
|
70
96
|
export async function planDelete(
|
|
71
97
|
client: Stigmer,
|
|
72
98
|
typeArg: string,
|
|
73
99
|
reference: string,
|
|
74
100
|
org: string,
|
|
101
|
+
force = false,
|
|
75
102
|
): Promise<DeletePlan> {
|
|
76
103
|
if (isExecutionAlias(typeArg)) {
|
|
77
104
|
return planExecutionCancel(client, reference);
|
|
@@ -79,9 +106,7 @@ export async function planDelete(
|
|
|
79
106
|
|
|
80
107
|
const info = defaultRegistry().getByAlias(typeArg);
|
|
81
108
|
if (info === undefined) {
|
|
82
|
-
throw new UsageError(
|
|
83
|
-
`unknown resource type: ${typeArg}\n\nAvailable types: agent, agent-instance, workflow, mcpserver, project, skill, execution, organization`,
|
|
84
|
-
);
|
|
109
|
+
throw new UsageError(`unknown resource type: ${typeArg}\n\nAvailable types: ${availableDeleteTypes()}`);
|
|
85
110
|
}
|
|
86
111
|
|
|
87
112
|
if (info.kind === ApiResourceKind.organization) {
|
|
@@ -97,7 +122,7 @@ export async function planDelete(
|
|
|
97
122
|
throw new UsageError(`delete not implemented for ${info.displayName}`);
|
|
98
123
|
}
|
|
99
124
|
|
|
100
|
-
return planStandardDelete(client, info, reference, org, deleteFn);
|
|
125
|
+
return planStandardDelete(client, info, reference, org, deleteFn, force);
|
|
101
126
|
}
|
|
102
127
|
|
|
103
128
|
async function planStandardDelete(
|
|
@@ -106,6 +131,7 @@ async function planStandardDelete(
|
|
|
106
131
|
reference: string,
|
|
107
132
|
org: string,
|
|
108
133
|
deleteFn: DeleteFn,
|
|
134
|
+
force: boolean,
|
|
109
135
|
): Promise<DeletePlan> {
|
|
110
136
|
// Safe by construction: every DELETE_HANDLERS key also has a get binding.
|
|
111
137
|
const getter = getterFor(info.kind);
|
|
@@ -122,7 +148,7 @@ async function planStandardDelete(
|
|
|
122
148
|
return {
|
|
123
149
|
warning: buildDeleteWarning(info, resource),
|
|
124
150
|
confirmPrompt: "Proceed with deletion? [y/N]",
|
|
125
|
-
perform: async () => buildDeleteSuccess(info, await deleteFn(client, id)),
|
|
151
|
+
perform: async () => buildDeleteSuccess(info, await deleteFn(client, id, force)),
|
|
126
152
|
};
|
|
127
153
|
}
|
|
128
154
|
|
|
@@ -200,6 +226,19 @@ function buildDeleteWarning(info: TypeInfo, message: HasMetadata): CommandResult
|
|
|
200
226
|
warning.hint("This will delete the skill and all its versions.");
|
|
201
227
|
}
|
|
202
228
|
|
|
229
|
+
if (info.kind === ApiResourceKind.datastore) {
|
|
230
|
+
// Mirrors the server's non-empty guard (GuardNonEmptyStep): the delete of
|
|
231
|
+
// a datastore holding records is refused unless force acknowledges it.
|
|
232
|
+
warning.hint("All records held by this datastore will be destroyed.");
|
|
233
|
+
warning.hint("A datastore holding records is refused unless --force acknowledges destroying them.");
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (info.kind === ApiResourceKind.agent_channel) {
|
|
237
|
+
// The server's documented distinction: delete is the connection's full
|
|
238
|
+
// teardown; disabling is the config-preserving pause.
|
|
239
|
+
warning.hint("Delete is the connection's full teardown; to pause instead, apply with spec.enabled: false.");
|
|
240
|
+
}
|
|
241
|
+
|
|
203
242
|
warning.hint("This action cannot be undone.");
|
|
204
243
|
return warning;
|
|
205
244
|
}
|
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
import type { DescMessage, Message } from "@bufbuild/protobuf";
|
|
7
7
|
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
8
|
+
import { AgentChannelSchema } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
8
9
|
import { AgentInstanceSchema } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/api_pb";
|
|
10
|
+
import { ChannelAppSchema } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/api_pb";
|
|
11
|
+
import { DatastoreSchema } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
|
|
12
|
+
import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
|
|
9
13
|
import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
10
14
|
import { SkillSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/api_pb";
|
|
11
15
|
import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
@@ -29,6 +33,10 @@ const GET_BINDINGS: ReadonlyMap<ApiResourceKind, Getter> = new Map([
|
|
|
29
33
|
[ApiResourceKind.workflow, refGetter(ApiResourceKind.workflow, WorkflowSchema, (c) => c.workflow)],
|
|
30
34
|
[ApiResourceKind.mcp_server, refGetter(ApiResourceKind.mcp_server, McpServerSchema, (c) => c.mcpServer)],
|
|
31
35
|
[ApiResourceKind.project, refGetter(ApiResourceKind.project, ProjectSchema, (c) => c.project)],
|
|
36
|
+
[ApiResourceKind.datastore, refGetter(ApiResourceKind.datastore, DatastoreSchema, (c) => c.datastore)],
|
|
37
|
+
[ApiResourceKind.environment, refGetter(ApiResourceKind.environment, EnvironmentSchema, (c) => c.environment)],
|
|
38
|
+
[ApiResourceKind.agent_channel, refGetter(ApiResourceKind.agent_channel, AgentChannelSchema, (c) => c.agentChannel)],
|
|
39
|
+
[ApiResourceKind.channel_app, refGetter(ApiResourceKind.channel_app, ChannelAppSchema, (c) => c.channelapp)],
|
|
32
40
|
[ApiResourceKind.skill, refGetter(ApiResourceKind.skill, SkillSchema, (c) => c.skill)],
|
|
33
41
|
[ApiResourceKind.api_key, idOnlyGetter(ApiKeySchema, (c) => c.apiKey, "API keys")],
|
|
34
42
|
]);
|
|
@@ -16,9 +16,21 @@ import { AgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentex
|
|
|
16
16
|
import { AgentExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/command_pb";
|
|
17
17
|
import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
18
18
|
import { AgentExecutionQueryController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/query_pb";
|
|
19
|
+
import { AgentChannelSchema } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
20
|
+
import { AgentChannelCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/command_pb";
|
|
21
|
+
import { AgentChannelQueryController } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/query_pb";
|
|
19
22
|
import { AgentInstanceSchema } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/api_pb";
|
|
20
23
|
import { AgentInstanceCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/command_pb";
|
|
21
24
|
import { AgentInstanceQueryController } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/query_pb";
|
|
25
|
+
import { ChannelAppSchema } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/api_pb";
|
|
26
|
+
import { ChannelAppCommandController } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/command_pb";
|
|
27
|
+
import { ChannelAppQueryController } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/query_pb";
|
|
28
|
+
import { DatastoreSchema } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
|
|
29
|
+
import { DatastoreCommandController } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/command_pb";
|
|
30
|
+
import { DatastoreQueryController } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/query_pb";
|
|
31
|
+
import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
|
|
32
|
+
import { EnvironmentCommandController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/command_pb";
|
|
33
|
+
import { EnvironmentQueryController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/query_pb";
|
|
22
34
|
import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
23
35
|
import { McpServerCommandController } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/command_pb";
|
|
24
36
|
import { McpServerQueryController } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/query_pb";
|
|
@@ -51,6 +63,28 @@ const knownWorkflow = create(WorkflowSchema, {
|
|
|
51
63
|
metadata: { name: "Deploy", slug: "deploy", org: "acme", id: "wfl_1" },
|
|
52
64
|
});
|
|
53
65
|
|
|
66
|
+
// The mock treats this datastore as NON-EMPTY: delete refuses without the
|
|
67
|
+
// force acknowledgment, mirroring the server's GuardNonEmptyStep contract.
|
|
68
|
+
const knownDatastore = create(DatastoreSchema, {
|
|
69
|
+
metadata: { name: "clinic-records", slug: "clinic-records", org: "acme", id: "dst_1" },
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Byte-shaped like the Go server's GuardNonEmptyStep refusal (delete_guards.go).
|
|
73
|
+
const nonEmptyGuardMessage =
|
|
74
|
+
'datastore "clinic-records" holds 12 records across 3 collections; deleting destroys them — pass force to acknowledge';
|
|
75
|
+
|
|
76
|
+
const knownEnvironment = create(EnvironmentSchema, {
|
|
77
|
+
metadata: { name: "clinic-patient-db", slug: "clinic-patient-db", org: "acme", id: "env_1" },
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const knownChannel = create(AgentChannelSchema, {
|
|
81
|
+
metadata: { name: "clinic-patient-whatsapp", slug: "clinic-patient-whatsapp", org: "acme", id: "ach_1" },
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const knownChannelApp = create(ChannelAppSchema, {
|
|
85
|
+
metadata: { name: "clinic-meta-app", slug: "clinic-meta-app", org: "acme", id: "chapp_1" },
|
|
86
|
+
});
|
|
87
|
+
|
|
54
88
|
// Pending execution (cancellable) vs. an already-terminal one.
|
|
55
89
|
const pendingExecution = create(AgentExecutionSchema, {
|
|
56
90
|
metadata: { id: "aex_run" },
|
|
@@ -72,10 +106,20 @@ const openSessions = new Set<ServerHttp2Session>();
|
|
|
72
106
|
// Spies for the command-side calls, reset per test.
|
|
73
107
|
let cancelCalls: string[] = [];
|
|
74
108
|
let tagCalls: { workflowId: string; versionHash: string; tag: string }[] = [];
|
|
109
|
+
// Force-carrying deletes record what actually rode the RPC.
|
|
110
|
+
let datastoreDeletes: { resourceId: string; force: boolean }[] = [];
|
|
111
|
+
let environmentDeletes: { resourceId: string; force: boolean }[] = [];
|
|
112
|
+
let channelAppDeletes: { resourceId: string; force: boolean }[] = [];
|
|
113
|
+
// agent_channel's delete is a typed ID — no force field exists on the wire.
|
|
114
|
+
let channelDeleteIds: string[] = [];
|
|
75
115
|
|
|
76
116
|
beforeEach(() => {
|
|
77
117
|
cancelCalls = [];
|
|
78
118
|
tagCalls = [];
|
|
119
|
+
datastoreDeletes = [];
|
|
120
|
+
environmentDeletes = [];
|
|
121
|
+
channelAppDeletes = [];
|
|
122
|
+
channelDeleteIds = [];
|
|
79
123
|
});
|
|
80
124
|
|
|
81
125
|
beforeAll(async () => {
|
|
@@ -118,6 +162,60 @@ beforeAll(async () => {
|
|
|
118
162
|
},
|
|
119
163
|
});
|
|
120
164
|
|
|
165
|
+
router.service(DatastoreQueryController, {
|
|
166
|
+
getByReference: (req) => {
|
|
167
|
+
if (req.slug !== "clinic-records") throw new ConnectError("datastore not found", Code.NotFound);
|
|
168
|
+
return knownDatastore;
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
router.service(DatastoreCommandController, {
|
|
172
|
+
delete: (req) => {
|
|
173
|
+
datastoreDeletes.push({ resourceId: req.resourceId, force: req.force });
|
|
174
|
+
// Mirrors GuardNonEmptyStep: a non-empty datastore refuses without force.
|
|
175
|
+
if (!req.force) throw new ConnectError(nonEmptyGuardMessage, Code.FailedPrecondition);
|
|
176
|
+
return knownDatastore;
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
router.service(EnvironmentQueryController, {
|
|
181
|
+
getByReference: (req) => {
|
|
182
|
+
if (req.slug !== "clinic-patient-db") throw new ConnectError("environment not found", Code.NotFound);
|
|
183
|
+
return knownEnvironment;
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
router.service(EnvironmentCommandController, {
|
|
187
|
+
delete: (req) => {
|
|
188
|
+
environmentDeletes.push({ resourceId: req.resourceId, force: req.force });
|
|
189
|
+
return knownEnvironment;
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
router.service(AgentChannelQueryController, {
|
|
194
|
+
getByReference: (req) => {
|
|
195
|
+
if (req.slug !== "clinic-patient-whatsapp") throw new ConnectError("agent channel not found", Code.NotFound);
|
|
196
|
+
return knownChannel;
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
router.service(AgentChannelCommandController, {
|
|
200
|
+
delete: (req) => {
|
|
201
|
+
channelDeleteIds.push(req.value);
|
|
202
|
+
return knownChannel;
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
router.service(ChannelAppQueryController, {
|
|
207
|
+
getByReference: (req) => {
|
|
208
|
+
if (req.slug !== "clinic-meta-app") throw new ConnectError("channel app not found", Code.NotFound);
|
|
209
|
+
return knownChannelApp;
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
router.service(ChannelAppCommandController, {
|
|
213
|
+
delete: (req) => {
|
|
214
|
+
channelAppDeletes.push({ resourceId: req.resourceId, force: req.force });
|
|
215
|
+
return knownChannelApp;
|
|
216
|
+
},
|
|
217
|
+
});
|
|
218
|
+
|
|
121
219
|
router.service(WorkflowQueryController, {
|
|
122
220
|
getByReference: (req) => {
|
|
123
221
|
if (req.slug !== "deploy") throw new ConnectError("workflow not found", Code.NotFound);
|
|
@@ -208,9 +306,17 @@ describe("delete (standard kinds)", () => {
|
|
|
208
306
|
expect(classify(err)?.exitCode).toBe(ExitCode.NotFound);
|
|
209
307
|
});
|
|
210
308
|
|
|
211
|
-
it("rejects an unknown type
|
|
309
|
+
it("rejects an unknown type and lists exactly the wired types", async () => {
|
|
212
310
|
const err = await planDelete(client, "bogus", "x", "acme").catch((e) => e);
|
|
213
311
|
expect(classify(err)?.exitCode).toBe(ExitCode.Usage);
|
|
312
|
+
// The list is derived from DELETE_HANDLERS (+ the two special cases), so
|
|
313
|
+
// it must name the wired kinds and never the declared-but-unwired ones.
|
|
314
|
+
const message = String(err.message);
|
|
315
|
+
for (const wired of ["datastore", "environment", "agentchannel", "channelapp", "execution", "organization"]) {
|
|
316
|
+
expect(message).toContain(wired);
|
|
317
|
+
}
|
|
318
|
+
expect(message).not.toContain("session");
|
|
319
|
+
expect(message).not.toContain("oauthapp");
|
|
214
320
|
});
|
|
215
321
|
|
|
216
322
|
it("rejects a kind that has no delete handler with a usage error", async () => {
|
|
@@ -219,6 +325,77 @@ describe("delete (standard kinds)", () => {
|
|
|
219
325
|
});
|
|
220
326
|
});
|
|
221
327
|
|
|
328
|
+
describe("delete (force acknowledgment)", () => {
|
|
329
|
+
it("threads --force to the datastore delete RPC as the destroy-records ack", async () => {
|
|
330
|
+
const plan = await planDelete(client, "datastore", "clinic-records", "acme", true);
|
|
331
|
+
const result = await plan.perform();
|
|
332
|
+
|
|
333
|
+
expect(result.status).toBe("success");
|
|
334
|
+
expect(result.message).toBe("Datastore deleted successfully");
|
|
335
|
+
expect(datastoreDeletes).toEqual([{ resourceId: "dst_1", force: true }]);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it("surfaces the non-empty guard refusal verbatim when force is absent", async () => {
|
|
339
|
+
const plan = await planDelete(client, "datastore", "clinic-records", "acme");
|
|
340
|
+
const err = await plan.perform().catch((e) => e);
|
|
341
|
+
|
|
342
|
+
// A confirmed-but-unforced delete must NOT bypass the server guard: the
|
|
343
|
+
// RPC carries force=false and the refusal reaches the user verbatim.
|
|
344
|
+
expect(datastoreDeletes).toEqual([{ resourceId: "dst_1", force: false }]);
|
|
345
|
+
const classified = classify(err);
|
|
346
|
+
expect(classified?.exitCode).toBe(ExitCode.Usage);
|
|
347
|
+
expect(classified?.message).toBe(`Precondition failed: ${nonEmptyGuardMessage}`);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it("warns up front that datastore records are destroyed and force-guarded", async () => {
|
|
351
|
+
const plan = await planDelete(client, "datastore", "clinic-records", "acme");
|
|
352
|
+
expect(plan.warning.hints).toContain("All records held by this datastore will be destroyed.");
|
|
353
|
+
expect(plan.warning.hints).toContain(
|
|
354
|
+
"A datastore holding records is refused unless --force acknowledges destroying them.",
|
|
355
|
+
);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
describe("delete (cutover kinds: environment, agent channel, channel app)", () => {
|
|
360
|
+
it("deletes an environment via the DeleteResourceInput shape", async () => {
|
|
361
|
+
const plan = await planDelete(client, "environment", "clinic-patient-db", "acme");
|
|
362
|
+
const result = await plan.perform();
|
|
363
|
+
|
|
364
|
+
expect(result.status).toBe("success");
|
|
365
|
+
expect(result.message).toBe("Environment deleted successfully");
|
|
366
|
+
expect(environmentDeletes).toEqual([{ resourceId: "env_1", force: false }]);
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
it("threads --force through the environment delete (generic ack carrier)", async () => {
|
|
370
|
+
const plan = await planDelete(client, "environment", "clinic-patient-db", "acme", true);
|
|
371
|
+
await plan.perform();
|
|
372
|
+
expect(environmentDeletes).toEqual([{ resourceId: "env_1", force: true }]);
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it("deletes an agent channel via its typed-ID contract, ignoring force gracefully", async () => {
|
|
376
|
+
const plan = await planDelete(client, "agent-channel", "clinic-patient-whatsapp", "acme", true);
|
|
377
|
+
|
|
378
|
+
// The teardown-vs-pause distinction rides the warning (server doc contract).
|
|
379
|
+
expect(plan.warning.hints).toContain(
|
|
380
|
+
"Delete is the connection's full teardown; to pause instead, apply with spec.enabled: false.",
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
const result = await plan.perform();
|
|
384
|
+
expect(result.status).toBe("success");
|
|
385
|
+
expect(result.message).toBe("Agent Channel deleted successfully");
|
|
386
|
+
expect(channelDeleteIds).toEqual(["ach_1"]);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it("deletes a channel app via the DeleteResourceInput shape", async () => {
|
|
390
|
+
const plan = await planDelete(client, "channel-app", "clinic-meta-app", "acme");
|
|
391
|
+
const result = await plan.perform();
|
|
392
|
+
|
|
393
|
+
expect(result.status).toBe("success");
|
|
394
|
+
expect(result.message).toBe("Channel App deleted successfully");
|
|
395
|
+
expect(channelAppDeletes).toEqual([{ resourceId: "chapp_1", force: false }]);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
|
|
222
399
|
describe("delete execution (cancel special case)", () => {
|
|
223
400
|
it("cancels a non-terminal execution", async () => {
|
|
224
401
|
const plan = await planDelete(client, "execution", "aex_run", "");
|
|
@@ -11,8 +11,14 @@ import { Code, ConnectError, type ConnectRouter } from "@connectrpc/connect";
|
|
|
11
11
|
import { connectNodeAdapter } from "@connectrpc/connect-node";
|
|
12
12
|
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
13
13
|
import { AgentQueryController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/query_pb";
|
|
14
|
+
import { AgentChannelSchema } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/api_pb";
|
|
15
|
+
import { AgentChannelQueryController } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/query_pb";
|
|
14
16
|
import { AgentInstanceSchema } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/api_pb";
|
|
15
17
|
import { AgentInstanceQueryController } from "@stigmer/protos/ai/stigmer/agentic/agentinstance/v1/query_pb";
|
|
18
|
+
import { ChannelAppSchema } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/api_pb";
|
|
19
|
+
import { ChannelAppQueryController } from "@stigmer/protos/ai/stigmer/agentic/channelapp/v1/query_pb";
|
|
20
|
+
import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
|
|
21
|
+
import { EnvironmentQueryController } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/query_pb";
|
|
16
22
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
17
23
|
import { ApiKeySchema } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/api_pb";
|
|
18
24
|
import { ApiKeyQueryController } from "@stigmer/protos/ai/stigmer/iam/apikey/v1/query_pb";
|
|
@@ -67,6 +73,26 @@ const knownSearchResult = create(SearchResultSchema, {
|
|
|
67
73
|
description: "reviews code",
|
|
68
74
|
});
|
|
69
75
|
|
|
76
|
+
// The three T07 cutover kinds — wired into get-bindings alongside this test.
|
|
77
|
+
const knownEnvironment = create(EnvironmentSchema, {
|
|
78
|
+
apiVersion: "agentic.stigmer.ai/v1",
|
|
79
|
+
kind: "Environment",
|
|
80
|
+
metadata: { name: "clinic-patient-db", slug: "clinic-patient-db", org: "acme", id: "env_1" },
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const knownChannel = create(AgentChannelSchema, {
|
|
84
|
+
apiVersion: "agentic.stigmer.ai/v1",
|
|
85
|
+
kind: "AgentChannel",
|
|
86
|
+
metadata: { name: "clinic-patient-whatsapp", slug: "clinic-patient-whatsapp", org: "acme", id: "ach_1" },
|
|
87
|
+
spec: { enabled: true },
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
const knownChannelApp = create(ChannelAppSchema, {
|
|
91
|
+
apiVersion: "agentic.stigmer.ai/v1",
|
|
92
|
+
kind: "ChannelApp",
|
|
93
|
+
metadata: { name: "clinic-meta-app", slug: "clinic-meta-app", org: "acme", id: "chapp_1" },
|
|
94
|
+
});
|
|
95
|
+
|
|
70
96
|
let backend: Http2Server;
|
|
71
97
|
let client: Stigmer;
|
|
72
98
|
const openSessions = new Set<ServerHttp2Session>();
|
|
@@ -106,6 +132,36 @@ beforeAll(async () => {
|
|
|
106
132
|
router.service(ApiKeyQueryController, {
|
|
107
133
|
findAll: () => ({ entries: [knownApiKey] }),
|
|
108
134
|
});
|
|
135
|
+
router.service(EnvironmentQueryController, {
|
|
136
|
+
get: (req) => {
|
|
137
|
+
if (req.value !== "env_1") throw new ConnectError("environment not found", Code.NotFound);
|
|
138
|
+
return knownEnvironment;
|
|
139
|
+
},
|
|
140
|
+
getByReference: (req) => {
|
|
141
|
+
if (req.slug !== "clinic-patient-db") throw new ConnectError("environment not found", Code.NotFound);
|
|
142
|
+
return knownEnvironment;
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
router.service(AgentChannelQueryController, {
|
|
146
|
+
get: (req) => {
|
|
147
|
+
if (req.value !== "ach_1") throw new ConnectError("agent channel not found", Code.NotFound);
|
|
148
|
+
return knownChannel;
|
|
149
|
+
},
|
|
150
|
+
getByReference: (req) => {
|
|
151
|
+
if (req.slug !== "clinic-patient-whatsapp") throw new ConnectError("agent channel not found", Code.NotFound);
|
|
152
|
+
return knownChannel;
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
router.service(ChannelAppQueryController, {
|
|
156
|
+
get: (req) => {
|
|
157
|
+
if (req.value !== "chapp_1") throw new ConnectError("channel app not found", Code.NotFound);
|
|
158
|
+
return knownChannelApp;
|
|
159
|
+
},
|
|
160
|
+
getByReference: (req) => {
|
|
161
|
+
if (req.slug !== "clinic-meta-app") throw new ConnectError("channel app not found", Code.NotFound);
|
|
162
|
+
return knownChannelApp;
|
|
163
|
+
},
|
|
164
|
+
});
|
|
109
165
|
};
|
|
110
166
|
backend = createHttp2Server(connectNodeAdapter({ routes }));
|
|
111
167
|
backend.on("session", (session) => {
|
|
@@ -169,6 +225,58 @@ describe("get integration", () => {
|
|
|
169
225
|
});
|
|
170
226
|
});
|
|
171
227
|
|
|
228
|
+
it("fetches an environment by org/slug and renders backend protojson", async () => {
|
|
229
|
+
const { schema, message } = await fetchResource(client, ApiResourceKind.environment, {
|
|
230
|
+
kind: "ref",
|
|
231
|
+
org: "acme",
|
|
232
|
+
slug: "clinic-patient-db",
|
|
233
|
+
});
|
|
234
|
+
const rendered = JSON.parse(renderResource(schema, message, "json"));
|
|
235
|
+
expect(rendered).toEqual(toJson(EnvironmentSchema, knownEnvironment, { useProtoFieldName: true }));
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
it("fetches an environment by ID", async () => {
|
|
239
|
+
const { message } = await fetchResource(client, ApiResourceKind.environment, { kind: "id", id: "env_1" });
|
|
240
|
+
expect(JSON.parse(renderResource(EnvironmentSchema, message, "json"))).toMatchObject({
|
|
241
|
+
metadata: { id: "env_1" },
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("fetches an agent channel by org/slug and renders backend protojson", async () => {
|
|
246
|
+
const { schema, message } = await fetchResource(client, ApiResourceKind.agent_channel, {
|
|
247
|
+
kind: "ref",
|
|
248
|
+
org: "acme",
|
|
249
|
+
slug: "clinic-patient-whatsapp",
|
|
250
|
+
});
|
|
251
|
+
const rendered = JSON.parse(renderResource(schema, message, "json"));
|
|
252
|
+
expect(rendered).toEqual(toJson(AgentChannelSchema, knownChannel, { useProtoFieldName: true }));
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it("fetches an agent channel by ID", async () => {
|
|
256
|
+
const { message } = await fetchResource(client, ApiResourceKind.agent_channel, { kind: "id", id: "ach_1" });
|
|
257
|
+
expect(JSON.parse(renderResource(AgentChannelSchema, message, "json"))).toMatchObject({
|
|
258
|
+
metadata: { id: "ach_1" },
|
|
259
|
+
spec: { enabled: true },
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it("fetches a channel app by org/slug and renders backend protojson", async () => {
|
|
264
|
+
const { schema, message } = await fetchResource(client, ApiResourceKind.channel_app, {
|
|
265
|
+
kind: "ref",
|
|
266
|
+
org: "acme",
|
|
267
|
+
slug: "clinic-meta-app",
|
|
268
|
+
});
|
|
269
|
+
const rendered = JSON.parse(renderResource(schema, message, "json"));
|
|
270
|
+
expect(rendered).toEqual(toJson(ChannelAppSchema, knownChannelApp, { useProtoFieldName: true }));
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it("fetches a channel app by ID", async () => {
|
|
274
|
+
const { message } = await fetchResource(client, ApiResourceKind.channel_app, { kind: "id", id: "chapp_1" });
|
|
275
|
+
expect(JSON.parse(renderResource(ChannelAppSchema, message, "json"))).toMatchObject({
|
|
276
|
+
metadata: { id: "chapp_1" },
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
|
|
172
280
|
it("maps a NotFound backend error to ExitCode.NotFound", async () => {
|
|
173
281
|
const err = await fetchResource(client, ApiResourceKind.agent, { kind: "id", id: "missing" }).catch((e) => e);
|
|
174
282
|
const classified = classify(err);
|
|
@@ -176,7 +284,9 @@ describe("get integration", () => {
|
|
|
176
284
|
});
|
|
177
285
|
|
|
178
286
|
it("rejects an unsupported kind with a usage error", async () => {
|
|
179
|
-
|
|
287
|
+
// session declares Get in the registry but has no get binding — the
|
|
288
|
+
// canonical still-unwired kind (environment gained a binding).
|
|
289
|
+
const err = await fetchResource(client, ApiResourceKind.session, { kind: "id", id: "x" }).catch((e) => e);
|
|
180
290
|
expect(classify(err)?.exitCode).toBe(ExitCode.Usage);
|
|
181
291
|
});
|
|
182
292
|
});
|