@stigmer/cli 3.18.1-dev.20260919070736 → 3.19.1-dev.20260920100552
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/apply.d.ts.map +1 -1
- package/commands/apply.js +45 -101
- package/commands/apply.js.map +1 -1
- package/commands/install.js +2 -1
- package/commands/install.js.map +1 -1
- package/commands/marketplace.js +3 -3
- package/commands/marketplace.js.map +1 -1
- package/commands/push.js +3 -1
- package/commands/push.js.map +1 -1
- package/commands/validate.js +3 -4
- package/commands/validate.js.map +1 -1
- package/local/bootstrap.d.ts +1 -2
- package/local/bootstrap.d.ts.map +1 -1
- package/local/bootstrap.js +13 -41
- package/local/bootstrap.js.map +1 -1
- package/local/daemon/launch.d.ts +2 -2
- package/local/daemon/launch.d.ts.map +1 -1
- package/local/daemon/launch.js +2 -2
- package/local/daemon/launch.js.map +1 -1
- package/local/plugins/defaults.js +2 -2
- package/local/plugins/defaults.js.map +1 -1
- package/marketplace/config.d.ts.map +1 -1
- package/marketplace/config.js +13 -9
- package/marketplace/config.js.map +1 -1
- package/marketplace/render.d.ts.map +1 -1
- package/marketplace/render.js +1 -7
- package/marketplace/render.js.map +1 -1
- package/package.json +7 -7
- package/registry/index.d.ts +2 -2
- package/registry/index.d.ts.map +1 -1
- package/registry/index.js +2 -2
- package/registry/index.js.map +1 -1
- package/registry/metadata.d.ts +9 -0
- package/registry/metadata.d.ts.map +1 -1
- package/registry/metadata.js +14 -5
- package/registry/metadata.js.map +1 -1
- package/registry/registry.d.ts +9 -0
- package/registry/registry.d.ts.map +1 -1
- package/registry/registry.js +16 -1
- package/registry/registry.js.map +1 -1
- package/registry/verb-support.d.ts.map +1 -1
- package/registry/verb-support.js +0 -13
- package/registry/verb-support.js.map +1 -1
- package/resources/apply/apply.d.ts +11 -12
- package/resources/apply/apply.d.ts.map +1 -1
- package/resources/apply/apply.js +12 -21
- package/resources/apply/apply.js.map +1 -1
- package/resources/apply/handlers.js +2 -2
- package/resources/apply/handlers.js.map +1 -1
- package/resources/connect/oauth.d.ts.map +1 -1
- package/resources/connect/oauth.js +4 -1
- package/resources/connect/oauth.js.map +1 -1
- package/resources/delete.d.ts.map +1 -1
- package/resources/delete.js +0 -1
- package/resources/delete.js.map +1 -1
- package/resources/get-bindings.d.ts.map +1 -1
- package/resources/get-bindings.js +0 -5
- package/resources/get-bindings.js.map +1 -1
- package/resources/list.d.ts.map +1 -1
- package/resources/list.js +0 -1
- package/resources/list.js.map +1 -1
- package/resources/plugin.d.ts +27 -0
- package/resources/plugin.d.ts.map +1 -1
- package/resources/plugin.js +113 -8
- package/resources/plugin.js.map +1 -1
- package/resources/validate.d.ts.map +1 -1
- package/resources/validate.js +0 -2
- package/resources/validate.js.map +1 -1
- package/src/commands/apply.ts +40 -150
- package/src/commands/install.test.ts +20 -21
- package/src/commands/install.ts +2 -1
- package/src/commands/marketplace.test.ts +10 -19
- package/src/commands/marketplace.ts +3 -3
- package/src/commands/push.ts +6 -1
- package/src/commands/validate.ts +2 -4
- package/src/local/bootstrap.test.ts +15 -59
- package/src/local/bootstrap.ts +12 -53
- package/src/local/daemon/launch.ts +4 -4
- package/src/local/plugins/defaults.test.ts +28 -28
- package/src/local/plugins/defaults.ts +2 -2
- package/src/marketplace/__fixtures__/cursor-marketplace.ts +16 -12
- package/src/marketplace/config.test.ts +12 -28
- package/src/marketplace/config.ts +13 -9
- package/src/marketplace/install.test.ts +19 -19
- package/src/marketplace/read.test.ts +6 -6
- package/src/marketplace/render.ts +1 -10
- package/src/registry/index.ts +7 -1
- package/src/registry/metadata.ts +15 -5
- package/src/registry/registry.test.ts +1 -7
- package/src/registry/registry.ts +17 -1
- package/src/registry/verb-support.ts +0 -13
- package/src/resources/apply/apply.integration.test.ts +15 -3
- package/src/resources/apply/apply.ts +15 -26
- package/src/resources/apply/handlers.ts +2 -2
- package/src/resources/connect/oauth.test.ts +2 -2
- package/src/resources/connect/oauth.ts +4 -1
- package/src/resources/delete.ts +0 -1
- package/src/resources/get-bindings.ts +0 -5
- package/src/resources/list.ts +0 -1
- package/src/resources/plugin.test.ts +119 -2
- package/src/resources/plugin.ts +140 -8
- package/src/resources/validate.test.ts +0 -1
- package/src/resources/validate.ts +0 -2
- package/local/seedpack-retire.d.ts +0 -63
- package/local/seedpack-retire.d.ts.map +0 -1
- package/local/seedpack-retire.js +0 -361
- package/local/seedpack-retire.js.map +0 -1
- package/resources/apply/declarative.d.ts +0 -106
- package/resources/apply/declarative.d.ts.map +0 -1
- package/resources/apply/declarative.js +0 -397
- package/resources/apply/declarative.js.map +0 -1
- package/resources/apply/synth/project-track.d.ts +0 -21
- package/resources/apply/synth/project-track.d.ts.map +0 -1
- package/resources/apply/synth/project-track.js +0 -102
- package/resources/apply/synth/project-track.js.map +0 -1
- package/resources/apply/synth/reader.d.ts +0 -18
- package/resources/apply/synth/reader.d.ts.map +0 -1
- package/resources/apply/synth/reader.js +0 -55
- package/resources/apply/synth/reader.js.map +0 -1
- package/resources/apply/synth/runtime.d.ts +0 -8
- package/resources/apply/synth/runtime.d.ts.map +0 -1
- package/resources/apply/synth/runtime.js +0 -32
- package/resources/apply/synth/runtime.js.map +0 -1
- package/resources/apply/synth/synthesize.d.ts +0 -43
- package/resources/apply/synth/synthesize.d.ts.map +0 -1
- package/resources/apply/synth/synthesize.js +0 -115
- package/resources/apply/synth/synthesize.js.map +0 -1
- package/src/local/seedpack-retire.test.ts +0 -499
- package/src/local/seedpack-retire.ts +0 -474
- package/src/resources/apply/declarative.integration.test.ts +0 -204
- package/src/resources/apply/declarative.test.ts +0 -132
- package/src/resources/apply/declarative.ts +0 -491
- package/src/resources/apply/synth/capstone.integration.test.ts +0 -134
- package/src/resources/apply/synth/project-track.integration.test.ts +0 -194
- package/src/resources/apply/synth/project-track.ts +0 -126
- package/src/resources/apply/synth/reader.test.ts +0 -90
- package/src/resources/apply/synth/reader.ts +0 -68
- package/src/resources/apply/synth/runtime.test.ts +0 -29
- package/src/resources/apply/synth/runtime.ts +0 -39
- package/src/resources/apply/synth/synthesize.test.ts +0 -109
- package/src/resources/apply/synth/synthesize.ts +0 -161
package/src/resources/plugin.ts
CHANGED
|
@@ -23,6 +23,15 @@
|
|
|
23
23
|
// and what `stigmer up` compares with the server's digest before deciding
|
|
24
24
|
// to push. `validate -f`, `push plugin --dry-run` and `push plugin` share one
|
|
25
25
|
// description renderer so the author reads one vocabulary at every step.
|
|
26
|
+
//
|
|
27
|
+
// `readNextSteps` is what the install leaves the user to do, read from the
|
|
28
|
+
// servers the push produced: a sign-in an OAuth server needs (`stigmer
|
|
29
|
+
// connect mcp-server` runs it), the variables an API-key server wants and
|
|
30
|
+
// where they are asked, and, for a plugin that installed tools and no
|
|
31
|
+
// agent, the agent the tools still need. Best-effort by design: a server
|
|
32
|
+
// or a grant the CLI cannot read yields no line rather than a failed
|
|
33
|
+
// install, because the install itself succeeded. `stigmer up` does not
|
|
34
|
+
// read them: its plugin is the built-in assistant, not a user's act.
|
|
26
35
|
|
|
27
36
|
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
28
37
|
import { join } from "node:path";
|
|
@@ -48,6 +57,10 @@ import {
|
|
|
48
57
|
PushPluginRequestSchema,
|
|
49
58
|
type PluginMember,
|
|
50
59
|
} from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/io_pb";
|
|
60
|
+
import {
|
|
61
|
+
GetOAuthGrantStatusInputSchema,
|
|
62
|
+
OAuthConnectionHealth,
|
|
63
|
+
} from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/io_pb";
|
|
51
64
|
import { PluginDialect as PluginDialectProto } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/spec_pb";
|
|
52
65
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
53
66
|
import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
@@ -390,6 +403,113 @@ export async function pushPlugin(
|
|
|
390
403
|
export interface RenderPushOptions {
|
|
391
404
|
/** Where the archive came from when it was not a folder: the marketplace's name and source. */
|
|
392
405
|
readonly installedFrom?: string;
|
|
406
|
+
/** What the install leaves the user to do, from `readNextSteps`. */
|
|
407
|
+
readonly next?: readonly NextStep[];
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/** One thing standing between an installed MCP server and its first tool call, or the agent the tools still need. */
|
|
411
|
+
export type NextStep =
|
|
412
|
+
| { readonly kind: "sign-in"; readonly server: string; readonly command: string }
|
|
413
|
+
| { readonly kind: "signed-in"; readonly server: string }
|
|
414
|
+
| {
|
|
415
|
+
readonly kind: "api-key";
|
|
416
|
+
readonly server: string;
|
|
417
|
+
readonly variables: readonly string[];
|
|
418
|
+
/** Where the variables are asked: the agent's first session, or `stigmer connect mcp-server --env`. */
|
|
419
|
+
readonly askedAt: "agent" | "connect";
|
|
420
|
+
readonly command?: string;
|
|
421
|
+
}
|
|
422
|
+
| { readonly kind: "add-to-agent"; readonly servers: readonly string[] };
|
|
423
|
+
|
|
424
|
+
/**
|
|
425
|
+
* What the install leaves the user to do, read from each MCP server the
|
|
426
|
+
* push produced. Best-effort: a server or grant this CLI cannot read yields
|
|
427
|
+
* no step, never a failure, because the install itself succeeded.
|
|
428
|
+
*/
|
|
429
|
+
export async function readNextSteps(
|
|
430
|
+
client: Stigmer,
|
|
431
|
+
org: string,
|
|
432
|
+
members: readonly PluginMember[],
|
|
433
|
+
): Promise<NextStep[]> {
|
|
434
|
+
const servers = members.filter((m) => m.kind === ApiResourceKind.mcp_server);
|
|
435
|
+
const hasAgent = members.some((m) => m.kind === ApiResourceKind.agent);
|
|
436
|
+
const steps: NextStep[] = [];
|
|
437
|
+
for (const member of servers) {
|
|
438
|
+
try {
|
|
439
|
+
const server = await client.mcpServer.getByReference({
|
|
440
|
+
org,
|
|
441
|
+
slug: member.slug,
|
|
442
|
+
});
|
|
443
|
+
const auth = server.spec?.auth;
|
|
444
|
+
const variables = Object.keys(server.spec?.env ?? {});
|
|
445
|
+
if (auth?.targetEnvVar) {
|
|
446
|
+
let connected = false;
|
|
447
|
+
try {
|
|
448
|
+
const grant = await client.mcpServer.getOAuthGrantStatus(
|
|
449
|
+
create(GetOAuthGrantStatusInputSchema, {
|
|
450
|
+
resourceId: server.metadata?.id ?? "",
|
|
451
|
+
org,
|
|
452
|
+
}),
|
|
453
|
+
);
|
|
454
|
+
connected =
|
|
455
|
+
grant.connected &&
|
|
456
|
+
grant.connectionHealth !==
|
|
457
|
+
OAuthConnectionHealth.OAUTH_CONNECTION_HEALTH_TOKEN_EXPIRED;
|
|
458
|
+
} catch {
|
|
459
|
+
// Fail closed: a grant the CLI cannot read is a sign-in still owed.
|
|
460
|
+
}
|
|
461
|
+
steps.push(
|
|
462
|
+
connected
|
|
463
|
+
? { kind: "signed-in", server: member.slug }
|
|
464
|
+
: {
|
|
465
|
+
kind: "sign-in",
|
|
466
|
+
server: member.slug,
|
|
467
|
+
command: `stigmer connect mcp-server ${member.slug}`,
|
|
468
|
+
},
|
|
469
|
+
);
|
|
470
|
+
} else if (variables.length > 0) {
|
|
471
|
+
steps.push({
|
|
472
|
+
kind: "api-key",
|
|
473
|
+
server: member.slug,
|
|
474
|
+
variables,
|
|
475
|
+
askedAt: hasAgent ? "agent" : "connect",
|
|
476
|
+
...(hasAgent
|
|
477
|
+
? {}
|
|
478
|
+
: {
|
|
479
|
+
command: `stigmer connect mcp-server ${member.slug} --env ${variables.map((v) => `${v}=...`).join(" --env ")}`,
|
|
480
|
+
}),
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
} catch {
|
|
484
|
+
// A server the CLI cannot read has no line; the Installed section still names it.
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
if (!hasAgent && servers.length > 0) {
|
|
488
|
+
steps.push({
|
|
489
|
+
kind: "add-to-agent",
|
|
490
|
+
servers: servers.map((m) => m.slug),
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
return steps;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function describeNextStep(step: NextStep): string {
|
|
497
|
+
switch (step.kind) {
|
|
498
|
+
case "sign-in":
|
|
499
|
+
return `Sign in to ${step.server}: ${step.command}`;
|
|
500
|
+
case "signed-in":
|
|
501
|
+
return `${step.server}: signed in`;
|
|
502
|
+
case "api-key":
|
|
503
|
+
return step.askedAt === "agent"
|
|
504
|
+
? `${step.server} needs ${step.variables.join(", ")}; the agent asks at its first session`
|
|
505
|
+
: `${step.server} needs ${step.variables.join(", ")}; set them when you connect: ${step.command ?? ""}`;
|
|
506
|
+
case "add-to-agent":
|
|
507
|
+
return `Add these tools to an agent: list ${step.servers.map((s) => `'${s}'`).join(", ")} under mcp_server_usages in an agent's YAML, or from the plugin's page in the console`;
|
|
508
|
+
default: {
|
|
509
|
+
const exhaustive: never = step;
|
|
510
|
+
return exhaustive;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
393
513
|
}
|
|
394
514
|
|
|
395
515
|
/** The install as the user reads it: what landed, what was skipped, what to know. */
|
|
@@ -400,14 +520,20 @@ export function renderPushOutcome(
|
|
|
400
520
|
const { plugin, members } = outcome;
|
|
401
521
|
const warnings = plugin.status?.warnings ?? [];
|
|
402
522
|
const counts = plugin.status?.materialized;
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
523
|
+
// Only the kinds the plugin installed are named, as the console's
|
|
524
|
+
// `summariseInstall` names them: most catalogue plugins install tools
|
|
525
|
+
// alone, and "0 skills, 1 MCP server, 0 agents" reads as three facts.
|
|
526
|
+
const named = (
|
|
527
|
+
[
|
|
528
|
+
[counts?.skills ?? 0, "skill"],
|
|
529
|
+
[counts?.mcpServers ?? 0, "MCP server"],
|
|
530
|
+
[counts?.agents ?? 0, "agent"],
|
|
531
|
+
[counts?.workflows ?? 0, "workflow"],
|
|
532
|
+
] as const
|
|
533
|
+
)
|
|
534
|
+
.filter(([n]) => n > 0)
|
|
535
|
+
.map(([n, noun]) => count(n, noun));
|
|
536
|
+
const summary = named.length === 0 ? "nothing installed" : named.join(", ");
|
|
411
537
|
const headline = `Installed plugin '${plugin.metadata?.slug ?? plugin.spec?.name ?? ""}' (${summary})`;
|
|
412
538
|
const result =
|
|
413
539
|
warnings.length === 0
|
|
@@ -447,9 +573,15 @@ export function renderPushOutcome(
|
|
|
447
573
|
const section = result.addSection("Warnings");
|
|
448
574
|
for (const warning of warnings) section.item(warning.message);
|
|
449
575
|
}
|
|
576
|
+
const next = options.next ?? [];
|
|
577
|
+
if (next.length > 0) {
|
|
578
|
+
const section = result.addSection("Next");
|
|
579
|
+
for (const step of next) section.item(describeNextStep(step));
|
|
580
|
+
}
|
|
450
581
|
return result.withData({
|
|
451
582
|
plugin: toJson(PluginSchema, plugin),
|
|
452
583
|
members: members.map((m) => toJson(PluginMemberSchema, m)),
|
|
584
|
+
...(options.next !== undefined && { next: options.next }),
|
|
453
585
|
});
|
|
454
586
|
}
|
|
455
587
|
|
|
@@ -8,7 +8,6 @@ describe("schemaForValidate", () => {
|
|
|
8
8
|
expect(schemaForValidate(ApiResourceKind.agent)).toBeDefined();
|
|
9
9
|
expect(schemaForValidate(ApiResourceKind.workflow)).toBeDefined();
|
|
10
10
|
expect(schemaForValidate(ApiResourceKind.mcp_server)).toBeDefined();
|
|
11
|
-
expect(schemaForValidate(ApiResourceKind.project)).toBeDefined();
|
|
12
11
|
});
|
|
13
12
|
|
|
14
13
|
it("returns undefined for non-file-based kinds", () => {
|
|
@@ -10,7 +10,6 @@ import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb"
|
|
|
10
10
|
import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
11
11
|
import { type Workflow, WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
12
12
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
13
|
-
import { ProjectSchema } from "@stigmer/protos/ai/stigmer/tenancy/project/v1/api_pb";
|
|
14
13
|
import { decodeWorkflowTaskConfigs } from "./task-configs.js";
|
|
15
14
|
|
|
16
15
|
// Exported for the verb/dispatch conformance suite (registry/registry.test.ts),
|
|
@@ -21,7 +20,6 @@ export const VALIDATE_SCHEMAS: ReadonlyMap<ApiResourceKind, DescMessage> = new M
|
|
|
21
20
|
[ApiResourceKind.agent, AgentSchema],
|
|
22
21
|
[ApiResourceKind.workflow, WorkflowSchema],
|
|
23
22
|
[ApiResourceKind.mcp_server, McpServerSchema],
|
|
24
|
-
[ApiResourceKind.project, ProjectSchema],
|
|
25
23
|
]);
|
|
26
24
|
|
|
27
25
|
export function schemaForValidate(kind: ApiResourceKind): DescMessage | undefined {
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
2
|
-
import { type Stigmer } from "@stigmer/sdk";
|
|
3
|
-
/**
|
|
4
|
-
* The seedpack Project's slug, as every release before this one wrote it
|
|
5
|
-
* (the server derived it from `metadata.name` in the seedpack's manifest).
|
|
6
|
-
* Pinned bytes of installs that predate this release.
|
|
7
|
-
*/
|
|
8
|
-
export declare const SEEDPACK_PROJECT_SLUG = "stigmer-seedpack";
|
|
9
|
-
/**
|
|
10
|
-
* The marker older releases wrote in the data dir to skip an unchanged
|
|
11
|
-
* seedpack. Nothing reads it any more; the retire removes it so a data dir
|
|
12
|
-
* carries no trace of a mechanism that no longer exists.
|
|
13
|
-
*/
|
|
14
|
-
export declare const SEEDPACK_MARKER_FILE = ".seedpack-bootstrapped";
|
|
15
|
-
/** A member of the seedpack Project, addressed the way the Project stored it. */
|
|
16
|
-
export interface SeedpackMember {
|
|
17
|
-
readonly kind: ApiResourceKind;
|
|
18
|
-
readonly org: string;
|
|
19
|
-
readonly slug: string;
|
|
20
|
-
}
|
|
21
|
-
export type MemberOutcome = {
|
|
22
|
-
readonly action: "removed";
|
|
23
|
-
readonly member: SeedpackMember;
|
|
24
|
-
} | {
|
|
25
|
-
readonly action: "already-gone";
|
|
26
|
-
readonly member: SeedpackMember;
|
|
27
|
-
} | {
|
|
28
|
-
readonly action: "adopted";
|
|
29
|
-
readonly member: SeedpackMember;
|
|
30
|
-
/** The plugin that now manages the row: its slug, or its id when the plugin row is gone. */
|
|
31
|
-
readonly byPlugin: string;
|
|
32
|
-
} | {
|
|
33
|
-
readonly action: "kept-referenced";
|
|
34
|
-
readonly member: SeedpackMember;
|
|
35
|
-
/** The referrers, as "agent 'org/slug'". */
|
|
36
|
-
readonly by: readonly string[];
|
|
37
|
-
} | {
|
|
38
|
-
readonly action: "kept-refused";
|
|
39
|
-
readonly member: SeedpackMember;
|
|
40
|
-
/** The server's sentence. */
|
|
41
|
-
readonly reason: string;
|
|
42
|
-
};
|
|
43
|
-
export type RetireResult = {
|
|
44
|
-
readonly present: false;
|
|
45
|
-
} | {
|
|
46
|
-
readonly present: true;
|
|
47
|
-
readonly outcomes: readonly MemberOutcome[];
|
|
48
|
-
/** False when the Project row itself could not be deleted; the reason is reported. */
|
|
49
|
-
readonly projectRemoved: boolean;
|
|
50
|
-
readonly projectRefusal?: string;
|
|
51
|
-
};
|
|
52
|
-
export interface RetireOptions {
|
|
53
|
-
/** The local data dir holding the marker file. */
|
|
54
|
-
readonly markerDir: string;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Retire the seedpack Project the system org may hold. Idempotent: no
|
|
58
|
-
* Project, no work beyond one read and a stale marker's removal.
|
|
59
|
-
*/
|
|
60
|
-
export declare function retireSeedpack(stigmer: Stigmer, options: RetireOptions): Promise<RetireResult>;
|
|
61
|
-
/** The report `stigmer up` prints, one block on stderr through `say`. */
|
|
62
|
-
export declare function renderRetireReport(result: RetireResult, say: (line: string) => void): void;
|
|
63
|
-
//# sourceMappingURL=seedpack-retire.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"seedpack-retire.d.ts","sourceRoot":"","sources":["../../src/local/seedpack-retire.ts"],"names":[],"mappings":"AAyCA,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAEtH,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,cAAc,CAAC;AAOxD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,2BAA2B,CAAC;AAY7D,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GAC/D;IAAE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpE;IACE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,EAAE,SAAS,MAAM,EAAE,CAAC;CAChC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;CAAE,GAC3B;IACE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,sFAAsF;IACtF,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC,CAAC;AAEN,MAAM,WAAW,aAAa;IAC5B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAmCvB;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,IAAI,CAwDN"}
|
package/local/seedpack-retire.js
DELETED
|
@@ -1,361 +0,0 @@
|
|
|
1
|
-
// Retiring the seedpack: the one-time removal, on an existing local install,
|
|
2
|
-
// of the system content an older release seeded (a `stigmer-seedpack`
|
|
3
|
-
// Project in the system org and its member agents, skills, MCP servers and
|
|
4
|
-
// workflows). Newer releases seed nothing but the default plugins, so the
|
|
5
|
-
// rows have no owner left; `stigmer up` runs this step once and reports
|
|
6
|
-
// exactly what it did. This module goes when the Project kind goes.
|
|
7
|
-
//
|
|
8
|
-
// Shape: the client-side mirror of the server's plugin uninstall
|
|
9
|
-
// (GuardMembersUnreferenced then CascadeDeleteMembers in the plugin
|
|
10
|
-
// controller). Before anything is deleted, every agent the identity can see
|
|
11
|
-
// is read and its spec walked for ApiResourceReferences, the same walk the
|
|
12
|
-
// server's ValidateReferences runs; a member some user-authored agent still
|
|
13
|
-
// references is KEPT and the report names the referrer, because an
|
|
14
|
-
// individual delete never refuses on that ground and a dangling reference
|
|
15
|
-
// found at the user's next session is the worse outcome. The one deliberate
|
|
16
|
-
// difference from the server's guard, and its reason: the guard refuses the
|
|
17
|
-
// whole uninstall and tells the user to detach first; a retire inside `up`
|
|
18
|
-
// has no user to ask, so it keeps only what is referenced and removes the
|
|
19
|
-
// rest. Members referencing each other are the seedpack's own business and
|
|
20
|
-
// never keep anything. A member the default plugins ADOPTED (the bootstrap
|
|
21
|
-
// runs first, and the plugin push takes over the system-content row it
|
|
22
|
-
// replaces in place, so the seedpack's `assistant` keeps its id and every
|
|
23
|
-
// conversation with it) now carries `stigmer.ai/plugin` and is reported as
|
|
24
|
-
// such, never deleted: the store says what was adopted, this module keeps
|
|
25
|
-
// no list of its own. Deletes run children-first in reference order
|
|
26
|
-
// (workflows, agents, skills, MCP servers) through the same SDK calls
|
|
27
|
-
// `stigmer delete` binds, so a refusal reaches the user as the server's
|
|
28
|
-
// own sentence; the Project row goes last and the marker file with it. A
|
|
29
|
-
// failure part-way leaves a Project whose members are still listed, and the
|
|
30
|
-
// next `up` converges.
|
|
31
|
-
//
|
|
32
|
-
// Known limit, shared with the server's guard: a workflow names the agent it
|
|
33
|
-
// calls by a DSL string, not a reference, so a user workflow that calls a
|
|
34
|
-
// seedpack agent is not seen and not protected.
|
|
35
|
-
import { existsSync, rmSync } from "node:fs";
|
|
36
|
-
import { join } from "node:path";
|
|
37
|
-
import { reflect } from "@bufbuild/protobuf/reflect";
|
|
38
|
-
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
39
|
-
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
40
|
-
import { isNotFound } from "@stigmer/sdk";
|
|
41
|
-
import { log } from "../logger.js";
|
|
42
|
-
import { defaultRegistry } from "../registry/index.js";
|
|
43
|
-
import { DELETE_HANDLERS } from "../resources/delete.js";
|
|
44
|
-
import { getterFor } from "../resources/get-bindings.js";
|
|
45
|
-
import { SYSTEM_ORG } from "./system-org.js";
|
|
46
|
-
/**
|
|
47
|
-
* The seedpack Project's slug, as every release before this one wrote it
|
|
48
|
-
* (the server derived it from `metadata.name` in the seedpack's manifest).
|
|
49
|
-
* Pinned bytes of installs that predate this release.
|
|
50
|
-
*/
|
|
51
|
-
export const SEEDPACK_PROJECT_SLUG = "stigmer-seedpack";
|
|
52
|
-
/**
|
|
53
|
-
* The marker older releases wrote in the data dir to skip an unchanged
|
|
54
|
-
* seedpack. Nothing reads it any more; the retire removes it so a data dir
|
|
55
|
-
* carries no trace of a mechanism that no longer exists.
|
|
56
|
-
*/
|
|
57
|
-
export const SEEDPACK_MARKER_FILE = ".seedpack-bootstrapped";
|
|
58
|
-
/** The order members are removed in: a referrer before what it references. */
|
|
59
|
-
const REMOVAL_ORDER = [
|
|
60
|
-
ApiResourceKind.workflow,
|
|
61
|
-
ApiResourceKind.agent,
|
|
62
|
-
ApiResourceKind.skill,
|
|
63
|
-
ApiResourceKind.mcp_server,
|
|
64
|
-
];
|
|
65
|
-
const REFERRER_PAGE_SIZE = 100;
|
|
66
|
-
/**
|
|
67
|
-
* Retire the seedpack Project the system org may hold. Idempotent: no
|
|
68
|
-
* Project, no work beyond one read and a stale marker's removal.
|
|
69
|
-
*/
|
|
70
|
-
export async function retireSeedpack(stigmer, options) {
|
|
71
|
-
const project = await readProject(stigmer);
|
|
72
|
-
if (project === undefined) {
|
|
73
|
-
removeMarker(options.markerDir);
|
|
74
|
-
return { present: false };
|
|
75
|
-
}
|
|
76
|
-
const members = (project.members ?? []).map(toMember);
|
|
77
|
-
const referrers = await indexReferrers(stigmer, members);
|
|
78
|
-
const pluginSlugs = new Map();
|
|
79
|
-
const outcomes = [];
|
|
80
|
-
for (const member of inRemovalOrder(members)) {
|
|
81
|
-
const by = referrers.get(keyOf(member));
|
|
82
|
-
if (by !== undefined) {
|
|
83
|
-
outcomes.push({ action: "kept-referenced", member, by });
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
outcomes.push(await removeMember(stigmer, member, pluginSlugs));
|
|
87
|
-
}
|
|
88
|
-
let projectRemoved = true;
|
|
89
|
-
let projectRefusal;
|
|
90
|
-
try {
|
|
91
|
-
await stigmer.project.delete(project.id);
|
|
92
|
-
}
|
|
93
|
-
catch (error) {
|
|
94
|
-
projectRemoved = false;
|
|
95
|
-
projectRefusal = messageOf(error);
|
|
96
|
-
log.warn("seedpack project delete refused", { error: projectRefusal });
|
|
97
|
-
}
|
|
98
|
-
removeMarker(options.markerDir);
|
|
99
|
-
return projectRefusal === undefined
|
|
100
|
-
? { present: true, outcomes, projectRemoved }
|
|
101
|
-
: { present: true, outcomes, projectRemoved, projectRefusal };
|
|
102
|
-
}
|
|
103
|
-
/** The report `stigmer up` prints, one block on stderr through `say`. */
|
|
104
|
-
export function renderRetireReport(result, say) {
|
|
105
|
-
if (!result.present)
|
|
106
|
-
return;
|
|
107
|
-
const removed = result.outcomes.filter((outcome) => outcome.action === "removed").length;
|
|
108
|
-
const adopted = result.outcomes.filter((outcome) => outcome.action === "adopted").length;
|
|
109
|
-
const kept = result.outcomes.filter((outcome) => outcome.action === "kept-referenced" ||
|
|
110
|
-
outcome.action === "kept-refused");
|
|
111
|
-
const tail = [
|
|
112
|
-
adopted === 0 ? "" : `${count(adopted, "resource")} now managed by a plugin`,
|
|
113
|
-
kept.length === 0 ? "" : `kept ${count(kept.length, "resource")}`,
|
|
114
|
-
].filter((part) => part !== "");
|
|
115
|
-
say(`Retired the system content an older release installed: removed ${count(removed, "resource")}` +
|
|
116
|
-
(tail.length === 0 ? "." : `, ${tail.join(", ")}.`));
|
|
117
|
-
for (const outcome of result.outcomes) {
|
|
118
|
-
switch (outcome.action) {
|
|
119
|
-
case "removed":
|
|
120
|
-
case "already-gone":
|
|
121
|
-
break;
|
|
122
|
-
case "adopted":
|
|
123
|
-
say(` ${describe(outcome.member)} is now managed by plugin '${outcome.byPlugin}'; its instances and conversations continue`);
|
|
124
|
-
break;
|
|
125
|
-
case "kept-referenced":
|
|
126
|
-
say(` kept ${describe(outcome.member)}: referenced by ${outcome.by.join(", ")}`);
|
|
127
|
-
break;
|
|
128
|
-
case "kept-refused":
|
|
129
|
-
say(` kept ${describe(outcome.member)}: ${outcome.reason}`);
|
|
130
|
-
break;
|
|
131
|
-
default: {
|
|
132
|
-
const exhaustive = outcome;
|
|
133
|
-
throw new Error(`unhandled outcome ${String(exhaustive)}`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
if (kept.length > 0) {
|
|
138
|
-
say(" A kept resource's icon no longer resolves. Once its referrer is edited, remove it with 'stigmer delete <kind> <org>/<slug>'.");
|
|
139
|
-
}
|
|
140
|
-
if (!result.projectRemoved) {
|
|
141
|
-
say(` The '${SEEDPACK_PROJECT_SLUG}' project row could not be removed: ${result.projectRefusal ?? "unknown reason"}. Run 'stigmer up' again to retry.`);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
async function readProject(stigmer) {
|
|
145
|
-
try {
|
|
146
|
-
const project = await stigmer.project.getByReference({
|
|
147
|
-
org: SYSTEM_ORG,
|
|
148
|
-
slug: SEEDPACK_PROJECT_SLUG,
|
|
149
|
-
});
|
|
150
|
-
return { id: project.metadata?.id ?? "", members: project.spec?.members };
|
|
151
|
-
}
|
|
152
|
-
catch (error) {
|
|
153
|
-
if (isNotFound(error))
|
|
154
|
-
return undefined;
|
|
155
|
-
throw error;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
function toMember(ref) {
|
|
159
|
-
// Stored references are absolute, but an empty org can only mean the
|
|
160
|
-
// Project's own.
|
|
161
|
-
return { kind: ref.kind, org: ref.org || SYSTEM_ORG, slug: ref.slug };
|
|
162
|
-
}
|
|
163
|
-
function keyOf(member) {
|
|
164
|
-
return `${member.kind}:${member.org}/${member.slug}`;
|
|
165
|
-
}
|
|
166
|
-
function inRemovalOrder(members) {
|
|
167
|
-
const ordered = [];
|
|
168
|
-
for (const kind of REMOVAL_ORDER) {
|
|
169
|
-
ordered.push(...members.filter((member) => member.kind === kind));
|
|
170
|
-
}
|
|
171
|
-
ordered.push(...members.filter((member) => !REMOVAL_ORDER.includes(member.kind)));
|
|
172
|
-
return ordered;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Every member some agent outside the seedpack references, mapped to the
|
|
176
|
-
* agents that reference it. Reads each agent in every organization the
|
|
177
|
-
* identity sees: the listing is search-backed and carries no spec.
|
|
178
|
-
*/
|
|
179
|
-
async function indexReferrers(stigmer, members) {
|
|
180
|
-
const memberKeys = new Set(members.map(keyOf));
|
|
181
|
-
const referrers = new Map();
|
|
182
|
-
if (memberKeys.size === 0)
|
|
183
|
-
return referrers;
|
|
184
|
-
const orgs = (await stigmer.organization.findMyOrganizations()).entries
|
|
185
|
-
.map((org) => org.metadata?.slug ?? "")
|
|
186
|
-
.filter((slug) => slug !== "");
|
|
187
|
-
for (const org of orgs) {
|
|
188
|
-
for (let page = 1;; page += 1) {
|
|
189
|
-
const listing = await stigmer.agent.list({
|
|
190
|
-
org,
|
|
191
|
-
page: { num: page, size: REFERRER_PAGE_SIZE },
|
|
192
|
-
});
|
|
193
|
-
for (const entry of listing.entries) {
|
|
194
|
-
const self = `${ApiResourceKind.agent}:${entry.org || org}/${entry.slug}`;
|
|
195
|
-
if (memberKeys.has(self))
|
|
196
|
-
continue;
|
|
197
|
-
const agent = await stigmer.agent.get(entry.id);
|
|
198
|
-
const label = `agent '${entry.org || org}/${entry.slug}'`;
|
|
199
|
-
for (const ref of collectSpecReferences(AgentSchema, agent)) {
|
|
200
|
-
const key = `${ref.kind}:${ref.org || org}/${ref.slug}`;
|
|
201
|
-
if (!memberKeys.has(key))
|
|
202
|
-
continue;
|
|
203
|
-
const list = referrers.get(key) ?? [];
|
|
204
|
-
if (!list.includes(label))
|
|
205
|
-
list.push(label);
|
|
206
|
-
referrers.set(key, list);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
if (page >= listing.totalPages)
|
|
210
|
-
break;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return referrers;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* The membership label the server stamps on every resource a plugin
|
|
217
|
-
* materialises; its value is the plugin's id. Read here, never written: a
|
|
218
|
-
* seedpack member carrying it was adopted by a default plugin moments ago.
|
|
219
|
-
*/
|
|
220
|
-
const PLUGIN_LABEL = "stigmer.ai/plugin";
|
|
221
|
-
async function removeMember(stigmer, member, pluginSlugs) {
|
|
222
|
-
const getter = getterFor(member.kind);
|
|
223
|
-
const deleter = DELETE_HANDLERS.get(member.kind);
|
|
224
|
-
if (getter === undefined || deleter === undefined) {
|
|
225
|
-
return {
|
|
226
|
-
action: "kept-refused",
|
|
227
|
-
member,
|
|
228
|
-
reason: "this CLI has no delete for that kind",
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
let id;
|
|
232
|
-
try {
|
|
233
|
-
const found = await getter(stigmer, {
|
|
234
|
-
kind: "ref",
|
|
235
|
-
org: member.org,
|
|
236
|
-
slug: member.slug,
|
|
237
|
-
});
|
|
238
|
-
const metadata = found.message.metadata;
|
|
239
|
-
id = metadata?.id ?? "";
|
|
240
|
-
const pluginId = metadata?.labels?.[PLUGIN_LABEL];
|
|
241
|
-
if (pluginId !== undefined && pluginId !== "") {
|
|
242
|
-
return {
|
|
243
|
-
action: "adopted",
|
|
244
|
-
member,
|
|
245
|
-
byPlugin: await pluginSlugOf(stigmer, pluginId, pluginSlugs),
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
catch (error) {
|
|
250
|
-
if (isNotFound(error))
|
|
251
|
-
return { action: "already-gone", member };
|
|
252
|
-
return { action: "kept-refused", member, reason: messageOf(error) };
|
|
253
|
-
}
|
|
254
|
-
try {
|
|
255
|
-
await deleter(stigmer, id, false);
|
|
256
|
-
return { action: "removed", member };
|
|
257
|
-
}
|
|
258
|
-
catch (error) {
|
|
259
|
-
if (isNotFound(error))
|
|
260
|
-
return { action: "already-gone", member };
|
|
261
|
-
return { action: "kept-refused", member, reason: messageOf(error) };
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
/** The adopting plugin's slug, read once per id; a plugin row that is gone names itself. */
|
|
265
|
-
async function pluginSlugOf(stigmer, pluginId, cache) {
|
|
266
|
-
const known = cache.get(pluginId);
|
|
267
|
-
if (known !== undefined)
|
|
268
|
-
return known;
|
|
269
|
-
let slug = pluginId;
|
|
270
|
-
try {
|
|
271
|
-
slug = (await stigmer.plugin.get(pluginId)).metadata?.slug || pluginId;
|
|
272
|
-
}
|
|
273
|
-
catch (error) {
|
|
274
|
-
if (!isNotFound(error))
|
|
275
|
-
throw error;
|
|
276
|
-
}
|
|
277
|
-
cache.set(pluginId, slug);
|
|
278
|
-
return slug;
|
|
279
|
-
}
|
|
280
|
-
function removeMarker(markerDir) {
|
|
281
|
-
const marker = join(markerDir, SEEDPACK_MARKER_FILE);
|
|
282
|
-
if (existsSync(marker))
|
|
283
|
-
rmSync(marker, { force: true });
|
|
284
|
-
}
|
|
285
|
-
function describe(member) {
|
|
286
|
-
const info = defaultRegistry().getByKind(member.kind);
|
|
287
|
-
const noun = info?.singular ?? ApiResourceKind[member.kind] ?? "resource";
|
|
288
|
-
return `${noun} '${member.org}/${member.slug}'`;
|
|
289
|
-
}
|
|
290
|
-
function count(n, noun) {
|
|
291
|
-
return `${n} ${noun}${n === 1 ? "" : "s"}`;
|
|
292
|
-
}
|
|
293
|
-
function messageOf(error) {
|
|
294
|
-
return error instanceof Error ? error.message : String(error);
|
|
295
|
-
}
|
|
296
|
-
// --- The reference walk: every ApiResourceReference in a resource's spec ---
|
|
297
|
-
//
|
|
298
|
-
// The same traversal the server runs in its ValidateReferences step and its
|
|
299
|
-
// plugin uninstall guard (singular, repeated and map-valued message fields,
|
|
300
|
-
// recursively), so a reference field added to a spec is seen here without a
|
|
301
|
-
// change. Server-internal there and not exported to clients; mirrored here
|
|
302
|
-
// for the one client that asks the reverse question.
|
|
303
|
-
const API_RESOURCE_REFERENCE_TYPE = "ai.stigmer.commons.apiresource.ApiResourceReference";
|
|
304
|
-
function collectSpecReferences(schema, msg) {
|
|
305
|
-
const refs = [];
|
|
306
|
-
const root = reflect(schema, msg);
|
|
307
|
-
const spec = root.fields.find((field) => field.name === "spec" && field.fieldKind === "message");
|
|
308
|
-
if (spec === undefined || spec.fieldKind !== "message" || !root.isSet(spec)) {
|
|
309
|
-
return refs;
|
|
310
|
-
}
|
|
311
|
-
walk(root.get(spec), (ref) => {
|
|
312
|
-
refs.push({
|
|
313
|
-
kind: numberField(ref, "kind"),
|
|
314
|
-
slug: stringField(ref, "slug"),
|
|
315
|
-
org: stringField(ref, "org"),
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
return refs;
|
|
319
|
-
}
|
|
320
|
-
function walk(msg, fn) {
|
|
321
|
-
for (const field of msg.fields) {
|
|
322
|
-
if (field.fieldKind === "list") {
|
|
323
|
-
if (field.listKind !== "message")
|
|
324
|
-
continue;
|
|
325
|
-
for (const item of msg.get(field))
|
|
326
|
-
visit(item, fn);
|
|
327
|
-
}
|
|
328
|
-
else if (field.fieldKind === "map") {
|
|
329
|
-
if (field.mapKind !== "message")
|
|
330
|
-
continue;
|
|
331
|
-
for (const [, value] of msg.get(field)) {
|
|
332
|
-
visit(value, fn);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
else if (field.fieldKind === "message") {
|
|
336
|
-
if (msg.isSet(field))
|
|
337
|
-
visit(msg.get(field), fn);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
function visit(sub, fn) {
|
|
342
|
-
if (sub.desc.typeName === API_RESOURCE_REFERENCE_TYPE)
|
|
343
|
-
fn(sub);
|
|
344
|
-
else
|
|
345
|
-
walk(sub, fn);
|
|
346
|
-
}
|
|
347
|
-
function stringField(msg, name) {
|
|
348
|
-
const field = msg.fields.find((f) => f.name === name);
|
|
349
|
-
if (field === undefined)
|
|
350
|
-
return "";
|
|
351
|
-
const value = msg.get(field);
|
|
352
|
-
return typeof value === "string" ? value : "";
|
|
353
|
-
}
|
|
354
|
-
function numberField(msg, name) {
|
|
355
|
-
const field = msg.fields.find((f) => f.name === name);
|
|
356
|
-
if (field === undefined)
|
|
357
|
-
return 0;
|
|
358
|
-
const value = msg.get(field);
|
|
359
|
-
return typeof value === "number" ? value : 0;
|
|
360
|
-
}
|
|
361
|
-
//# sourceMappingURL=seedpack-retire.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"seedpack-retire.js","sourceRoot":"","sources":["../../src/local/seedpack-retire.ts"],"names":[],"mappings":"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"}
|