@leemour/cli-messaging 0.156.0 → 0.157.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -7
- package/dist/cli/agent-evaluation.d.ts +25 -0
- package/dist/cli/agent-evaluation.d.ts.map +1 -0
- package/dist/cli/agent-evaluation.js +42 -0
- package/dist/cli/agent-evaluation.js.map +1 -0
- package/dist/cli/bot/mcp.d.ts.map +1 -1
- package/dist/cli/bot/mcp.js +4 -12
- package/dist/cli/bot/mcp.js.map +1 -1
- package/dist/cli/command-contract.d.ts +85 -0
- package/dist/cli/command-contract.d.ts.map +1 -0
- package/dist/cli/command-contract.js +211 -0
- package/dist/cli/command-contract.js.map +1 -0
- package/dist/cli/commands-command.d.ts.map +1 -1
- package/dist/cli/commands-command.js +44 -28
- package/dist/cli/commands-command.js.map +1 -1
- package/dist/cli/context.d.ts +2 -0
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +10 -3
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/deadline.js +3 -4
- package/dist/cli/deadline.js.map +1 -1
- package/dist/cli/execution.d.ts +26 -0
- package/dist/cli/execution.d.ts.map +1 -0
- package/dist/cli/execution.js +175 -0
- package/dist/cli/execution.js.map +1 -0
- package/dist/cli/index.d.ts +6 -3
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/input-policy.d.ts +14 -0
- package/dist/cli/input-policy.d.ts.map +1 -0
- package/dist/cli/input-policy.js +66 -0
- package/dist/cli/input-policy.js.map +1 -0
- package/dist/cli/messenger/mcp-command.d.ts +0 -1
- package/dist/cli/messenger/mcp-command.d.ts.map +1 -1
- package/dist/cli/messenger/mcp-command.js +15 -19
- package/dist/cli/messenger/mcp-command.js.map +1 -1
- package/dist/cli/messenger/messages-search-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-search-command.js +7 -3
- package/dist/cli/messenger/messages-search-command.js.map +1 -1
- package/dist/cli/messenger/stats-command.d.ts.map +1 -1
- package/dist/cli/messenger/stats-command.js +1 -12
- package/dist/cli/messenger/stats-command.js.map +1 -1
- package/dist/cli/messenger/stdin.d.ts.map +1 -1
- package/dist/cli/messenger/stdin.js +2 -4
- package/dist/cli/messenger/stdin.js.map +1 -1
- package/dist/cli/permission-migration.d.ts.map +1 -1
- package/dist/cli/permission-migration.js +14 -8
- package/dist/cli/permission-migration.js.map +1 -1
- package/dist/cli/preview.d.ts +35 -0
- package/dist/cli/preview.d.ts.map +1 -0
- package/dist/cli/preview.js +40 -0
- package/dist/cli/preview.js.map +1 -0
- package/dist/cli/program.d.ts +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +148 -15
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/result-fields.d.ts +3 -0
- package/dist/cli/result-fields.d.ts.map +1 -0
- package/dist/cli/result-fields.js +55 -0
- package/dist/cli/result-fields.js.map +1 -0
- package/dist/kit/index.d.ts +1 -0
- package/dist/kit/index.d.ts.map +1 -1
- package/dist/kit/index.js +1 -0
- package/dist/kit/index.js.map +1 -1
- package/dist/kit/mcp-commands-client.d.ts +7 -0
- package/dist/kit/mcp-commands-client.d.ts.map +1 -0
- package/dist/kit/mcp-commands-client.js +50 -0
- package/dist/kit/mcp-commands-client.js.map +1 -0
- package/dist/mcp/bot/instructions.d.ts +2 -3
- package/dist/mcp/bot/instructions.d.ts.map +1 -1
- package/dist/mcp/bot/instructions.js +4 -10
- package/dist/mcp/bot/instructions.js.map +1 -1
- package/dist/mcp/bot/server.d.ts +0 -6
- package/dist/mcp/bot/server.d.ts.map +1 -1
- package/dist/mcp/bot/server.js +30 -76
- package/dist/mcp/bot/server.js.map +1 -1
- package/dist/mcp/bot/tools.d.ts +3 -11
- package/dist/mcp/bot/tools.d.ts.map +1 -1
- package/dist/mcp/bot/tools.js +7 -22
- package/dist/mcp/bot/tools.js.map +1 -1
- package/dist/mcp/instructions.d.ts +1 -2
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/instructions.js +6 -13
- package/dist/mcp/instructions.js.map +1 -1
- package/dist/mcp/personal.d.ts +1 -1
- package/dist/mcp/personal.d.ts.map +1 -1
- package/dist/mcp/personal.js +1 -1
- package/dist/mcp/personal.js.map +1 -1
- package/dist/mcp/prompts.js +14 -14
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -23
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +20 -51
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/surface.d.ts +29 -0
- package/dist/mcp/surface.d.ts.map +1 -0
- package/dist/mcp/surface.js +125 -0
- package/dist/mcp/surface.js.map +1 -0
- package/dist/mcp/tool.d.ts +19 -24
- package/dist/mcp/tool.d.ts.map +1 -1
- package/dist/mcp/tool.js +109 -91
- package/dist/mcp/tool.js.map +1 -1
- package/dist/mcp/tools/admin.d.ts.map +1 -1
- package/dist/mcp/tools/admin.js +1 -10
- package/dist/mcp/tools/admin.js.map +1 -1
- package/dist/mcp/tools/attachments.d.ts.map +1 -1
- package/dist/mcp/tools/attachments.js +1 -2
- package/dist/mcp/tools/attachments.js.map +1 -1
- package/dist/mcp/tools/chats-read.d.ts.map +1 -1
- package/dist/mcp/tools/chats-read.js +1 -2
- package/dist/mcp/tools/chats-read.js.map +1 -1
- package/dist/mcp/tools/contacts-write.d.ts.map +1 -1
- package/dist/mcp/tools/contacts-write.js +1 -4
- package/dist/mcp/tools/contacts-write.js.map +1 -1
- package/dist/mcp/tools/conversations.d.ts.map +1 -1
- package/dist/mcp/tools/conversations.js +1 -5
- package/dist/mcp/tools/conversations.js.map +1 -1
- package/dist/mcp/tools/folders.d.ts.map +1 -1
- package/dist/mcp/tools/folders.js +1 -4
- package/dist/mcp/tools/folders.js.map +1 -1
- package/dist/mcp/tools/messages-actions.d.ts.map +1 -1
- package/dist/mcp/tools/messages-actions.js +1 -5
- package/dist/mcp/tools/messages-actions.js.map +1 -1
- package/dist/mcp/tools/messages-delete.d.ts.map +1 -1
- package/dist/mcp/tools/messages-delete.js +1 -2
- package/dist/mcp/tools/messages-delete.js.map +1 -1
- package/dist/mcp/tools/messages-send.d.ts.map +1 -1
- package/dist/mcp/tools/messages-send.js +1 -2
- package/dist/mcp/tools/messages-send.js.map +1 -1
- package/dist/mcp/tools/moderation.d.ts.map +1 -1
- package/dist/mcp/tools/moderation.js +1 -2
- package/dist/mcp/tools/moderation.js.map +1 -1
- package/dist/mcp/tools/polls.d.ts.map +1 -1
- package/dist/mcp/tools/polls.js +1 -4
- package/dist/mcp/tools/polls.js.map +1 -1
- package/dist/mcp/tools/reactions.d.ts.map +1 -1
- package/dist/mcp/tools/reactions.js +1 -3
- package/dist/mcp/tools/reactions.js.map +1 -1
- package/dist/mcp/tools/searches.d.ts.map +1 -1
- package/dist/mcp/tools/searches.js +1 -5
- package/dist/mcp/tools/searches.js.map +1 -1
- package/dist/mcp/tools/tags.d.ts.map +1 -1
- package/dist/mcp/tools/tags.js +1 -4
- package/dist/mcp/tools/tags.js.map +1 -1
- package/dist/mcp/tools/tasks.d.ts.map +1 -1
- package/dist/mcp/tools/tasks.js +1 -4
- package/dist/mcp/tools/tasks.js.map +1 -1
- package/dist/mcp/tools/topics.d.ts.map +1 -1
- package/dist/mcp/tools/topics.js +1 -3
- package/dist/mcp/tools/topics.js.map +1 -1
- package/dist/output.d.ts +3 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +13 -3
- package/dist/output.js.map +1 -1
- package/dist/sends/guarded.d.ts +2 -0
- package/dist/sends/guarded.d.ts.map +1 -1
- package/dist/sends/guarded.js +37 -3
- package/dist/sends/guarded.js.map +1 -1
- package/dist/skills/validate.d.ts +9 -0
- package/dist/skills/validate.d.ts.map +1 -0
- package/dist/skills/validate.js +86 -0
- package/dist/skills/validate.js.map +1 -0
- package/dist/store/sqlite/chats.d.ts.map +1 -1
- package/dist/store/sqlite/chats.js +7 -3
- package/dist/store/sqlite/chats.js.map +1 -1
- package/dist/terminal/prompt.d.ts +1 -1
- package/dist/terminal/prompt.d.ts.map +1 -1
- package/dist/terminal/prompt.js +34 -31
- package/dist/terminal/prompt.js.map +1 -1
- package/package.json +9 -3
- package/parity.json +81 -346
- package/skills/link-conversations/SKILL.md +8 -13
- package/dist/mcp/confirm.d.ts +0 -30
- package/dist/mcp/confirm.d.ts.map +0 -1
- package/dist/mcp/confirm.js +0 -92
- package/dist/mcp/confirm.js.map +0 -1
- package/dist/mcp/http/policy.d.ts +0 -13
- package/dist/mcp/http/policy.d.ts.map +0 -1
- package/dist/mcp/http/policy.js +0 -18
- package/dist/mcp/http/policy.js.map +0 -1
package/dist/mcp/tools/topics.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as v from "valibot";
|
|
2
2
|
import { capability } from "../../cli/messenger/port.js";
|
|
3
3
|
import { onlineDeps, servicesFor } from "../../services/index.js";
|
|
4
|
-
import {
|
|
4
|
+
import { chatOf, envelope, limit, page, paging, READ, tool, WRITE } from "../tool.js";
|
|
5
5
|
export const topicsTools = (messenger) => ({
|
|
6
6
|
topics_list: tool({
|
|
7
7
|
title: "A forum group's topics",
|
|
@@ -31,7 +31,6 @@ export const topicWriteTools = (messenger) => ({
|
|
|
31
31
|
description: "Only when the owner requested this change. A basic group requires explicit upgrade; its id changes. A partial failure reports the new chat id. Only the group owner can enable topics.",
|
|
32
32
|
input: v.object({ chat: chatOf(messenger), upgrade: v.optional(v.boolean()) }),
|
|
33
33
|
annotations: WRITE,
|
|
34
|
-
_meta: APPROVE,
|
|
35
34
|
permission: "groups",
|
|
36
35
|
online: (adapter, args, { guard }) => servicesFor(onlineDeps(messenger, adapter, guard)).topics.enable(args.chat, { upgrade: args.upgrade === true }),
|
|
37
36
|
}),
|
|
@@ -44,7 +43,6 @@ export const topicWriteTools = (messenger) => ({
|
|
|
44
43
|
send_id: v.optional(v.pipe(v.string(), v.minLength(1))),
|
|
45
44
|
}),
|
|
46
45
|
annotations: WRITE,
|
|
47
|
-
_meta: APPROVE,
|
|
48
46
|
permission: "groups",
|
|
49
47
|
online: (adapter, args, { guard }) => servicesFor(onlineDeps(messenger, adapter, guard)).topics.create(args.chat, args.title, {
|
|
50
48
|
...(args.send_id === undefined ? {} : { sendId: args.send_id }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"topics.js","sourceRoot":"","sources":["../../../src/mcp/tools/topics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAgB,
|
|
1
|
+
{"version":3,"file":"topics.js","sourceRoot":"","sources":["../../../src/mcp/tools/topics.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export interface OutputOptions {
|
|
|
7
7
|
/** Whether a person is looking. Defaults to whether stdout is a terminal. */
|
|
8
8
|
tty?: boolean;
|
|
9
9
|
color?: boolean;
|
|
10
|
+
env?: NodeJS.ProcessEnv;
|
|
11
|
+
fields?: string;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
12
14
|
* One place decides the mode, so no command can disagree with another.
|
|
@@ -16,7 +18,7 @@ export interface OutputOptions {
|
|
|
16
18
|
* instead. In every machine mode **stdout carries JSON and nothing else** — diagnostics are on stderr in all modes, which is what makes
|
|
17
19
|
* that contract hold by construction rather than by remembering.
|
|
18
20
|
*/
|
|
19
|
-
export declare const resolveOutput: ({ json, jsonl, quiet, streams, tty, color }?: OutputOptions) => {
|
|
21
|
+
export declare const resolveOutput: ({ json, jsonl, quiet, streams, tty, color, fields, env, }?: OutputOptions) => {
|
|
20
22
|
format: "json" | "jsonl" | "pretty";
|
|
21
23
|
color: boolean;
|
|
22
24
|
streams: Streams;
|
package/dist/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEb,KAAK,OAAO,EAEb,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEb,KAAK,OAAO,EAEb,MAAM,mBAAmB,CAAA;AAG1B,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,+DASvB,aAAa;;;;;CAkBf,CAAA"}
|
package/dist/output.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createRenderer, processStreams, singleLine, } from "@leemour/cli-core";
|
|
2
|
+
import { fieldsOf, projectFields } from "./cli/result-fields.js";
|
|
2
3
|
/**
|
|
3
4
|
* One place decides the mode, so no command can disagree with another.
|
|
4
5
|
*
|
|
@@ -7,12 +8,21 @@ import { createRenderer, processStreams, singleLine, } from "@leemour/cli-core";
|
|
|
7
8
|
* instead. In every machine mode **stdout carries JSON and nothing else** — diagnostics are on stderr in all modes, which is what makes
|
|
8
9
|
* that contract hold by construction rather than by remembering.
|
|
9
10
|
*/
|
|
10
|
-
export const resolveOutput = ({ json, jsonl, quiet, streams = processStreams, tty, color } = {}) => {
|
|
11
|
+
export const resolveOutput = ({ json, jsonl, quiet, streams = processStreams, tty, color, fields, env = process.env, } = {}) => {
|
|
11
12
|
const interactive = tty ?? process.stdout.isTTY === true;
|
|
12
13
|
const format = jsonl ? "jsonl" : json || !interactive ? "json" : "pretty";
|
|
13
|
-
const painted =
|
|
14
|
+
const painted = format === "pretty" && (color ?? (env.NO_COLOR === undefined && env.TERM !== "dumb" && !env.CI));
|
|
14
15
|
const created = createRenderer({ format, color: painted, streams });
|
|
15
|
-
const
|
|
16
|
+
const paths = fields === undefined ? undefined : fieldsOf(fields);
|
|
17
|
+
const renderer = format === "pretty"
|
|
18
|
+
? oneLineFields(created)
|
|
19
|
+
: paths
|
|
20
|
+
? {
|
|
21
|
+
...created,
|
|
22
|
+
result: (value) => created.result(projectFields(value, paths)),
|
|
23
|
+
stream: (items) => created.stream([...items].map((item) => projectFields(item, paths))),
|
|
24
|
+
}
|
|
25
|
+
: created;
|
|
16
26
|
return { format, color: painted, streams, renderer: quiet ? silence(renderer) : renderer };
|
|
17
27
|
};
|
|
18
28
|
/** Fields a person writes in paragraphs; every other string is a name, a title, an id or a path. */
|
package/dist/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EAId,UAAU,GACX,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
package/dist/sends/guarded.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ export interface WriteInFlight {
|
|
|
25
25
|
* cuts each into an unknown outcome. Per deadline, not per process: an MCP server runs many.
|
|
26
26
|
*/
|
|
27
27
|
export declare const writesInFlight: AsyncLocalStorage<Set<WriteInFlight>>;
|
|
28
|
+
export declare const withWriteScope: <T>(scope: Set<WriteInFlight>, body: () => T) => T;
|
|
29
|
+
export declare const stopWrites: (scope: Set<WriteInFlight>, reason: unknown) => void;
|
|
28
30
|
/** The write in progress, so the run events of the calls it makes name it without the port passing it along. */
|
|
29
31
|
export declare const currentOperation: () => string | undefined;
|
|
30
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guarded.d.ts","sourceRoot":"","sources":["../../src/sends/guarded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,2EAA2E;AAC3E,KAAK,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG;IAC7D,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,CAAC,EAAE,aAAa,CAAA;IACnB,SAAS,CAAC,EAAE,EAAE,EAAE,CAAA;CACjB,CAAA;AAED,4EAA4E;AAC5E,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAA;AAIrD,iGAAiG;AACjG,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,EAAE,MAAM,IAAI,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,uCAA8C,CAAA;
|
|
1
|
+
{"version":3,"file":"guarded.d.ts","sourceRoot":"","sources":["../../src/sends/guarded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,2EAA2E;AAC3E,KAAK,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG;IAC7D,WAAW,EAAE,MAAM,CAAA;IACnB,GAAG,CAAC,EAAE,aAAa,CAAA;IACnB,SAAS,CAAC,EAAE,EAAE,EAAE,CAAA;CACjB,CAAA;AAED,4EAA4E;AAC5E,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAA;AAIrD,iGAAiG;AACjG,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,GAAG,EAAE,MAAM,IAAI,CAAA;CAChB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,uCAA8C,CAAA;AAQzE,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,GAAG,CAAC,aAAa,CAAC,QAAQ,MAAM,CAAC,KAAG,CAI5E,CAAA;AACD,eAAO,MAAM,UAAU,UAAW,GAAG,CAAC,aAAa,CAAC,UAAU,OAAO,KAAG,IAGvE,CAAA;AAKD,gHAAgH;AAChH,eAAO,MAAM,gBAAgB,QAAO,MAAM,GAAG,SAA+B,CAAA;AAE5E;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAU,CAAC,SAC3B,SAAS,WACP,OAAO,OACX,MAAM,OAAO,CAAC,CAAC,CAAC,YACZ,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,YAC5B,MAAM,OAAO,CAAC,IAAI,CAAC,KAC5B,OAAO,CAAC,CAAC,CAyDX,CAAA;AAED,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,MACgE,CAAA"}
|
package/dist/sends/guarded.js
CHANGED
|
@@ -7,6 +7,30 @@ const current = new AsyncLocalStorage();
|
|
|
7
7
|
* cuts each into an unknown outcome. Per deadline, not per process: an MCP server runs many.
|
|
8
8
|
*/
|
|
9
9
|
export const writesInFlight = new AsyncLocalStorage();
|
|
10
|
+
const parents = new WeakMap();
|
|
11
|
+
const stopped = new WeakMap();
|
|
12
|
+
const scopesFor = (scope = writesInFlight.getStore()) => {
|
|
13
|
+
const result = [];
|
|
14
|
+
for (let at = scope; at; at = parents.get(at))
|
|
15
|
+
result.push(at);
|
|
16
|
+
return result;
|
|
17
|
+
};
|
|
18
|
+
export const withWriteScope = (scope, body) => {
|
|
19
|
+
const parent = writesInFlight.getStore();
|
|
20
|
+
if (parent && parent !== scope)
|
|
21
|
+
parents.set(scope, parent);
|
|
22
|
+
return writesInFlight.run(scope, body);
|
|
23
|
+
};
|
|
24
|
+
export const stopWrites = (scope, reason) => {
|
|
25
|
+
stopped.set(scope, reason);
|
|
26
|
+
for (const write of scope)
|
|
27
|
+
write.cut();
|
|
28
|
+
};
|
|
29
|
+
const refuseStopped = (scopes) => {
|
|
30
|
+
for (const scope of scopes)
|
|
31
|
+
if (stopped.has(scope))
|
|
32
|
+
throw stopped.get(scope);
|
|
33
|
+
};
|
|
10
34
|
/** The write in progress, so the run events of the calls it makes name it without the port passing it along. */
|
|
11
35
|
export const currentOperation = () => current.getStore();
|
|
12
36
|
/**
|
|
@@ -15,8 +39,11 @@ export const currentOperation = () => current.getStore();
|
|
|
15
39
|
* would leave a reservation counted against the hourly limit.
|
|
16
40
|
*/
|
|
17
41
|
export const guardedWrite = async (guard, attempt, act, settled = () => ({}), prepare) => {
|
|
42
|
+
const scopes = scopesFor();
|
|
43
|
+
refuseStopped(scopes);
|
|
18
44
|
try {
|
|
19
45
|
await guard.ask?.(attempt);
|
|
46
|
+
refuseStopped(scopes);
|
|
20
47
|
guard.check(attempt);
|
|
21
48
|
}
|
|
22
49
|
catch (error) {
|
|
@@ -43,8 +70,8 @@ export const guardedWrite = async (guard, attempt, act, settled = () => ({}), pr
|
|
|
43
70
|
});
|
|
44
71
|
},
|
|
45
72
|
};
|
|
46
|
-
const scope
|
|
47
|
-
|
|
73
|
+
for (const scope of scopes)
|
|
74
|
+
scope.add(flight);
|
|
48
75
|
try {
|
|
49
76
|
if (prepare !== undefined)
|
|
50
77
|
await prepare();
|
|
@@ -60,10 +87,17 @@ export const guardedWrite = async (guard, attempt, act, settled = () => ({}), pr
|
|
|
60
87
|
catch (error) {
|
|
61
88
|
const code = codeOf(error);
|
|
62
89
|
once({ ...attempt, outcome: code === "outcome_unknown" ? "outcome_unknown" : "failed", errorCode: code });
|
|
90
|
+
if (code === "outcome_unknown" && error instanceof Error)
|
|
91
|
+
throw new CliError("outcome_unknown", error.message, {
|
|
92
|
+
...error.details,
|
|
93
|
+
operationId: attempt.operationId,
|
|
94
|
+
retryable: false,
|
|
95
|
+
});
|
|
63
96
|
throw error;
|
|
64
97
|
}
|
|
65
98
|
finally {
|
|
66
|
-
scope
|
|
99
|
+
for (const scope of scopes)
|
|
100
|
+
scope.delete(flight);
|
|
67
101
|
}
|
|
68
102
|
};
|
|
69
103
|
export const codeOf = (error) => typeof error?.code === "string" ? error.code : "unknown";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guarded.js","sourceRoot":"","sources":["../../src/sends/guarded.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAgB5C,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAU,CAAA;AAS/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"guarded.js","sourceRoot":"","sources":["../../src/sends/guarded.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
export interface SkillValidation {
|
|
3
|
+
folder?: string;
|
|
4
|
+
file?: string;
|
|
5
|
+
version?: string;
|
|
6
|
+
program?: Command;
|
|
7
|
+
}
|
|
8
|
+
export declare const validateSkill: (content: string, options?: SkillValidation) => string[];
|
|
9
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/skills/validate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,aAAa,YAAa,MAAM,YAAW,eAAe,KAAQ,MAAM,EA+EpF,CAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { parseDocument } from "yaml";
|
|
4
|
+
export const validateSkill = (content, options = {}) => {
|
|
5
|
+
const problems = [];
|
|
6
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(content);
|
|
7
|
+
if (!match)
|
|
8
|
+
return ["SKILL.md needs YAML frontmatter"];
|
|
9
|
+
const yaml = parseDocument(match[1] ?? "", { uniqueKeys: true });
|
|
10
|
+
if (yaml.errors.length)
|
|
11
|
+
return ["SKILL.md frontmatter is not valid YAML"];
|
|
12
|
+
let data;
|
|
13
|
+
try {
|
|
14
|
+
data = yaml.toJS({ maxAliasCount: 0 });
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return ["SKILL.md frontmatter cannot be read"];
|
|
18
|
+
}
|
|
19
|
+
if (!data || typeof data !== "object" || Array.isArray(data))
|
|
20
|
+
return ["SKILL.md frontmatter must be an object"];
|
|
21
|
+
const fields = data;
|
|
22
|
+
if (typeof fields.name !== "string" || fields.name.length > 64 || !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(fields.name))
|
|
23
|
+
problems.push("skill name must be 1–64 lowercase letters, digits and single hyphens");
|
|
24
|
+
if (options.folder && fields.name !== options.folder)
|
|
25
|
+
problems.push("skill name must match its folder");
|
|
26
|
+
if (typeof fields.description !== "string" || !fields.description.trim() || fields.description.length > 1024)
|
|
27
|
+
problems.push("skill description must be 1–1024 characters");
|
|
28
|
+
if (fields.compatibility !== undefined &&
|
|
29
|
+
(typeof fields.compatibility !== "string" || fields.compatibility.length > 500))
|
|
30
|
+
problems.push("skill compatibility must be a string of at most 500 characters");
|
|
31
|
+
for (const key of ["license", "allowed-tools"])
|
|
32
|
+
if (fields[key] !== undefined && typeof fields[key] !== "string")
|
|
33
|
+
problems.push(`skill ${key} must be a string`);
|
|
34
|
+
const known = new Set(["name", "description", "license", "compatibility", "allowed-tools", "metadata"]);
|
|
35
|
+
for (const key of Object.keys(fields))
|
|
36
|
+
if (!known.has(key))
|
|
37
|
+
problems.push(`unsupported frontmatter field: ${key}`);
|
|
38
|
+
if (fields.metadata !== undefined &&
|
|
39
|
+
(!fields.metadata ||
|
|
40
|
+
typeof fields.metadata !== "object" ||
|
|
41
|
+
Array.isArray(fields.metadata) ||
|
|
42
|
+
Object.values(fields.metadata).some((value) => typeof value !== "string")))
|
|
43
|
+
problems.push("skill metadata must contain string values");
|
|
44
|
+
if (options.version && fields.metadata?.version !== options.version)
|
|
45
|
+
problems.push("emitted skill version must match the binary");
|
|
46
|
+
const body = content.slice(match[0].length);
|
|
47
|
+
if (options.file) {
|
|
48
|
+
for (const link of body.matchAll(/\[[^\]]*\]\(([^\s)]+)\)/g)) {
|
|
49
|
+
const target = (link[1] ?? "").split("#")[0] ?? "";
|
|
50
|
+
if (!target || /^(?:[a-z]+:|\/)/i.test(target))
|
|
51
|
+
continue;
|
|
52
|
+
if (!existsSync(resolve(dirname(options.file), target)))
|
|
53
|
+
problems.push(`missing skill reference: ${target}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (options.program) {
|
|
57
|
+
const root = options.program;
|
|
58
|
+
const spans = [...body.matchAll(/```[^\n]*\n([\s\S]*?)```|`([^`\n]*(?:\n[^`\n]*)?)`/g)];
|
|
59
|
+
for (const span of spans) {
|
|
60
|
+
const text = span[1] ?? span[2] ?? "";
|
|
61
|
+
const escaped = root.name().replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
62
|
+
for (const call of text.matchAll(new RegExp(`(?:^|[\\s;])(?:${escaped}|\\{\\{command\\}\\})\\s+([^\\n;]+)`, "g"))) {
|
|
63
|
+
const tokens = (call[1] ?? "").trim().split(/\s+/);
|
|
64
|
+
let at = root;
|
|
65
|
+
let start = 0;
|
|
66
|
+
if (!root.commands.some((child) => child.name() === tokens[0]) &&
|
|
67
|
+
root.commands.some((child) => child.name() === tokens[1]))
|
|
68
|
+
start = 1;
|
|
69
|
+
for (const word of tokens.slice(start)) {
|
|
70
|
+
if (!/^[a-z][a-z-]*$/.test(word))
|
|
71
|
+
break;
|
|
72
|
+
const child = at.commands.find((one) => one.name() === word || one.aliases().includes(word));
|
|
73
|
+
if (child) {
|
|
74
|
+
at = child;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if ((at.registeredArguments.length === 0 && at.commands.length > 0) || at === root)
|
|
78
|
+
problems.push(`unknown skill command path: ${[root.name(), ...tokens.slice(start)].join(" ")}`);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return [...new Set(problems)];
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/skills/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/chats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAgB7C,uEAAuE;AACvE,eAAO,MAAM,MAAM,YAAa,YAAY,cAAc,MAAM,WAAW,MAAM,KAAG,EAAE,GAAG,SAK3E,CAAA;AAEd,eAAO,MAAM,UAAU,YAAa,YAAY,cAAc,MAAM,UAAU,EAAE,KAAG,MAAM,GAAG,SAK9E,CAAA;AAEd,yEAAyE;AACzE,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,UAAU,EAAE,KAAG,MAQ/E,CAAA;AAEH,eAAO,MAAM,UAAU,iBAAkB,YAAY,cAAc,MAAM,QAAQ,IAAI,KAAG,IA+BvF,CAAA;AAED,0CAA0C;AAC1C,eAAO,MAAM,YAAY,YACd,YAAY,OAChB,UAAU,cACH,MAAM,UACV,EAAE,aACC,EAAE,EAAE,KACd,IASF,CAAA;AAED,eAAO,MAAM,OAAO,YAAa,YAAY,WAAW,MAAM,KAAG,MAAM,EAO7D,CAAA;AAMV,gGAAgG;AAChG,eAAO,MAAM,QAAQ,YAAa,YAAY,cAAc,MAAM,WAAW,EAAE,EAAE,KAAG,MAYnE,CAAA;AAEjB,8DAA8D;AAC9D,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,KAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAYtG,CAAA;AAED,qGAAqG;AACrG,eAAO,MAAM,UAAU,YAAa,YAAY,OAAO,MAAM,EAAE,KAAG,IAajE,CAAA;AAED,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,OAAO,UAAU,YAAY,EAAE,KAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../../src/store/sqlite/chats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAG/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAgB7C,uEAAuE;AACvE,eAAO,MAAM,MAAM,YAAa,YAAY,cAAc,MAAM,WAAW,MAAM,KAAG,EAAE,GAAG,SAK3E,CAAA;AAEd,eAAO,MAAM,UAAU,YAAa,YAAY,cAAc,MAAM,UAAU,EAAE,KAAG,MAAM,GAAG,SAK9E,CAAA;AAEd,yEAAyE;AACzE,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,UAAU,EAAE,KAAG,MAQ/E,CAAA;AAEH,eAAO,MAAM,UAAU,iBAAkB,YAAY,cAAc,MAAM,QAAQ,IAAI,KAAG,IA+BvF,CAAA;AAED,0CAA0C;AAC1C,eAAO,MAAM,YAAY,YACd,YAAY,OAChB,UAAU,cACH,MAAM,UACV,EAAE,aACC,EAAE,EAAE,KACd,IASF,CAAA;AAED,eAAO,MAAM,OAAO,YAAa,YAAY,WAAW,MAAM,KAAG,MAAM,EAO7D,CAAA;AAMV,gGAAgG;AAChG,eAAO,MAAM,QAAQ,YAAa,YAAY,cAAc,MAAM,WAAW,EAAE,EAAE,KAAG,MAYnE,CAAA;AAEjB,8DAA8D;AAC9D,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,KAAG;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAYtG,CAAA;AAED,qGAAqG;AACrG,eAAO,MAAM,UAAU,YAAa,YAAY,OAAO,MAAM,EAAE,KAAG,IAajE,CAAA;AAED,eAAO,MAAM,SAAS,YAAa,YAAY,cAAc,MAAM,OAAO,UAAU,YAAY,EAAE,KAAG,IAAI,EA4BrE,CAAA;AAiBpC,eAAO,MAAM,SAAS,YACX,YAAY,cACT,MAAM,gCACgB;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,gBAAgB,KACvF,IAAI,CAAC,IAAI,CAUX,CAAA;AAED,eAAO,MAAM,UAAU,YAAa,YAAY,cAAc,MAAM,UAAU,gBAAgB,KAAG,MACY,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CliError } from "@leemour/cli-core";
|
|
2
|
-
import { and, eq, gt, inArray, sql } from "./drizzle/core.js";
|
|
2
|
+
import { and, eq, gt, inArray, or, sql } from "./drizzle/core.js";
|
|
3
3
|
import { identityPk } from "./identities.js";
|
|
4
4
|
import { attachments, chatMembers, chats, fetchLeases, identities, memberCounts, memberStays, messageRevisions, messages, syncRanges, transcripts, } from "./schema.js";
|
|
5
5
|
import { json, parsed, present, toIso, toMs } from "./values.js";
|
|
@@ -111,10 +111,14 @@ export const purgeChats = ({ orm }, pks) => {
|
|
|
111
111
|
};
|
|
112
112
|
export const chatsWith = ({ orm }, accountKey, key, memberId) => orm
|
|
113
113
|
.select({ chat: chats })
|
|
114
|
+
.from(chats)
|
|
115
|
+
.where(and(eq(chats.accountPk, accountKey), notLeft, or(inArray(chats.pk, orm
|
|
116
|
+
.select({ pk: chatMembers.chatPk })
|
|
114
117
|
.from(chatMembers)
|
|
115
|
-
.innerJoin(chats, eq(chats.pk, chatMembers.chatPk))
|
|
116
118
|
.innerJoin(identities, eq(identities.pk, chatMembers.identityPk))
|
|
117
|
-
.where(and(eq(
|
|
119
|
+
.where(and(eq(identities.provider, key.provider), eq(identities.nativeId, memberId)))),
|
|
120
|
+
// Some providers name a private dialog by its partner's id without recording members.
|
|
121
|
+
and(eq(chats.kind, "dialog"), eq(chats.nativeId, memberId), sql `NOT EXISTS (SELECT 1 FROM ${chatMembers} WHERE ${chatMembers.chatPk} = ${chats.pk})`))))
|
|
118
122
|
.orderBy(...byRecency)
|
|
119
123
|
.all()
|
|
120
124
|
.map(({ chat }) => toChat(chat));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/store/sqlite/chats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/store/sqlite/chats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAE5C,OAAO,EACL,WAAW,EACX,WAAW,EACX,KAAK,EACL,WAAW,EACX,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAEhE,uEAAuE;AACvE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,EAAE,GAAG,EAAgB,EAAE,UAAkB,EAAE,OAAe,EAAkB,EAAE,CACnG,GAAG;KACA,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;KAC9B,IAAI,CAAC,KAAK,CAAC;KACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;KAClE,GAAG,EAAE,EAAE,EAAE,CAAA;AAEd,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,GAAG,EAAgB,EAAE,UAAkB,EAAE,MAAU,EAAsB,EAAE,CACtG,GAAG;KACA,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;KACxB,IAAI,CAAC,KAAK,CAAC;KACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;KACvE,GAAG,EAAE,EAAE,EAAE,CAAA;AAEd,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAqB,EAAE,UAAkB,EAAE,MAAU,EAAU,EAAE,CACzF,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC;IACvC,MAAM,CACJ,OAAO,CAAC,GAAG;SACR,MAAM,CAAC,KAAK,CAAC;SACb,MAAM,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;SAC9F,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;SAC3B,GAAG,EAAE,EAAE,EAAE,CACb,CAAA;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAgB,EAAE,UAAkB,EAAE,IAAU,EAAQ,EAAE;IAC7F,GAAG;SACA,MAAM,CAAC,KAAK,CAAC;SACb,MAAM,CAAC;QACN,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,IAAI,CAAC,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QACvC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;QAC7C,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI;QAC7C,SAAS,EAAE,GAAG,EAAE;KACjB,CAAC;SACD,kBAAkB,CAAC;QAClB,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC;QACzC,GAAG,EAAE;YACH,IAAI,EAAE,GAAG,CAAA,eAAe;YACxB,KAAK,EAAE,GAAG,CAAA,gBAAgB;YAC1B,WAAW,EAAE,GAAG,CAAA,uBAAuB;YACvC,aAAa,EAAE,GAAG,CAAA,0BAA0B;YAC5C,iBAAiB,EAAE,GAAG,CAAA,6BAA6B;YACnD,gBAAgB,EAAE,GAAG,CAAA,4BAA4B;YACjD,iFAAiF;YACjF,eAAe,EAAE,GAAG,CAAA;iBACX,KAAK,CAAC,eAAe,4BAA4B,KAAK,CAAC,eAAe,MAAM;YACrF,SAAS,EAAE,GAAG,CAAA,qBAAqB;SACpC;KACF,CAAC;SACD,GAAG,EAAE,CAAA;AACV,CAAC,CAAA;AAED,0CAA0C;AAC1C,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAqB,EACrB,GAAe,EACf,UAAkB,EAClB,MAAU,EACV,SAAe,EACT,EAAE;IACR,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IAC5E,KAAK,MAAM,EAAE,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG;aACR,MAAM,CAAC,WAAW,CAAC;aACnB,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;aAChG,GAAG,EAAE,CAAA;IACV,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,GAAG,EAAgB,EAAE,OAAe,EAAY,EAAE,CAC1E,GAAG;KACA,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;KACzF,IAAI,CAAC,WAAW,CAAC;KACjB,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;KAChE,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,OAAO,CAAC,GAAG,CAAA,GAAG,UAAU,CAAC,IAAI,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;KAC9E,GAAG,EAAE,CAAA;AAEV,MAAM,SAAS,GAAG,CAAC,GAAG,CAAA,GAAG,KAAK,CAAC,aAAa,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;AAEzE,MAAM,OAAO,GAAG,GAAG,CAAA,GAAG,KAAK,CAAC,eAAe,gBAAgB,CAAA;AAE3D,gGAAgG;AAChG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAE,GAAG,EAAgB,EAAE,UAAkB,EAAE,OAAa,EAAU,EAAE,CAC3F,GAAG;KACA,MAAM,CAAC,KAAK,CAAC;KACb,GAAG,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;KAChC,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAC/B,OAAO,EACP,GAAG,CAAA,GAAG,KAAK,CAAC,QAAQ,wCAAwC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CACxF,CACF;KACA,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;KAC3B,GAAG,EAAE,CAAC,MAAM,CAAA;AAEjB,8DAA8D;AAC9D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAE,GAAG,EAAgB,EAAE,UAAkB,EAAuC,EAAE;IAC1G,MAAM,GAAG,GAAG,GAAG;SACZ,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;SACxB,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;SAC9E,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;IACtB,MAAM,KAAK,GACT,GAAG,CAAC,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAQ,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;IACnH,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC,CAAA;AAED,qGAAqG;AACrG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,GAAG,EAAgB,EAAE,GAAa,EAAQ,EAAE;IACvE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;IACtG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IACrE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IACrE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IACrE,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IACrE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IACvE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IACnE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IACzF,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IAC/E,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;IAC/D,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAE,GAAG,EAAgB,EAAE,UAAkB,EAAE,GAAe,EAAE,QAAY,EAAU,EAAE,CAC5G,GAAG;KACA,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;KACvB,IAAI,CAAC,KAAK,CAAC;KACX,KAAK,CACJ,GAAG,CACD,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAC/B,OAAO,EACP,EAAE,CACA,OAAO,CACL,KAAK,CAAC,EAAE,EACR,GAAG;KACA,MAAM,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;KAClC,IAAI,CAAC,WAAW,CAAC;KACjB,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;KAChE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CACxF;AACD,sFAAsF;AACtF,GAAG,CACD,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EACxB,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAC5B,GAAG,CAAA,6BAA6B,WAAW,UAAU,WAAW,CAAC,MAAM,MAAM,KAAK,CAAC,EAAE,GAAG,CACzF,CACF,CACF,CACF;KACA,OAAO,CAAC,GAAG,SAAS,CAAC;KACrB,GAAG,EAAE;KACL,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AAEpC,MAAM,UAAU,GAAG,CAAC,UAAkB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAoB,EAAE,EAAE;IACnF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,mDAAmD,KAAK,GAAG,CAAC,CAAA;IACrG,CAAC;IACD,OAAO,GAAG,CACR,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,EAC/B,OAAO,EACP,KAAK,KAAK,SAAS;QACjB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,GAAG,CAAA,GAAG,KAAK,CAAC,EAAE,0DAA0D,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,EACxH,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EACrD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAC9C,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,EAAE,GAAG,EAAgB,EACrB,UAAkB,EAClB,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,EAA0D,EAC5E,EAAE;IACd,MAAM,IAAI,GAAG,GAAG;SACb,MAAM,EAAE;SACR,IAAI,CAAC,KAAK,CAAC;SACX,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;SACrC,OAAO,CAAC,GAAG,SAAS,CAAC;SACrB,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;SAC3C,MAAM,CAAC,MAAM,CAAC;SACd,GAAG,EAAE,CAAA;IACR,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAA;AACzG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,EAAE,GAAG,EAAgB,EAAE,UAAkB,EAAE,MAAwB,EAAU,EAAE,CACxG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAQ,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;AAE7G,MAAM,MAAM,GAAG,CAAC,GAA8B,EAAQ,EAAE,CAAC,CAAC;IACxD,EAAE,EAAE,GAAG,CAAC,QAAQ;IAChB,KAAK,EAAE,GAAG,CAAC,KAAK;IAChB,IAAI,EAAE,GAAG,CAAC,IAAoB;IAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;IAC5B,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;IACvC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;IACxC,GAAG,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;CACrG,CAAC,CAAA"}
|
|
@@ -18,5 +18,5 @@ export interface SecretInput {
|
|
|
18
18
|
* The prompt goes to **stderr**, not stdout, so that `session start --json` still writes one JSON
|
|
19
19
|
* value and nothing else.
|
|
20
20
|
*/
|
|
21
|
-
export declare const readSecret: (prompt: string, { input, output, echo, signal }?: SecretInput) => Promise<string>;
|
|
21
|
+
export declare const readSecret: (prompt: string, { input, output, echo, signal: givenSignal }?: SecretInput) => Promise<string>;
|
|
22
22
|
//# sourceMappingURL=prompt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/terminal/prompt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/terminal/prompt.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAA;IAC9B,mFAAmF;IACnF,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,iEAAiE;IACjE,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,UAAU,WACb,MAAM,iDACyE,WAAW,KACjG,OAAO,CAAC,MAAM,CAkEhB,CAAA"}
|
package/dist/terminal/prompt.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createInterface } from "node:readline";
|
|
2
2
|
import { Writable } from "node:stream";
|
|
3
3
|
import { CliError } from "@leemour/cli-core";
|
|
4
|
+
import { bufferedInput, inputPolicy, MAX_SECRET_INPUT } from "../cli/input-policy.js";
|
|
4
5
|
/**
|
|
5
6
|
* One line of secret, taken without a file and without argv.
|
|
6
7
|
*
|
|
@@ -11,40 +12,24 @@ import { CliError } from "@leemour/cli-core";
|
|
|
11
12
|
* The prompt goes to **stderr**, not stdout, so that `session start --json` still writes one JSON
|
|
12
13
|
* value and nothing else.
|
|
13
14
|
*/
|
|
14
|
-
export const readSecret = async (prompt, { input = process.stdin, output = process.stderr, echo = false, signal } = {}) => {
|
|
15
|
+
export const readSecret = async (prompt, { input = process.stdin, output = process.stderr, echo = false, signal: givenSignal } = {}) => {
|
|
16
|
+
const policy = inputPolicy(input);
|
|
17
|
+
const signals = [givenSignal, policy.signal].filter((one) => one !== undefined);
|
|
18
|
+
const signal = signals.length ? AbortSignal.any(signals) : undefined;
|
|
15
19
|
const cancelled = () => new CliError("cancelled", "cancelled — nothing was stored");
|
|
16
20
|
if (signal?.aborted)
|
|
17
21
|
throw cancelled();
|
|
22
|
+
if (input.isTTY && policy.noInput)
|
|
23
|
+
throw new CliError("validation_error", "interactive input is disabled — provide the input through a pipe", {
|
|
24
|
+
reason: "input_required",
|
|
25
|
+
});
|
|
18
26
|
if (!input.isTTY) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
26
|
-
const data = (chunk) => chunks.push(Buffer.from(chunk));
|
|
27
|
-
const end = () => {
|
|
28
|
-
cleanup();
|
|
29
|
-
resolve(Buffer.concat(chunks).toString("utf8").trim());
|
|
30
|
-
};
|
|
31
|
-
const error = (cause) => {
|
|
32
|
-
cleanup();
|
|
33
|
-
reject(cause);
|
|
34
|
-
};
|
|
35
|
-
const abort = () => {
|
|
36
|
-
cleanup();
|
|
37
|
-
input.pause();
|
|
38
|
-
reject(cancelled());
|
|
39
|
-
};
|
|
40
|
-
input.on("data", data).once("end", end).once("error", error).once("close", abort);
|
|
41
|
-
signal.addEventListener("abort", abort, { once: true });
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
const chunks = [];
|
|
45
|
-
for await (const chunk of input)
|
|
46
|
-
chunks.push(Buffer.from(chunk));
|
|
47
|
-
return Buffer.concat(chunks).toString("utf8").trim();
|
|
27
|
+
return (await bufferedInput(input, {
|
|
28
|
+
maxBytes: Math.min(policy.maxBytes ?? MAX_SECRET_INPUT, MAX_SECRET_INPUT),
|
|
29
|
+
...(signal ? { signal } : {}),
|
|
30
|
+
}))
|
|
31
|
+
.toString("utf8")
|
|
32
|
+
.trim();
|
|
48
33
|
}
|
|
49
34
|
let muted = false;
|
|
50
35
|
const shim = new Writable({
|
|
@@ -56,11 +41,28 @@ export const readSecret = async (prompt, { input = process.stdin, output = proce
|
|
|
56
41
|
});
|
|
57
42
|
const reader = createInterface({ input, output: shim, terminal: true });
|
|
58
43
|
const abort = () => reader.close();
|
|
44
|
+
let bytes = 0;
|
|
45
|
+
let inputFailure;
|
|
46
|
+
const data = (chunk) => {
|
|
47
|
+
bytes += Buffer.byteLength(chunk);
|
|
48
|
+
if (bytes > Math.min(policy.maxBytes ?? MAX_SECRET_INPUT, MAX_SECRET_INPUT)) {
|
|
49
|
+
inputFailure = new CliError("validation_error", "secret input exceeds its byte limit", {
|
|
50
|
+
reason: "input_limit",
|
|
51
|
+
retryable: false,
|
|
52
|
+
});
|
|
53
|
+
reader.close();
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const inputError = (error) => {
|
|
57
|
+
inputFailure = error;
|
|
58
|
+
reader.close();
|
|
59
|
+
};
|
|
60
|
+
input.on("data", data).on("error", inputError);
|
|
59
61
|
try {
|
|
60
62
|
// Ctrl-C and a closed terminal would otherwise leave this waiting for ever, and Node exits
|
|
61
63
|
// on the unsettled promise with a warning and a code nobody documents.
|
|
62
64
|
const answer = await new Promise((resolve, reject) => {
|
|
63
|
-
const cancel = () => reject(cancelled());
|
|
65
|
+
const cancel = () => reject(inputFailure ?? cancelled());
|
|
64
66
|
reader.once("SIGINT", cancel);
|
|
65
67
|
reader.once("close", cancel);
|
|
66
68
|
signal?.addEventListener("abort", abort, { once: true });
|
|
@@ -70,6 +72,7 @@ export const readSecret = async (prompt, { input = process.stdin, output = proce
|
|
|
70
72
|
return answer.trim();
|
|
71
73
|
}
|
|
72
74
|
finally {
|
|
75
|
+
input.off("data", data).off("error", inputError);
|
|
73
76
|
signal?.removeEventListener("abort", abort);
|
|
74
77
|
reader.close();
|
|
75
78
|
output.write("\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/terminal/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/terminal/prompt.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leemour/cli-messaging",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.157.0",
|
|
4
4
|
"description": "The messenger-neutral half of a messaging CLI: domain model, message locators, rendering, name resolution, the SQLite seam, the command skeleton and shared read commands, the send guard, run records and the message store",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Viacheslav Ptsarev",
|
|
@@ -71,6 +71,10 @@
|
|
|
71
71
|
"./models": {
|
|
72
72
|
"types": "./dist/models/index.d.ts",
|
|
73
73
|
"default": "./dist/models/index.js"
|
|
74
|
+
},
|
|
75
|
+
"./skill-validation": {
|
|
76
|
+
"types": "./dist/skills/validate.d.ts",
|
|
77
|
+
"import": "./dist/skills/validate.js"
|
|
74
78
|
}
|
|
75
79
|
},
|
|
76
80
|
"scripts": {
|
|
@@ -93,7 +97,8 @@
|
|
|
93
97
|
"parity:seed": "tsc --build && node --experimental-strip-types scripts/parity-seed.ts",
|
|
94
98
|
"parity:render": "node --experimental-strip-types scripts/parity-render.ts",
|
|
95
99
|
"parity:audit": "tsc --build && node --experimental-strip-types scripts/parity-audit.ts",
|
|
96
|
-
"search:docs": "pnpm build && node scripts/search-docs.ts"
|
|
100
|
+
"search:docs": "pnpm build && node scripts/search-docs.ts",
|
|
101
|
+
"check:agent-process": "pnpm build && node --experimental-strip-types scripts/check-agent-process.ts"
|
|
97
102
|
},
|
|
98
103
|
"dependencies": {
|
|
99
104
|
"@anthropic-ai/sdk": "0.131.0",
|
|
@@ -113,7 +118,8 @@
|
|
|
113
118
|
"sherpa-onnx": "1.13.8",
|
|
114
119
|
"string-width": "8.3.0",
|
|
115
120
|
"valibot": "1.5.0",
|
|
116
|
-
"wrap-ansi": "10.0.2"
|
|
121
|
+
"wrap-ansi": "10.0.2",
|
|
122
|
+
"yaml": "2.9.1"
|
|
117
123
|
},
|
|
118
124
|
"devDependencies": {
|
|
119
125
|
"@biomejs/biome": "^2.3.14",
|