@introspection-ai/recipes 0.13.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/LICENSE +191 -0
- package/README.md +184 -0
- package/dist/agent-tool.d.ts +42 -0
- package/dist/agent-tool.d.ts.map +1 -0
- package/dist/agent-tool.js +159 -0
- package/dist/agent-tool.js.map +1 -0
- package/dist/child-agent-completions.d.ts +61 -0
- package/dist/child-agent-completions.d.ts.map +1 -0
- package/dist/child-agent-completions.js +135 -0
- package/dist/child-agent-completions.js.map +1 -0
- package/dist/child-agent-store.d.ts +48 -0
- package/dist/child-agent-store.d.ts.map +1 -0
- package/dist/child-agent-store.js +98 -0
- package/dist/child-agent-store.js.map +1 -0
- package/dist/child-agent.d.ts +43 -0
- package/dist/child-agent.d.ts.map +1 -0
- package/dist/child-agent.js +268 -0
- package/dist/child-agent.js.map +1 -0
- package/dist/direct-cli.d.ts +9 -0
- package/dist/direct-cli.d.ts.map +1 -0
- package/dist/direct-cli.js +22 -0
- package/dist/direct-cli.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +26 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +70 -0
- package/dist/inspect.js.map +1 -0
- package/dist/interactions.d.ts +204 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +358 -0
- package/dist/interactions.js.map +1 -0
- package/dist/mcp-catalog.d.ts +8 -0
- package/dist/mcp-catalog.d.ts.map +1 -0
- package/dist/mcp-catalog.js +60 -0
- package/dist/mcp-catalog.js.map +1 -0
- package/dist/mcp-cli-core.d.ts +79 -0
- package/dist/mcp-cli-core.d.ts.map +1 -0
- package/dist/mcp-cli-core.js +1717 -0
- package/dist/mcp-cli-core.js.map +1 -0
- package/dist/mcp-cli-help.d.ts +2 -0
- package/dist/mcp-cli-help.d.ts.map +1 -0
- package/dist/mcp-cli-help.js +36 -0
- package/dist/mcp-cli-help.js.map +1 -0
- package/dist/mcp-cli-policy.d.ts +17 -0
- package/dist/mcp-cli-policy.d.ts.map +1 -0
- package/dist/mcp-cli-policy.js +230 -0
- package/dist/mcp-cli-policy.js.map +1 -0
- package/dist/mcp-cli.d.ts +3 -0
- package/dist/mcp-cli.d.ts.map +1 -0
- package/dist/mcp-cli.js +33 -0
- package/dist/mcp-cli.js.map +1 -0
- package/dist/mcp-client.d.ts +3 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +86 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-command-context.d.ts +13 -0
- package/dist/mcp-command-context.d.ts.map +1 -0
- package/dist/mcp-command-context.js +29 -0
- package/dist/mcp-command-context.js.map +1 -0
- package/dist/mcp-contract.d.ts +16 -0
- package/dist/mcp-contract.d.ts.map +1 -0
- package/dist/mcp-contract.js +306 -0
- package/dist/mcp-contract.js.map +1 -0
- package/dist/mcp-daemon-client.d.ts +10 -0
- package/dist/mcp-daemon-client.d.ts.map +1 -0
- package/dist/mcp-daemon-client.js +119 -0
- package/dist/mcp-daemon-client.js.map +1 -0
- package/dist/mcp-daemon-protocol.d.ts +64 -0
- package/dist/mcp-daemon-protocol.d.ts.map +1 -0
- package/dist/mcp-daemon-protocol.js +6 -0
- package/dist/mcp-daemon-protocol.js.map +1 -0
- package/dist/mcp-daemon.d.ts +3 -0
- package/dist/mcp-daemon.d.ts.map +1 -0
- package/dist/mcp-daemon.js +76880 -0
- package/dist/mcp-daemon.js.map +1 -0
- package/dist/mcp-run-worker.d.ts +2 -0
- package/dist/mcp-run-worker.d.ts.map +1 -0
- package/dist/mcp-run-worker.js +76579 -0
- package/dist/mcp-run-worker.js.map +1 -0
- package/dist/mcp.d.ts +168 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +558 -0
- package/dist/mcp.js.map +1 -0
- package/dist/pi-extension.d.ts +30 -0
- package/dist/pi-extension.d.ts.map +1 -0
- package/dist/pi-extension.js +880 -0
- package/dist/pi-extension.js.map +1 -0
- package/dist/provider-env.d.ts +2 -0
- package/dist/provider-env.d.ts.map +1 -0
- package/dist/provider-env.js +21 -0
- package/dist/provider-env.js.map +1 -0
- package/dist/recipe/resolve.d.ts +30 -0
- package/dist/recipe/resolve.d.ts.map +1 -0
- package/dist/recipe/resolve.js +131 -0
- package/dist/recipe/resolve.js.map +1 -0
- package/dist/recipe-agent.d.ts +71 -0
- package/dist/recipe-agent.d.ts.map +1 -0
- package/dist/recipe-agent.js +555 -0
- package/dist/recipe-agent.js.map +1 -0
- package/dist/recipe-extensions.d.ts +9 -0
- package/dist/recipe-extensions.d.ts.map +1 -0
- package/dist/recipe-extensions.js +81 -0
- package/dist/recipe-extensions.js.map +1 -0
- package/dist/recipe-mcp-config.d.ts +15 -0
- package/dist/recipe-mcp-config.d.ts.map +1 -0
- package/dist/recipe-mcp-config.js +82 -0
- package/dist/recipe-mcp-config.js.map +1 -0
- package/dist/recipe-model.d.ts +49 -0
- package/dist/recipe-model.d.ts.map +1 -0
- package/dist/recipe-model.js +299 -0
- package/dist/recipe-model.js.map +1 -0
- package/dist/recipe-package.d.ts +79 -0
- package/dist/recipe-package.d.ts.map +1 -0
- package/dist/recipe-package.js +479 -0
- package/dist/recipe-package.js.map +1 -0
- package/dist/recipe-skills.d.ts +7 -0
- package/dist/recipe-skills.d.ts.map +1 -0
- package/dist/recipe-skills.js +46 -0
- package/dist/recipe-skills.js.map +1 -0
- package/dist/run-controller.d.ts +32 -0
- package/dist/run-controller.d.ts.map +1 -0
- package/dist/run-controller.js +259 -0
- package/dist/run-controller.js.map +1 -0
- package/dist/run.d.ts +28 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +84 -0
- package/dist/run.js.map +1 -0
- package/dist/session.d.ts +140 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +363 -0
- package/dist/session.js.map +1 -0
- package/dist/test-utils.d.ts +32 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +259 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/testing.d.ts +25 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +96 -0
- package/dist/testing.js.map +1 -0
- package/docs/agent-composition.md +196 -0
- package/docs/deployment-configuration.md +65 -0
- package/docs/index.md +49 -0
- package/docs/interactions.md +210 -0
- package/docs/mcp-auth.md +80 -0
- package/docs/mcp-configuration.md +126 -0
- package/docs/migration.md +70 -0
- package/docs/pi-extension.md +97 -0
- package/docs/python-bindings-release.md +47 -0
- package/docs/recipe-evals.md +70 -0
- package/docs/recipe-flow.md +41 -0
- package/docs/recipe-format.md +186 -0
- package/docs/recipe-judges.md +152 -0
- package/docs/runtime-library.md +171 -0
- package/package.json +106 -0
- package/vendor/mcp-client/darwin-arm64/mcp-client +0 -0
- package/vendor/mcp-client/darwin-x64/mcp-client +0 -0
- package/vendor/mcp-client/linux-arm64/mcp-client +0 -0
- package/vendor/mcp-client/linux-x64/mcp-client +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
/**
|
|
5
|
+
* True when the current process was launched with the given module as its
|
|
6
|
+
* entry script. Compares realpaths: package-manager bin shims and
|
|
7
|
+
* node_modules symlinks (pnpm) hand us a symlinked argv[1] while
|
|
8
|
+
* import.meta.url is the real path, so naive equality would silently skip
|
|
9
|
+
* the CLI main. Callers pass their own `import.meta.url`.
|
|
10
|
+
*/
|
|
11
|
+
export function isDirectEntry(moduleUrl, entry = process.argv[1]) {
|
|
12
|
+
if (!entry)
|
|
13
|
+
return false;
|
|
14
|
+
const modulePath = fileURLToPath(moduleUrl);
|
|
15
|
+
try {
|
|
16
|
+
return realpathSync(entry) === realpathSync(modulePath);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return resolve(entry) === modulePath;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=direct-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-cli.js","sourceRoot":"","sources":["../src/direct-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,SAAiB,EACjB,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvB,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC;IACvC,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from "./interactions.js";
|
|
2
|
+
export * from "./agent-tool.js";
|
|
3
|
+
export * from "./inspect.js";
|
|
4
|
+
export * from "./mcp-catalog.js";
|
|
5
|
+
export * from "./mcp.js";
|
|
6
|
+
export * from "./pi-extension.js";
|
|
7
|
+
export * from "./recipe-agent.js";
|
|
8
|
+
export * from "./recipe-model.js";
|
|
9
|
+
export * from "./recipe-package.js";
|
|
10
|
+
export * from "./recipe/resolve.js";
|
|
11
|
+
export * from "./run.js";
|
|
12
|
+
export * from "./run-controller.js";
|
|
13
|
+
export * from "./session.js";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from "./interactions.js";
|
|
2
|
+
export * from "./agent-tool.js";
|
|
3
|
+
export * from "./inspect.js";
|
|
4
|
+
export * from "./mcp-catalog.js";
|
|
5
|
+
export * from "./mcp.js";
|
|
6
|
+
export * from "./pi-extension.js";
|
|
7
|
+
export * from "./recipe-agent.js";
|
|
8
|
+
export * from "./recipe-model.js";
|
|
9
|
+
export * from "./recipe-package.js";
|
|
10
|
+
export * from "./recipe/resolve.js";
|
|
11
|
+
export * from "./run.js";
|
|
12
|
+
export * from "./run-controller.js";
|
|
13
|
+
export * from "./session.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a recipe requires before it can run, derived entirely from the
|
|
3
|
+
* package's existing declarations — no new manifest keys. Hosts and adapters
|
|
4
|
+
* can use this for preflight checks and configuration UIs.
|
|
5
|
+
*/
|
|
6
|
+
export interface RecipeInspection {
|
|
7
|
+
name: string;
|
|
8
|
+
version: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
agents: string[];
|
|
11
|
+
providers: string[];
|
|
12
|
+
credential_env: string[];
|
|
13
|
+
mcp: {
|
|
14
|
+
required: string[];
|
|
15
|
+
optional: string[];
|
|
16
|
+
};
|
|
17
|
+
mcp_env: string[];
|
|
18
|
+
resources: {
|
|
19
|
+
agents: number;
|
|
20
|
+
skills: number;
|
|
21
|
+
extensions: number;
|
|
22
|
+
prompts: number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare function inspectRecipe(recipeDir: string): RecipeInspection;
|
|
26
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAChD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAiFjE"}
|
package/dist/inspect.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { loadRecipeAgentDefinitions } from "./recipe-agent.js";
|
|
4
|
+
import { generatedBindingEnvVars, placeholderEnvVars, recipeMcpLocalConfigPath, recipeMcpLocalExamplePath, } from "./recipe-mcp-config.js";
|
|
5
|
+
import { packageResourcePaths, readPiPackageManifest, } from "./recipe-package.js";
|
|
6
|
+
import { expectedProviderEnvVars } from "./provider-env.js";
|
|
7
|
+
export function inspectRecipe(recipeDir) {
|
|
8
|
+
const dir = resolve(recipeDir);
|
|
9
|
+
const manifest = readPiPackageManifest(dir);
|
|
10
|
+
const definitions = loadRecipeAgentDefinitions(dir);
|
|
11
|
+
const agents = [...new Set([...definitions.values()].map((a) => a.name))];
|
|
12
|
+
const providers = [
|
|
13
|
+
...new Set([...definitions.values()].flatMap((agent) => {
|
|
14
|
+
const spec = agent.model?.name;
|
|
15
|
+
const slash = spec?.indexOf("/") ?? -1;
|
|
16
|
+
return spec && slash > 0 ? [spec.slice(0, slash)] : [];
|
|
17
|
+
})),
|
|
18
|
+
];
|
|
19
|
+
const credentialEnv = [
|
|
20
|
+
...new Set(providers.flatMap((provider) => expectedProviderEnvVars(provider === "gemini" ? "google" : provider))),
|
|
21
|
+
].sort();
|
|
22
|
+
const required = manifest.mcp.servers
|
|
23
|
+
.filter((server) => server.required)
|
|
24
|
+
.map((server) => server.id);
|
|
25
|
+
const optional = manifest.mcp.servers
|
|
26
|
+
.filter((server) => !server.required)
|
|
27
|
+
.map((server) => server.id);
|
|
28
|
+
// Binding env vars: prefer the recipe's own binding file (or its example)
|
|
29
|
+
// when present; otherwise the generated-binding convention per server.
|
|
30
|
+
let mcpEnv;
|
|
31
|
+
const bindingSource = [
|
|
32
|
+
recipeMcpLocalConfigPath(dir),
|
|
33
|
+
recipeMcpLocalExamplePath(dir),
|
|
34
|
+
].find((path) => existsSync(path));
|
|
35
|
+
if (bindingSource) {
|
|
36
|
+
const content = readFileSync(bindingSource, "utf8");
|
|
37
|
+
const parsed = JSON.parse(content);
|
|
38
|
+
mcpEnv = [
|
|
39
|
+
...new Set([
|
|
40
|
+
...placeholderEnvVars(content),
|
|
41
|
+
...(parsed.servers ?? []).flatMap((server) => typeof server.oauthClientSecretEnv === "string" &&
|
|
42
|
+
server.oauthClientSecretEnv
|
|
43
|
+
? [server.oauthClientSecretEnv]
|
|
44
|
+
: []),
|
|
45
|
+
]),
|
|
46
|
+
].sort();
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
mcpEnv = [
|
|
50
|
+
...new Set(manifest.mcp.servers.flatMap((server) => generatedBindingEnvVars(server.id))),
|
|
51
|
+
].sort();
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
name: manifest.name,
|
|
55
|
+
version: manifest.version,
|
|
56
|
+
...(manifest.description ? { description: manifest.description } : {}),
|
|
57
|
+
agents,
|
|
58
|
+
providers,
|
|
59
|
+
credential_env: credentialEnv,
|
|
60
|
+
mcp: { required, optional },
|
|
61
|
+
mcp_env: mcpEnv,
|
|
62
|
+
resources: {
|
|
63
|
+
agents: agents.length,
|
|
64
|
+
skills: packageResourcePaths(manifest, "skills").length,
|
|
65
|
+
extensions: packageResourcePaths(manifest, "extensions").length,
|
|
66
|
+
prompts: packageResourcePaths(manifest, "prompts").length,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interaction mechanics for recipe tools: ask the user a question or request
|
|
3
|
+
* approval with one contract that works on every pi host.
|
|
4
|
+
*
|
|
5
|
+
* This module registers no tools. Recipes own their interaction tools and call
|
|
6
|
+
* `askUserQuestion()` or `askUserApproval()` from the tool's `execute()`;
|
|
7
|
+
* raw `askUser()` is the lower-level escape hatch. The module resolves the
|
|
8
|
+
* best available interaction channel and always returns a finished tool result:
|
|
9
|
+
*
|
|
10
|
+
* 1. `PI_ASK_USER_AUTO_APPROVE` — headless/CI: confirmations approve,
|
|
11
|
+
* questions decline. Deterministic, never blocks.
|
|
12
|
+
* 2. `ctx.hasUI` (TUI and RPC modes) — walk the built-in dialogs, or the
|
|
13
|
+
* caller's `interactive` override.
|
|
14
|
+
* 3. `PI_INTERRUPT_RESUME` (host capability flag) — return an "Awaiting
|
|
15
|
+
* user response." result carrying a `details.interrupt` pause
|
|
16
|
+
* descriptor; the host pauses the run and later resumes it by rewriting
|
|
17
|
+
* this tool result with the user's response envelope.
|
|
18
|
+
* 4. Otherwise — report that interaction is unavailable so the model asks
|
|
19
|
+
* in its plain chat reply instead. An unrendered question is never
|
|
20
|
+
* treated as declined.
|
|
21
|
+
*
|
|
22
|
+
* The response envelopes are a frozen wire contract shared with interrupt-
|
|
23
|
+
* capable hosts (see `docs/interactions.md`): both sides must synthesize
|
|
24
|
+
* byte-identical text for the same outcome so recipes cannot tell whether an
|
|
25
|
+
* answer arrived through a local dialog or a remote resume.
|
|
26
|
+
*
|
|
27
|
+
* A `details.interrupt` with `outcome.type === "awaiting_user"` is the pause
|
|
28
|
+
* signal. Runtime hosts may adapt it to their own pause/resume state.
|
|
29
|
+
*/
|
|
30
|
+
import type { ExtensionContext, ExtensionUIContext, ExtensionUIDialogOptions } from "@earendil-works/pi-coding-agent";
|
|
31
|
+
/** Well-known `reason` for a question the model needs answered. */
|
|
32
|
+
export declare const ASK_USER_REASON_INPUT_REQUIRED = "input_required";
|
|
33
|
+
/** Well-known `reason` for an approve/request-changes decision. */
|
|
34
|
+
export declare const ASK_USER_REASON_CONFIRMATION = "confirmation";
|
|
35
|
+
/** Well-known `reason` for a decision bound to a specific tool call. */
|
|
36
|
+
export declare const ASK_USER_REASON_TOOL_CALL = "tool_call";
|
|
37
|
+
/**
|
|
38
|
+
* Default dialog timeout applied in RPC mode only. RPC clients may never
|
|
39
|
+
* render a dialog, so an unanswered one must not wedge the session; the TUI
|
|
40
|
+
* gets no default timeout (a visible dialog can wait for the user).
|
|
41
|
+
*/
|
|
42
|
+
export declare const DEFAULT_RPC_DIALOG_TIMEOUT_MS = 120000;
|
|
43
|
+
/** Optional structured rendering hints for hosts with richer UI. */
|
|
44
|
+
export interface AskUserDisplay {
|
|
45
|
+
/** Renderer kind, e.g. `search_proposal`. */
|
|
46
|
+
kind: string;
|
|
47
|
+
/** Short title for local dialogs and rich cards. */
|
|
48
|
+
title?: string;
|
|
49
|
+
/** Main body copy. Plain text or markdown-style text. */
|
|
50
|
+
body?: string;
|
|
51
|
+
/** Optional grouped content for clients that render rows or sections. */
|
|
52
|
+
sections?: Array<{
|
|
53
|
+
title: string;
|
|
54
|
+
body?: string;
|
|
55
|
+
items?: string[];
|
|
56
|
+
}>;
|
|
57
|
+
}
|
|
58
|
+
/** A selectable answer option. `value` is what the tool receives. */
|
|
59
|
+
export interface AskUserOption {
|
|
60
|
+
label: string;
|
|
61
|
+
value?: string;
|
|
62
|
+
description?: string;
|
|
63
|
+
}
|
|
64
|
+
/** What the recipe tool wants from the user. */
|
|
65
|
+
export interface AskUserRequest {
|
|
66
|
+
/**
|
|
67
|
+
* Why the run needs the user. Open string; well-known values are
|
|
68
|
+
* `input_required` (a question) and `confirmation` (approve / request
|
|
69
|
+
* changes). Unknown reasons follow the question flow.
|
|
70
|
+
*/
|
|
71
|
+
reason: string;
|
|
72
|
+
/** The human-readable prompt shown to the user. */
|
|
73
|
+
message: string;
|
|
74
|
+
/** Optional choices for a question. Hosts may also allow a custom answer. */
|
|
75
|
+
options?: readonly (string | AskUserOption)[];
|
|
76
|
+
/**
|
|
77
|
+
* Native renderer or tool hints for hosts that can render richer UI.
|
|
78
|
+
*/
|
|
79
|
+
metadata?: Record<string, unknown>;
|
|
80
|
+
/**
|
|
81
|
+
* Structured display copy. Local pi dialogs format this for readability;
|
|
82
|
+
* remote hosts can adapt it into their own UI.
|
|
83
|
+
*/
|
|
84
|
+
display?: AskUserDisplay;
|
|
85
|
+
/** Optional ISO-8601 instant after which a host may auto-decline. */
|
|
86
|
+
expiresAt?: string;
|
|
87
|
+
}
|
|
88
|
+
export interface AskUserQuestionRequest {
|
|
89
|
+
/** The concise question shown to the user. */
|
|
90
|
+
question: string;
|
|
91
|
+
/** Optional short UI heading for hosts that render one. */
|
|
92
|
+
header?: string;
|
|
93
|
+
/** Optional answer suggestions. Hosts may also allow a custom answer. */
|
|
94
|
+
options?: readonly (string | AskUserOption)[];
|
|
95
|
+
/** Additional renderer or tool hints. */
|
|
96
|
+
metadata?: Record<string, unknown>;
|
|
97
|
+
/** Optional structured display copy. */
|
|
98
|
+
display?: AskUserDisplay;
|
|
99
|
+
/** Optional ISO-8601 instant after which a host may auto-decline. */
|
|
100
|
+
expiresAt?: string;
|
|
101
|
+
}
|
|
102
|
+
export interface AskUserApprovalRequest {
|
|
103
|
+
/** Short renderer kind, e.g. `plan_search`; defaults to `approval`. */
|
|
104
|
+
kind?: string;
|
|
105
|
+
/** Concise approval prompt. Defaults to `Approve <title>?` when possible. */
|
|
106
|
+
message?: string;
|
|
107
|
+
/** Approval card title for local and remote UI. */
|
|
108
|
+
title?: string;
|
|
109
|
+
/** Main approval card body. Plain text or markdown-style text. */
|
|
110
|
+
body?: string;
|
|
111
|
+
/** Optional grouped content for clients that render rows or sections. */
|
|
112
|
+
sections?: AskUserDisplay["sections"];
|
|
113
|
+
/** Additional renderer or tool hints. */
|
|
114
|
+
metadata?: Record<string, unknown>;
|
|
115
|
+
/** Optional ISO-8601 instant after which a host may auto-decline. */
|
|
116
|
+
expiresAt?: string;
|
|
117
|
+
}
|
|
118
|
+
/** Per-call plumbing from the owning tool's `execute()`. */
|
|
119
|
+
export interface AskUserOptions {
|
|
120
|
+
/** The executing tool call id (first `execute()` argument). */
|
|
121
|
+
toolCallId: string;
|
|
122
|
+
/** The extension context (last `execute()` argument). */
|
|
123
|
+
ctx: ExtensionContext;
|
|
124
|
+
/**
|
|
125
|
+
* The tool's own abort signal (third `execute()` argument) — NOT
|
|
126
|
+
* `ctx.signal`, which may already be undefined while the tool settles.
|
|
127
|
+
* Threaded into every dialog so an aborted turn dismisses them.
|
|
128
|
+
*/
|
|
129
|
+
signal: AbortSignal | undefined;
|
|
130
|
+
/**
|
|
131
|
+
* Optional custom interactive walk replacing the built-in dialogs (a pure
|
|
132
|
+
* TUI/RPC enhancement — the contract is unchanged). Return an outcome, or
|
|
133
|
+
* undefined to fall through to the built-in walk.
|
|
134
|
+
*/
|
|
135
|
+
interactive?: (ui: ExtensionUIContext, dialog: ExtensionUIDialogOptions) => Promise<AskUserOutcome | undefined>;
|
|
136
|
+
/** Dialog timeout override in milliseconds (defaults: TUI none, RPC 120s). */
|
|
137
|
+
timeoutMs?: number;
|
|
138
|
+
/** Environment override for tests. */
|
|
139
|
+
env?: NodeJS.ProcessEnv;
|
|
140
|
+
}
|
|
141
|
+
/** How the interaction settled. */
|
|
142
|
+
export type AskUserOutcome = {
|
|
143
|
+
type: "answered";
|
|
144
|
+
answer: string;
|
|
145
|
+
} | {
|
|
146
|
+
type: "approved";
|
|
147
|
+
feedback?: string;
|
|
148
|
+
} | {
|
|
149
|
+
type: "revision_requested";
|
|
150
|
+
feedback?: string;
|
|
151
|
+
} | {
|
|
152
|
+
type: "declined";
|
|
153
|
+
}
|
|
154
|
+
/** Interrupt emitted — the host pauses the run and rewrites this result. */
|
|
155
|
+
| {
|
|
156
|
+
type: "awaiting_user";
|
|
157
|
+
}
|
|
158
|
+
/** No interaction channel — the model should ask in plain chat. */
|
|
159
|
+
| {
|
|
160
|
+
type: "unavailable";
|
|
161
|
+
};
|
|
162
|
+
/** The Recipes interrupt request stored in Pi's arbitrary details field. */
|
|
163
|
+
export interface AskUserInterrupt {
|
|
164
|
+
reason: string;
|
|
165
|
+
message: string;
|
|
166
|
+
options?: AskUserOption[];
|
|
167
|
+
metadata?: Record<string, unknown>;
|
|
168
|
+
display?: AskUserDisplay;
|
|
169
|
+
expiresAt?: string;
|
|
170
|
+
outcome: AskUserOutcome;
|
|
171
|
+
}
|
|
172
|
+
/** Structured details attached to every askUser tool result. */
|
|
173
|
+
export interface AskUserDetails {
|
|
174
|
+
interrupt: AskUserInterrupt;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* A finished tool result: return it (or spread it) from the owning tool's
|
|
178
|
+
* `execute()`. The envelope text in `content` is what the model sees.
|
|
179
|
+
*/
|
|
180
|
+
export interface AskUserResult {
|
|
181
|
+
outcome: AskUserOutcome;
|
|
182
|
+
content: Array<{
|
|
183
|
+
type: "text";
|
|
184
|
+
text: string;
|
|
185
|
+
}>;
|
|
186
|
+
details: AskUserDetails;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Run `fn` with interaction requests resolved without prompting the user.
|
|
190
|
+
*
|
|
191
|
+
* Child sessions cannot own the root session's user interaction lifecycle.
|
|
192
|
+
* Approval requests are approved and questions are declined so the child can
|
|
193
|
+
* make progress without surfacing a UI dialog or an interrupt.
|
|
194
|
+
*/
|
|
195
|
+
export declare function autoResolveInteractions<T>(fn: () => Promise<T>): Promise<T>;
|
|
196
|
+
/** @deprecated Use `autoResolveInteractions()` for the explicit behavior. */
|
|
197
|
+
export declare function suppressInterruptResume<T>(fn: () => Promise<T>): Promise<T>;
|
|
198
|
+
/** Ask the user, resolving the best available interaction channel. */
|
|
199
|
+
export declare function askUser(request: AskUserRequest, opts: AskUserOptions): Promise<AskUserResult>;
|
|
200
|
+
/** Ask a blocking clarification question without hand-authoring interrupt details. */
|
|
201
|
+
export declare function askUserQuestion(request: AskUserQuestionRequest, opts: AskUserOptions): Promise<AskUserResult>;
|
|
202
|
+
/** Request approval without hand-authoring interrupt details or display data. */
|
|
203
|
+
export declare function askUserApproval(request: AskUserApprovalRequest, opts: AskUserOptions): Promise<AskUserResult>;
|
|
204
|
+
//# sourceMappingURL=interactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactions.d.ts","sourceRoot":"","sources":["../src/interactions.ts"],"names":[],"mappings":"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"}
|