@michinarai/cli 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/dev.d.ts +1 -0
- package/dist/commands/dev.js +24 -5
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/login.js +1 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/lib/credentials.js +7 -1
- package/dist/lib/credentials.js.map +1 -1
- package/dist/lib/http.js +10 -1
- package/dist/lib/http.js.map +1 -1
- package/package.json +1 -1
- package/templates/tool/src/index.html +1 -0
- package/templates/tool/src/tool.js +7 -1
package/dist/commands/dev.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export default class Dev extends NaraiCommand<typeof Dev> {
|
|
|
10
10
|
task: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
11
11
|
preset: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
12
|
grant: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
"no-open": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
13
14
|
};
|
|
14
15
|
run(): Promise<void>;
|
|
15
16
|
}
|
package/dist/commands/dev.js
CHANGED
|
@@ -3,6 +3,7 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import { Flags } from "@oclif/core";
|
|
4
4
|
import { startHarness } from "@michinarai/sdk/harness";
|
|
5
5
|
import { NaraiCommand } from "../base-command.js";
|
|
6
|
+
import { deps } from "../lib/deps.js";
|
|
6
7
|
import { NaraiError } from "../lib/errors.js";
|
|
7
8
|
import { checkedManifest, toolRoot } from "../lib/project.js";
|
|
8
9
|
async function json(path, what) {
|
|
@@ -15,20 +16,28 @@ async function json(path, what) {
|
|
|
15
16
|
throw new NaraiError(`${what} ${path}: ${error.message}`, "bad_input");
|
|
16
17
|
}
|
|
17
18
|
}
|
|
19
|
+
/** The task a step would start the tool on, for its first answer kind: none when it answers nothing. */
|
|
20
|
+
function sampleTask(manifest) {
|
|
21
|
+
const kind = Object.keys(manifest.answers ?? {})[0];
|
|
22
|
+
if (!kind)
|
|
23
|
+
return undefined;
|
|
24
|
+
return { id: "dev_task", kind, assist: "allowed", prompt: `A sample task (${kind}): in a lesson, Narai writes the prompt.` };
|
|
25
|
+
}
|
|
18
26
|
export default class Dev extends NaraiCommand {
|
|
19
27
|
static summary = "Run the tool in the local harness, mounted as a lesson mounts it.";
|
|
20
|
-
static description = "Narai's host on http://localhost, the tool on http://127.0.0.1 in a sandboxed iframe: two origins, the real handshake, every message checked against the manifest.
|
|
28
|
+
static description = "Narai's host on http://localhost, the tool on http://127.0.0.1 in a sandboxed iframe: two origins, the real handshake, every message checked against the manifest. It opens the host's address in your browser; stop with Ctrl-C. Without --task the tool starts on a sample task of the manifest's first answer kind. It runs on this machine only: Narai's lessons see a tool once it's registered and pushed (narai login, narai tools register, narai tools push).";
|
|
21
29
|
static flags = {
|
|
22
30
|
dir: Flags.string({ description: "The tool's built files (served at the embed URL's path).", default: "dist" }),
|
|
23
31
|
port: Flags.integer({ description: "The host page's port (default: any free one)." }),
|
|
24
32
|
"tool-port": Flags.integer({ description: "The tool's port (default: any free one)." }),
|
|
25
33
|
locale: Flags.string({ description: "The locale the tool starts in (default: its first)." }),
|
|
26
|
-
task: Flags.string({ description: "A JSON file: the task Narai would start it on ({id, kind, assist, prompt})." }),
|
|
34
|
+
task: Flags.string({ description: "A JSON file: the task Narai would start it on ({id, kind, assist, prompt}). Default: a sample task of the manifest's first answer kind." }),
|
|
27
35
|
preset: Flags.string({ description: "A JSON file: the step's preset payload ({schema, ...})." }),
|
|
28
36
|
grant: Flags.string({
|
|
29
37
|
description: "What the step grants the tool, as Narai's start does: only what the manifest's capabilities declare.",
|
|
30
38
|
options: ["microphone"], multiple: true,
|
|
31
39
|
}),
|
|
40
|
+
"no-open": Flags.boolean({ description: "Print the host's address; don't open it." }),
|
|
32
41
|
};
|
|
33
42
|
async run() {
|
|
34
43
|
const root = await toolRoot(process.cwd());
|
|
@@ -42,8 +51,10 @@ export default class Dev extends NaraiCommand {
|
|
|
42
51
|
options.locale = this.flags.locale;
|
|
43
52
|
const task = await json(this.flags.task, "task");
|
|
44
53
|
const preset = await json(this.flags.preset, "preset");
|
|
45
|
-
|
|
46
|
-
|
|
54
|
+
// no --task: a sample of what a step starts it on, so the tool's answer has something to answer
|
|
55
|
+
const started = task ?? sampleTask(manifest);
|
|
56
|
+
if (started)
|
|
57
|
+
options.task = started;
|
|
47
58
|
if (preset)
|
|
48
59
|
options.preset = preset;
|
|
49
60
|
// Narai grants only what the manifest declares and drops the rest: so does this, saying so
|
|
@@ -54,7 +65,15 @@ export default class Dev extends NaraiCommand {
|
|
|
54
65
|
this.out.progress(`not granted: ${g} (the manifest's capabilities.${g} isn't true)`);
|
|
55
66
|
options.granted = granted;
|
|
56
67
|
const harness = await startHarness(options);
|
|
57
|
-
|
|
68
|
+
const kind = options.task?.kind ?? null;
|
|
69
|
+
this.out.result({ host: harness.hostUrl, tool: harness.toolUrl, task: kind, granted }, () => [
|
|
70
|
+
`Open ${harness.hostUrl} in a browser: your tool, mounted as a lesson mounts it, and what it sends Narai.`,
|
|
71
|
+
`task ${kind ?? "none (the manifest answers nothing)"}${task ? "" : kind ? " (a sample; --task <file> starts another)" : ""}`,
|
|
72
|
+
...(granted.length ? [`granted ${granted.join(", ")}`] : []),
|
|
73
|
+
"This runs on this machine only. To use the tool in a Narai lesson: narai login, narai tools register, narai tools push.",
|
|
74
|
+
]);
|
|
75
|
+
if (!this.out.json && !this.flags["no-open"])
|
|
76
|
+
deps.openBrowser(harness.hostUrl);
|
|
58
77
|
this.out.progress("Ctrl-C to stop");
|
|
59
78
|
await new Promise((done) => {
|
|
60
79
|
const stop = () => { void harness.close().then(done); };
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAuB,MAAM,yBAAyB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE9D,KAAK,UAAU,IAAI,CAAC,IAAwB,EAAE,IAAY;IACxD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,IAAI,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IACpF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,YAAwB;IACvD,MAAM,CAAU,OAAO,GAAG,mEAAmE,CAAC;IAC9F,MAAM,CAAU,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -23,6 +23,7 @@ export default class Login extends NaraiCommand {
|
|
|
23
23
|
this.out.prompt(`Sign in to Narai: ${url}`);
|
|
24
24
|
if (!this.flags["no-browser"])
|
|
25
25
|
deps.openBrowser(url);
|
|
26
|
+
this.out.prompt("Waiting for you to approve it in the browser (Ctrl-C to stop)");
|
|
26
27
|
const code = await loopback.code;
|
|
27
28
|
const tokens = await exchangeCode(meta, { naraiUrl, code, verifier, redirectUri: loopback.redirectUri });
|
|
28
29
|
const host = new URL(naraiUrl).host;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,YAA0B;IAC3D,MAAM,CAAU,OAAO,GAAG,wEAAwE,CAAC;IACnG,MAAM,CAAU,WAAW,GAAG,wNAAwN,CAAC;IACvP,MAAM,CAAU,KAAK,GAAG;QACtB,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;QACzF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,kCAAkC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;KAC1F,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QACvI,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACtG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YACzG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YACpC,MAAM,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;YAClG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,YAA0B;IAC3D,MAAM,CAAU,OAAO,GAAG,wEAAwE,CAAC;IACnG,MAAM,CAAU,WAAW,GAAG,wNAAwN,CAAC;IACvP,MAAM,CAAU,KAAK,GAAG;QACtB,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;QACzF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,kCAAkC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;KAC1F,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QACvI,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACtG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC;YACjF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YACzG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YACpC,MAAM,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;YAClG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC5F,CAAC;gBAAS,CAAC;YACT,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;IACH,CAAC"}
|
package/dist/lib/credentials.js
CHANGED
|
@@ -18,7 +18,13 @@ async function entry(naraiUrl) {
|
|
|
18
18
|
catch (error) {
|
|
19
19
|
throw new KeychainUnavailableError(error);
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
// a Linux machine with no Secret Service fails here, as the entry is made
|
|
22
|
+
try {
|
|
23
|
+
return new keyring.AsyncEntry(keychainService(naraiUrl), ACCOUNT);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new KeychainUnavailableError(error);
|
|
27
|
+
}
|
|
22
28
|
}
|
|
23
29
|
async function guarded(action) {
|
|
24
30
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;mDAEmD;AACnD,MAAM,OAAO,GAAG,eAAe,CAAC;AAEhC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,yBAAyB,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAS/G,MAAM,wBAAyB,SAAQ,UAAU;IAC/C,YAAY,KAAc;QACxB,KAAK,CACH,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,EACxI,sBAAsB,CACvB,CAAC;IACJ,CAAC;CACF;AAED,uFAAuF;AACvF,KAAK,UAAU,KAAK,CAAC,QAAgB;IACnC,IAAI,OAA0C,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;mDAEmD;AACnD,MAAM,OAAO,GAAG,eAAe,CAAC;AAEhC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,yBAAyB,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAS/G,MAAM,wBAAyB,SAAQ,UAAU;IAC/C,YAAY,KAAc;QACxB,KAAK,CACH,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,EACxI,sBAAsB,CACvB,CAAC;IACJ,CAAC;CACF;AAED,uFAAuF;AACvF,KAAK,UAAU,KAAK,CAAC,QAAgB;IACnC,IAAI,OAA0C,CAAC;IAC/C,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IACD,0EAA0E;IAC1E,IAAI,CAAC;QACH,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAI,MAAwB;IAChD,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAoB;IACvC,KAAK,CAAC,GAAG,CAAC,QAAQ;QAChB,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK;QACvB,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,QAAQ;QACnB,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC"}
|
package/dist/lib/http.js
CHANGED
|
@@ -5,7 +5,16 @@ export async function send(url, init = {}) {
|
|
|
5
5
|
return await fetch(url, { redirect: "manual", signal: AbortSignal.timeout(30_000), ...init });
|
|
6
6
|
}
|
|
7
7
|
catch (error) {
|
|
8
|
-
throw new NaraiError(
|
|
8
|
+
throw new NaraiError(unreached(new URL(url).host, error), "network");
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
+
// Node's certificate errors: a self-signed one, or a server that leaves out its chain
|
|
12
|
+
const UNTRUSTED = /^(UNABLE_TO_VERIFY_LEAF_SIGNATURE|UNABLE_TO_GET_ISSUER_CERT(_LOCALLY)?|SELF_SIGNED_CERT_IN_CHAIN|DEPTH_ZERO_SELF_SIGNED_CERT|CERT_HAS_EXPIRED|ERR_TLS_CERT_ALTNAME_INVALID)$/;
|
|
13
|
+
/** fetch says only "fetch failed": the reason is its cause. */
|
|
14
|
+
function unreached(host, error) {
|
|
15
|
+
const cause = error.cause;
|
|
16
|
+
if (cause?.code && UNTRUSTED.test(cause.code))
|
|
17
|
+
return `${host}'s certificate isn't trusted (${cause.code}: ${cause.message ?? ""}); for a local Narai signed by your own CA, set NODE_EXTRA_CA_CERTS to that CA's file`;
|
|
18
|
+
return `couldn't reach ${host}: ${cause?.message ?? error.message}`;
|
|
19
|
+
}
|
|
11
20
|
//# sourceMappingURL=http.js.map
|
package/dist/lib/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,OAAoB,EAAE;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,OAAoB,EAAE;IAC5D,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,SAAS,GAAG,8KAA8K,CAAC;AAEjM,+DAA+D;AAC/D,SAAS,SAAS,CAAC,IAAY,EAAE,KAAc;IAC7C,MAAM,KAAK,GAAI,KAAyD,CAAC,KAAK,CAAC;IAC/E,IAAI,KAAK,EAAE,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,GAAG,IAAI,iCAAiC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,IAAI,EAAE,uFAAuF,CAAC;IACxN,OAAO,kBAAkB,IAAI,KAAK,KAAK,EAAE,OAAO,IAAK,KAAe,CAAC,OAAO,EAAE,CAAC;AACjF,CAAC"}
|
package/package.json
CHANGED
|
@@ -11,13 +11,19 @@ $("prompt").textContent = tool.task?.prompt ?? "";
|
|
|
11
11
|
// the first of the learner's locales this tool has (manifest.locales), else its first
|
|
12
12
|
tool.ready(pickLocale(tool.start, manifest.locales));
|
|
13
13
|
|
|
14
|
+
// say what happened: a button that does nothing looks broken
|
|
15
|
+
const status = (text) => { $("status").textContent = text; };
|
|
16
|
+
|
|
14
17
|
$("say").onclick = () => {
|
|
15
|
-
|
|
18
|
+
// a launch with no task (practice) has nothing to answer
|
|
19
|
+
if (!tool.task) return status("No task to answer: in a lesson, Narai starts one. Practice still works.");
|
|
16
20
|
// what the learner did, in the payload the manifest declares for this task's kind: never whether it's right
|
|
17
21
|
tool.answer({ schema: manifest.answers[tool.task.kind], text: $("text").value });
|
|
22
|
+
status("Answer sent: Narai judges it.");
|
|
18
23
|
};
|
|
19
24
|
$("drill").onclick = () => {
|
|
20
25
|
tool.practice("drill", { duration_s: 30, attempts: 1, payload: { schema: manifest.practice.drill, rounds: 1 } });
|
|
26
|
+
status("Practice sent.");
|
|
21
27
|
};
|
|
22
28
|
|
|
23
29
|
// The microphone is the step's to grant, launch by launch (tool.start.granted), and only when the manifest declares it
|