@agent-native/core 0.58.2 → 0.58.4
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/agent/engine/translate-ai-sdk.d.ts.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.js +1 -0
- package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
- package/dist/agent/production-agent.d.ts +11 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +168 -11
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/tool-error-redaction.d.ts +4 -0
- package/dist/agent/tool-error-redaction.d.ts.map +1 -0
- package/dist/agent/tool-error-redaction.js +43 -0
- package/dist/agent/tool-error-redaction.js.map +1 -0
- package/dist/agent/types.d.ts +23 -6
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/plan-local.d.ts +34 -0
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +205 -1
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +1 -1
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +5 -0
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +19 -2
- package/dist/cli/recap.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +6 -3
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +5 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +141 -39
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +44 -31
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/blocks/library/diagram.d.ts.map +1 -1
- package/dist/client/blocks/library/diagram.js +85 -20
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/blocks/library/tabs.d.ts.map +1 -1
- package/dist/client/blocks/library/tabs.js +5 -5
- package/dist/client/blocks/library/tabs.js.map +1 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +13 -10
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +3 -3
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +0 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +5 -2
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/widgets/DataChartRenderer.d.ts.map +1 -1
- package/dist/client/chat/widgets/DataChartRenderer.js +98 -21
- package/dist/client/chat/widgets/DataChartRenderer.js.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts +4 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
- package/dist/client/chat/widgets/builtin-tool-renderers.js +30 -4
- package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
- package/dist/client/composer/AgentComposerFrame.js +1 -1
- package/dist/client/composer/AgentComposerFrame.js.map +1 -1
- package/dist/scripts/db/tool-schemas.d.ts +3 -0
- package/dist/scripts/db/tool-schemas.d.ts.map +1 -0
- package/dist/scripts/db/tool-schemas.js +27 -0
- package/dist/scripts/db/tool-schemas.js.map +1 -0
- package/dist/scripts/dev/index.d.ts.map +1 -1
- package/dist/scripts/dev/index.js +2 -22
- package/dist/scripts/dev/index.js.map +1 -1
- package/dist/scripts/parse-args.js +1 -1
- package/dist/scripts/parse-args.js.map +1 -1
- package/dist/scripts/runner.js +1 -1
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +17 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +8 -24
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/cli-capture.d.ts.map +1 -1
- package/dist/server/cli-capture.js +2 -1
- package/dist/server/cli-capture.js.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +25 -11
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/styles/agent-native.css +115 -2
- package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +100 -0
- package/docs/content/pr-visual-recap.md +2 -2
- package/package.json +2 -1
- package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +100 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-redaction.d.ts","sourceRoot":"","sources":["../../src/agent/tool-error-redaction.ts"],"names":[],"mappings":"AAQA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE7D;AAgBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAa3D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU7D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
const REDACTED = "[REDACTED]";
|
|
2
|
+
const SENSITIVE_FIELD_PATTERN = /^(authorization|cookie|api[_-]?key|password|secret|token|access[_-]?token|refresh[_-]?token|bearer)$/i;
|
|
3
|
+
const OPENAI_LIKE_SECRET_PATTERN = /(^|[^A-Za-z0-9_-])(sk-(?:proj-|svcacct-)?[A-Za-z0-9_-]{24,})(?=$|[^A-Za-z0-9_-])/g;
|
|
4
|
+
export function redactSensitiveFields(value) {
|
|
5
|
+
return redactWalk(value, new WeakSet());
|
|
6
|
+
}
|
|
7
|
+
function redactWalk(value, seen) {
|
|
8
|
+
if (value === null || typeof value !== "object")
|
|
9
|
+
return value;
|
|
10
|
+
if (seen.has(value))
|
|
11
|
+
return "[Circular]";
|
|
12
|
+
seen.add(value);
|
|
13
|
+
if (Array.isArray(value))
|
|
14
|
+
return value.map((v) => redactWalk(v, seen));
|
|
15
|
+
const out = {};
|
|
16
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
17
|
+
out[key] = SENSITIVE_FIELD_PATTERN.test(key)
|
|
18
|
+
? REDACTED
|
|
19
|
+
: redactWalk(entry, seen);
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
export function sanitizeToolErrorText(value) {
|
|
24
|
+
let out = value;
|
|
25
|
+
out = out.replace(/\bBearer\s+[^,\s;)}\]]+/gi, `Bearer ${REDACTED}`);
|
|
26
|
+
out = out.replace(OPENAI_LIKE_SECRET_PATTERN, `$1${REDACTED}`);
|
|
27
|
+
out = out.replace(/([?&](?:authorization|cookie|api[_-]?key|password|secret|token|access[_-]?token|refresh[_-]?token|bearer)=)[^&#\s]+/gi, `$1${REDACTED}`);
|
|
28
|
+
out = out.replace(/((?:^|[^A-Za-z0-9_-])(?:"|')?(?:authorization|cookie|api[_-]?key|password|secret|token|access[_-]?token|refresh[_-]?token|bearer)(?:"|')?\s*[:=]\s*)(?:"[^"]*"|'[^']*'|[^,\s;)}\]]+)/gi, (_match, prefix) => `${prefix}${REDACTED}`);
|
|
29
|
+
return out;
|
|
30
|
+
}
|
|
31
|
+
export function sanitizeToolErrorValue(value) {
|
|
32
|
+
if (value instanceof Error)
|
|
33
|
+
return sanitizeToolErrorText(value.message);
|
|
34
|
+
if (typeof value === "string")
|
|
35
|
+
return sanitizeToolErrorText(value);
|
|
36
|
+
try {
|
|
37
|
+
return sanitizeToolErrorText(JSON.stringify(redactSensitiveFields(value), null, 2));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return sanitizeToolErrorText(String(value));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=tool-error-redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error-redaction.js","sourceRoot":"","sources":["../../src/agent/tool-error-redaction.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,MAAM,uBAAuB,GAC3B,uGAAuG,CAAC;AAE1G,MAAM,0BAA0B,GAC9B,mFAAmF,CAAC;AAEtF,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,OAAO,EAAU,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,IAAqB;IACvD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC;QAAE,OAAO,YAAY,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,KAAe,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,GAAG,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC;YAC1C,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,2BAA2B,EAAE,UAAU,QAAQ,EAAE,CAAC,CAAC;IACrE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAE,KAAK,QAAQ,EAAE,CAAC,CAAC;IAC/D,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,uHAAuH,EACvH,KAAK,QAAQ,EAAE,CAChB,CAAC;IACF,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,wLAAwL,EACxL,CAAC,MAAM,EAAE,MAAc,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE,CACnD,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACnE,IAAI,CAAC;QACH,OAAO,qBAAqB,CAC1B,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CACtD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC","sourcesContent":["const REDACTED = \"[REDACTED]\";\n\nconst SENSITIVE_FIELD_PATTERN =\n /^(authorization|cookie|api[_-]?key|password|secret|token|access[_-]?token|refresh[_-]?token|bearer)$/i;\n\nconst OPENAI_LIKE_SECRET_PATTERN =\n /(^|[^A-Za-z0-9_-])(sk-(?:proj-|svcacct-)?[A-Za-z0-9_-]{24,})(?=$|[^A-Za-z0-9_-])/g;\n\nexport function redactSensitiveFields(value: unknown): unknown {\n return redactWalk(value, new WeakSet<object>());\n}\n\nfunction redactWalk(value: unknown, seen: WeakSet<object>): unknown {\n if (value === null || typeof value !== \"object\") return value;\n if (seen.has(value as object)) return \"[Circular]\";\n seen.add(value as object);\n if (Array.isArray(value)) return value.map((v) => redactWalk(v, seen));\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n out[key] = SENSITIVE_FIELD_PATTERN.test(key)\n ? REDACTED\n : redactWalk(entry, seen);\n }\n return out;\n}\n\nexport function sanitizeToolErrorText(value: string): string {\n let out = value;\n out = out.replace(/\\bBearer\\s+[^,\\s;)}\\]]+/gi, `Bearer ${REDACTED}`);\n out = out.replace(OPENAI_LIKE_SECRET_PATTERN, `$1${REDACTED}`);\n out = out.replace(\n /([?&](?:authorization|cookie|api[_-]?key|password|secret|token|access[_-]?token|refresh[_-]?token|bearer)=)[^&#\\s]+/gi,\n `$1${REDACTED}`,\n );\n out = out.replace(\n /((?:^|[^A-Za-z0-9_-])(?:\"|')?(?:authorization|cookie|api[_-]?key|password|secret|token|access[_-]?token|refresh[_-]?token|bearer)(?:\"|')?\\s*[:=]\\s*)(?:\"[^\"]*\"|'[^']*'|[^,\\s;)}\\]]+)/gi,\n (_match, prefix: string) => `${prefix}${REDACTED}`,\n );\n return out;\n}\n\nexport function sanitizeToolErrorValue(value: unknown): string {\n if (value instanceof Error) return sanitizeToolErrorText(value.message);\n if (typeof value === \"string\") return sanitizeToolErrorText(value);\n try {\n return sanitizeToolErrorText(\n JSON.stringify(redactSensitiveFields(value), null, 2),\n );\n } catch {\n return sanitizeToolErrorText(String(value));\n }\n}\n"]}
|
package/dist/agent/types.d.ts
CHANGED
|
@@ -1,15 +1,32 @@
|
|
|
1
1
|
import type { ReasoningEffort } from "../shared/reasoning-effort.js";
|
|
2
2
|
import type { AgentMcpAppPayload } from "../mcp-client/app-result.js";
|
|
3
3
|
import type { ActionChatUIConfig } from "../action-ui.js";
|
|
4
|
+
export interface AgentNativeJsonSchema {
|
|
5
|
+
type?: string | string[];
|
|
6
|
+
description?: string;
|
|
7
|
+
enum?: unknown[];
|
|
8
|
+
const?: unknown;
|
|
9
|
+
properties?: Record<string, AgentNativeJsonSchema>;
|
|
10
|
+
required?: string[];
|
|
11
|
+
additionalProperties?: boolean | AgentNativeJsonSchema;
|
|
12
|
+
items?: AgentNativeJsonSchema;
|
|
13
|
+
oneOf?: AgentNativeJsonSchema[];
|
|
14
|
+
anyOf?: AgentNativeJsonSchema[];
|
|
15
|
+
allOf?: AgentNativeJsonSchema[];
|
|
16
|
+
not?: AgentNativeJsonSchema;
|
|
17
|
+
minLength?: number;
|
|
18
|
+
maxLength?: number;
|
|
19
|
+
pattern?: string;
|
|
20
|
+
minimum?: number;
|
|
21
|
+
maximum?: number;
|
|
22
|
+
minItems?: number;
|
|
23
|
+
maxItems?: number;
|
|
24
|
+
}
|
|
4
25
|
export interface ActionTool {
|
|
5
26
|
description: string;
|
|
6
|
-
parameters?: {
|
|
27
|
+
parameters?: AgentNativeJsonSchema & {
|
|
7
28
|
type: "object";
|
|
8
|
-
properties: Record<string,
|
|
9
|
-
type: string;
|
|
10
|
-
description?: string;
|
|
11
|
-
enum?: string[];
|
|
12
|
-
}>;
|
|
29
|
+
properties: Record<string, AgentNativeJsonSchema>;
|
|
13
30
|
required?: string[];
|
|
14
31
|
};
|
|
15
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport type { AgentMcpAppPayload } from \"../mcp-client/app-result.js\";\nimport type { ActionChatUIConfig } from \"../action-ui.js\";\n\nexport interface
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ReasoningEffort } from \"../shared/reasoning-effort.js\";\nimport type { AgentMcpAppPayload } from \"../mcp-client/app-result.js\";\nimport type { ActionChatUIConfig } from \"../action-ui.js\";\n\nexport interface AgentNativeJsonSchema {\n type?: string | string[];\n description?: string;\n enum?: unknown[];\n const?: unknown;\n properties?: Record<string, AgentNativeJsonSchema>;\n required?: string[];\n additionalProperties?: boolean | AgentNativeJsonSchema;\n items?: AgentNativeJsonSchema;\n oneOf?: AgentNativeJsonSchema[];\n anyOf?: AgentNativeJsonSchema[];\n allOf?: AgentNativeJsonSchema[];\n not?: AgentNativeJsonSchema;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n minimum?: number;\n maximum?: number;\n minItems?: number;\n maxItems?: number;\n}\n\nexport interface ActionTool {\n description: string;\n parameters?: AgentNativeJsonSchema & {\n type: \"object\";\n properties: Record<string, AgentNativeJsonSchema>;\n required?: string[];\n };\n}\n\n/** @deprecated Use `ActionTool` instead */\nexport type ScriptTool = ActionTool;\n\nexport interface AgentMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport type AgentChatStructuredContentPart =\n | { type: \"text\"; text: string }\n | {\n type: \"tool-call\";\n id?: string;\n toolCallId?: string;\n name?: string;\n toolName?: string;\n input?: unknown;\n args?: unknown;\n }\n | {\n type: \"tool-result\";\n toolCallId: string;\n /** Persisted for replay; omitted in older rows is backfilled server-side. */\n toolName?: string;\n toolInput?: string;\n content: string;\n isError?: boolean;\n };\n\nexport interface AgentChatStructuredMessage {\n role: \"user\" | \"assistant\";\n content: AgentChatStructuredContentPart[];\n}\n\nexport interface AgentChatReference {\n type: \"file\" | \"skill\" | \"mention\" | \"agent\" | \"custom-agent\";\n path: string;\n name: string;\n source: string;\n refType?: string;\n refId?: string;\n}\n\nexport interface MentionProviderItem {\n id: string;\n label: string;\n description?: string;\n icon?: string;\n refType: string;\n refId?: string;\n refPath?: string;\n}\n\nexport interface MentionProvider {\n label: string;\n icon?: string;\n search: (\n query: string,\n /** The H3 event for the current request — use to make internal API calls */\n event?: any,\n ) => MentionProviderItem[] | Promise<MentionProviderItem[]>;\n}\n\nexport interface AgentChatAttachment {\n type: string;\n name: string;\n data?: string;\n contentType?: string;\n text?: string;\n}\n\nexport interface AgentChatScope {\n type: string;\n id: string;\n label?: string;\n}\n\nexport interface AgentChatRequest {\n message: string;\n /**\n * User-visible text to persist in chat history. `message` may be normalized\n * for the model (for example mention markup or internal continuation text).\n */\n displayMessage?: string;\n history?: AgentMessage[];\n /**\n * Provider-neutral transcript used for run recovery. Unlike `history`,\n * this preserves assistant tool calls and matching tool results so\n * continuation turns do not re-run completed read-only tools.\n */\n structuredHistory?: AgentChatStructuredMessage[];\n references?: AgentChatReference[];\n threadId?: string;\n attachments?: AgentChatAttachment[];\n /** Internal retry/continuation requests should not create visible user turns. */\n internalContinuation?: boolean;\n /**\n * Stable identity for the logical assistant turn this request belongs to.\n * The client sends the SAME turnId for the initial POST and every\n * auto-continuation re-POST of one turn, so the server can fold each\n * continuation run's output onto a single durable assistant message instead\n * of dropping the earlier chunks. Defaults to the run id when absent.\n */\n turnId?: string;\n /** Execution mode for this turn. Plan mode is read-only and proposes before acting. */\n mode?: \"act\" | \"plan\";\n /** Per-request model override (ephemeral, from the composer model picker). */\n model?: string;\n /** Per-request engine override (sent alongside model for cross-provider switches). */\n engine?: string;\n /** Per-request reasoning effort override (ephemeral, from the composer picker). */\n effort?: ReasoningEffort;\n /** Usage-tracking label for this call (e.g. \"chat\", \"summarize\"). Default: \"chat\". */\n usageLabel?: string;\n /** Stable browser tab id so screen/url context and navigation commands are tab-scoped. */\n browserTabId?: string;\n /** Resource scope for this chat thread, e.g. the deck currently bound to the tab. */\n scope?: AgentChatScope | null;\n /** When true, expose this chat turn as a user-visible run in RunsTray. */\n trackInRunsTray?: boolean;\n /**\n * Approval grants for human-in-the-loop actions. Each entry is a stable\n * approval key (see the `approval_required` event's `approvalKey`). When the\n * agent calls an action declared `needsApproval`, the loop pauses and emits\n * `approval_required`; the client re-issues the turn (typically an empty\n * continuation) with the approved call's key here so the gate lets it run.\n * Keys not present here keep the action paused. The model never sees or sets\n * this — it is supplied by the human's approve affordance.\n */\n approvedToolCalls?: string[];\n}\n\nexport type AgentChatEvent =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; text: string }\n | { type: \"activity\"; label: string; tool?: string }\n | { type: \"tool_start\"; tool: string; input: Record<string, string> }\n | {\n type: \"tool_done\";\n tool: string;\n result: string;\n mcpApp?: AgentMcpAppPayload;\n chatUI?: ActionChatUIConfig;\n }\n | {\n /**\n * The agent tried to call an action declared `needsApproval` and the loop\n * paused instead of executing it. The client should surface an\n * approve/deny affordance; on approve, re-issue the turn with\n * `approvedToolCalls: [approvalKey]` so the gate lets this call run.\n */\n type: \"approval_required\";\n tool: string;\n input: Record<string, string>;\n /** Stable key the client echoes back in `approvedToolCalls` to approve. */\n approvalKey: string;\n /** The model-side tool-call id for this paused call, when available. */\n toolCallId?: string;\n }\n | {\n type: \"agent_call\";\n agent: string;\n status: \"start\" | \"done\" | \"error\";\n }\n | { type: \"agent_call_text\"; agent: string; text: string }\n | {\n type: \"agent_task\";\n taskId: string;\n threadId: string;\n description: string;\n status: \"running\" | \"completed\" | \"errored\";\n }\n | {\n type: \"agent_task_update\";\n taskId: string;\n preview: string;\n currentStep?: string;\n }\n | {\n type: \"agent_task_complete\";\n taskId: string;\n summary: string;\n }\n | { type: \"done\" }\n | {\n type: \"error\";\n error: string;\n /**\n * Optional machine-readable error code. Builder gateway uses codes\n * like \"credits-limit-monthly\" / \"unauthorized\" / \"gateway_not_enabled\"\n * so the chat UI can render a structured CTA (e.g. upgrade button).\n */\n errorCode?: string;\n /** Optional link paired with errorCode — e.g. Builder billing page. */\n upgradeUrl?: string;\n /** Optional details for expandable UI/debugging. */\n details?: string;\n /** True when the user can reasonably continue/retry from partial work. */\n recoverable?: boolean;\n }\n /**\n * Legacy SSE terminal event. New streams emit\n * `{ type: \"error\", errorCode: \"missing_credentials\" }` instead.\n */\n | { type: \"missing_api_key\" }\n | { type: \"loop_limit\"; maxIterations?: number }\n | {\n /**\n * An in-loop `Processor` aborted the run via `abort()` (which throws a\n * `TripWire`). The loop catches it, emits this event, stops cleanly, and\n * surfaces the reason as a final assistant message. Structural hook for\n * real-time guardrails and a proof-of-done / coverage gate.\n */\n type: \"tripwire\";\n reason: string;\n /** Name of the processor that aborted, when it declared one. */\n processor?: string;\n }\n | {\n type: \"auto_continue\";\n reason:\n | \"run_timeout\"\n | \"loop_limit\"\n | \"no_progress\"\n | \"stream_ended\"\n | \"gateway_timeout\"\n | \"network_interrupted\";\n maxIterations?: number;\n }\n | { type: \"clear\" };\n\nexport interface RunEvent {\n seq: number;\n event: AgentChatEvent;\n}\n\nexport type RunStatus = \"running\" | \"completed\" | \"errored\" | \"aborted\";\n"]}
|
package/dist/cli/plan-local.d.ts
CHANGED
|
@@ -49,6 +49,34 @@ type LocalPlanBridgeMdxFolder = {
|
|
|
49
49
|
".plan-state.json"?: string;
|
|
50
50
|
"assets/"?: Record<string, string>;
|
|
51
51
|
};
|
|
52
|
+
type VisualAnswerSourcePayload = {
|
|
53
|
+
question?: string;
|
|
54
|
+
title?: string;
|
|
55
|
+
brief?: string;
|
|
56
|
+
repoPath?: string;
|
|
57
|
+
sourceUrl?: string;
|
|
58
|
+
sourceType?: string;
|
|
59
|
+
mdx: {
|
|
60
|
+
"plan.mdx": string;
|
|
61
|
+
"canvas.mdx"?: string;
|
|
62
|
+
"prototype.mdx"?: string;
|
|
63
|
+
"assets/"?: Record<string, string>;
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
export type PublishVisualAnswerInput = {
|
|
67
|
+
appUrl: string;
|
|
68
|
+
token: string;
|
|
69
|
+
question?: string;
|
|
70
|
+
sourcePath?: string;
|
|
71
|
+
out?: string;
|
|
72
|
+
prevPlanId?: string;
|
|
73
|
+
repo?: string;
|
|
74
|
+
sourceUrl?: string;
|
|
75
|
+
sourceType?: string;
|
|
76
|
+
visibility?: "private" | "org" | "public";
|
|
77
|
+
fetchFn?: typeof fetch;
|
|
78
|
+
cwd?: string;
|
|
79
|
+
};
|
|
52
80
|
export type LocalPlanBridgePayload = {
|
|
53
81
|
ok: true;
|
|
54
82
|
version: 1;
|
|
@@ -154,6 +182,12 @@ export declare function verifyLocalPlanBridge(input: {
|
|
|
154
182
|
urlFile?: string | false;
|
|
155
183
|
fetchFn?: typeof fetch;
|
|
156
184
|
}): Promise<LocalPlanVerifyResult>;
|
|
185
|
+
export declare function readVisualAnswerSourcePayload(sourcePath: string): VisualAnswerSourcePayload;
|
|
186
|
+
export declare function publishVisualAnswerSource(input: PublishVisualAnswerInput): Promise<{
|
|
187
|
+
ok: true;
|
|
188
|
+
url: string;
|
|
189
|
+
out: string;
|
|
190
|
+
}>;
|
|
157
191
|
export declare function runPlan(argv: string[]): Promise<void>;
|
|
158
192
|
export {};
|
|
159
193
|
//# sourceMappingURL=plan-local.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-local.d.ts","sourceRoot":"","sources":["../../src/cli/plan-local.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAa,EAEX,KAAK,MAAM,EAEZ,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"plan-local.d.ts","sourceRoot":"","sources":["../../src/cli/plan-local.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/plan-local.js
CHANGED
|
@@ -14,10 +14,13 @@ import http from "node:http";
|
|
|
14
14
|
import path from "node:path";
|
|
15
15
|
import { spawnSync } from "node:child_process";
|
|
16
16
|
import { pathToFileURL } from "node:url";
|
|
17
|
-
import { DEFAULT_PLAN_APP_URL, defaultPlanBlocksOut, fetchPlanBlockCatalog, normalizePlanBlockFormat, } from "./plan-blocks.js";
|
|
17
|
+
import { DEFAULT_PLAN_APP_URL, defaultPlanBlocksOut, fetchPlanBlockCatalog, normalizePlanBlockFormat, planActionEndpoint, } from "./plan-blocks.js";
|
|
18
18
|
const LOCAL_PLAN_ASSET_MAX_SINGLE_BYTES = 2 * 1024 * 1024;
|
|
19
19
|
const LOCAL_PLAN_ASSET_MAX_TOTAL_BYTES = 10 * 1024 * 1024;
|
|
20
20
|
const AGENT_NATIVE_MANIFEST_FILE = "agent-native.json";
|
|
21
|
+
const VISUAL_ANSWER_SOURCE_FILENAME = "visual-answer-source.json";
|
|
22
|
+
const VISUAL_ANSWER_URL_FILENAME = "visual-answer-url.txt";
|
|
23
|
+
const PLAN_ACTION_HTTP_TIMEOUT_MS = 45_000;
|
|
21
24
|
const LOCAL_PLAN_ASSET_EXTENSIONS = new Set([
|
|
22
25
|
"png",
|
|
23
26
|
"jpg",
|
|
@@ -57,6 +60,69 @@ function optionalArg(args, key) {
|
|
|
57
60
|
function boolArg(args, key) {
|
|
58
61
|
return args[key] === true;
|
|
59
62
|
}
|
|
63
|
+
function sanitizeHttpDetail(value, maxLength) {
|
|
64
|
+
const normalized = value.replace(/\s+/g, " ").trim();
|
|
65
|
+
if (normalized.length <= maxLength)
|
|
66
|
+
return normalized;
|
|
67
|
+
return `${normalized.slice(0, maxLength - 3)}...`;
|
|
68
|
+
}
|
|
69
|
+
function normalizeVisibility(value) {
|
|
70
|
+
if (!value)
|
|
71
|
+
return undefined;
|
|
72
|
+
if (value === "private" || value === "org" || value === "public") {
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
throw new Error(`Invalid --visibility "${value}" (expected private, org, or public)`);
|
|
76
|
+
}
|
|
77
|
+
function normalizeVisualAnswerSourceType(value) {
|
|
78
|
+
if (!value)
|
|
79
|
+
return "code";
|
|
80
|
+
if ([
|
|
81
|
+
"code",
|
|
82
|
+
"pull-request",
|
|
83
|
+
"commit",
|
|
84
|
+
"branch",
|
|
85
|
+
"diff",
|
|
86
|
+
"issue",
|
|
87
|
+
"page",
|
|
88
|
+
].includes(value)) {
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`Invalid --source-type "${value}" (expected code, pull-request, commit, branch, diff, issue, or page)`);
|
|
92
|
+
}
|
|
93
|
+
function visualAnswerUrlFromPublishResult(result, appUrl) {
|
|
94
|
+
const base = appUrl.replace(/\/$/, "");
|
|
95
|
+
if (!result || typeof result !== "object")
|
|
96
|
+
return null;
|
|
97
|
+
const record = result;
|
|
98
|
+
const rawUrl = typeof record.url === "string"
|
|
99
|
+
? record.url
|
|
100
|
+
: record.path && typeof record.path === "string"
|
|
101
|
+
? record.path
|
|
102
|
+
: null;
|
|
103
|
+
if (rawUrl) {
|
|
104
|
+
try {
|
|
105
|
+
return new URL(rawUrl, `${base}/`).toString();
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const planId = typeof record.planId === "string"
|
|
112
|
+
? record.planId
|
|
113
|
+
: record.plan &&
|
|
114
|
+
typeof record.plan === "object" &&
|
|
115
|
+
typeof record.plan.id === "string"
|
|
116
|
+
? record.plan.id
|
|
117
|
+
: null;
|
|
118
|
+
return planId ? `${base}/plans/${encodeURIComponent(planId)}` : null;
|
|
119
|
+
}
|
|
120
|
+
async function fetchActionWithTimeout(url, init, fetchFn) {
|
|
121
|
+
return await fetchFn(url, {
|
|
122
|
+
...init,
|
|
123
|
+
signal: init.signal ?? AbortSignal.timeout(PLAN_ACTION_HTTP_TIMEOUT_MS),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
60
126
|
export function localPlanFolderName(title) {
|
|
61
127
|
const slug = title
|
|
62
128
|
.normalize("NFKD")
|
|
@@ -1510,6 +1576,132 @@ function runCheck(args) {
|
|
|
1510
1576
|
};
|
|
1511
1577
|
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
1512
1578
|
}
|
|
1579
|
+
export function readVisualAnswerSourcePayload(sourcePath) {
|
|
1580
|
+
let parsed;
|
|
1581
|
+
try {
|
|
1582
|
+
parsed = JSON.parse(fs.readFileSync(sourcePath, "utf-8"));
|
|
1583
|
+
}
|
|
1584
|
+
catch (error) {
|
|
1585
|
+
throw new Error(`Could not read ${sourcePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
1586
|
+
}
|
|
1587
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
1588
|
+
throw new Error(`${sourcePath} must contain a JSON object.`);
|
|
1589
|
+
}
|
|
1590
|
+
const source = parsed;
|
|
1591
|
+
const mdx = source.mdx;
|
|
1592
|
+
if (!mdx || typeof mdx !== "object" || Array.isArray(mdx)) {
|
|
1593
|
+
throw new Error(`${sourcePath} must contain an mdx object.`);
|
|
1594
|
+
}
|
|
1595
|
+
const planMdx = mdx["plan.mdx"];
|
|
1596
|
+
if (typeof planMdx !== "string" || planMdx.trim().length === 0) {
|
|
1597
|
+
throw new Error(`${sourcePath} mdx["plan.mdx"] must be a non-empty string.`);
|
|
1598
|
+
}
|
|
1599
|
+
return source;
|
|
1600
|
+
}
|
|
1601
|
+
export async function publishVisualAnswerSource(input) {
|
|
1602
|
+
const cwd = input.cwd ?? process.cwd();
|
|
1603
|
+
const sourcePath = input.sourcePath ?? path.join(cwd, VISUAL_ANSWER_SOURCE_FILENAME);
|
|
1604
|
+
const out = input.out ?? path.join(cwd, VISUAL_ANSWER_URL_FILENAME);
|
|
1605
|
+
const token = input.token.trim();
|
|
1606
|
+
if (!token)
|
|
1607
|
+
throw new Error("Plan publish token is empty.");
|
|
1608
|
+
const source = readVisualAnswerSourcePayload(sourcePath);
|
|
1609
|
+
const question = input.question ?? source.question;
|
|
1610
|
+
if (!question?.trim()) {
|
|
1611
|
+
throw new Error(`Missing visual answer question. Pass --question or set question in ${sourcePath}.`);
|
|
1612
|
+
}
|
|
1613
|
+
const body = {
|
|
1614
|
+
question,
|
|
1615
|
+
...(input.prevPlanId ? { planId: input.prevPlanId } : {}),
|
|
1616
|
+
...(source.title ? { title: source.title } : {}),
|
|
1617
|
+
...(source.brief ? { brief: source.brief } : {}),
|
|
1618
|
+
visibility: input.visibility ?? "org",
|
|
1619
|
+
source: "imported",
|
|
1620
|
+
...((input.repo ?? source.repoPath)
|
|
1621
|
+
? { repoPath: input.repo ?? source.repoPath }
|
|
1622
|
+
: {}),
|
|
1623
|
+
...((input.sourceUrl ?? source.sourceUrl)
|
|
1624
|
+
? { sourceUrl: input.sourceUrl ?? source.sourceUrl }
|
|
1625
|
+
: {}),
|
|
1626
|
+
sourceType: normalizeVisualAnswerSourceType(input.sourceType ?? source.sourceType),
|
|
1627
|
+
currentFocus: `visual answer: ${question.trim().slice(0, 120)}`,
|
|
1628
|
+
status: "review",
|
|
1629
|
+
mdx: source.mdx,
|
|
1630
|
+
};
|
|
1631
|
+
const endpoint = planActionEndpoint(input.appUrl, "visual-answer");
|
|
1632
|
+
const fetchFn = input.fetchFn ?? fetch;
|
|
1633
|
+
const response = await fetchActionWithTimeout(endpoint, {
|
|
1634
|
+
method: "POST",
|
|
1635
|
+
headers: {
|
|
1636
|
+
accept: "application/json",
|
|
1637
|
+
"content-type": "application/json",
|
|
1638
|
+
authorization: `Bearer ${token}`,
|
|
1639
|
+
},
|
|
1640
|
+
body: JSON.stringify(body),
|
|
1641
|
+
}, fetchFn);
|
|
1642
|
+
const text = await response.text().catch((error) => String(error));
|
|
1643
|
+
if (!response.ok) {
|
|
1644
|
+
throw new Error(`visual-answer failed ${response.status} ${response.statusText}: ${sanitizeHttpDetail(text, 800)}`);
|
|
1645
|
+
}
|
|
1646
|
+
let result = null;
|
|
1647
|
+
try {
|
|
1648
|
+
result = text ? JSON.parse(text) : null;
|
|
1649
|
+
}
|
|
1650
|
+
catch {
|
|
1651
|
+
throw new Error("visual-answer returned non-JSON output.");
|
|
1652
|
+
}
|
|
1653
|
+
const url = visualAnswerUrlFromPublishResult(result, input.appUrl);
|
|
1654
|
+
if (!url) {
|
|
1655
|
+
throw new Error("visual-answer succeeded but did not return a usable /plans/<id> URL or plan id.");
|
|
1656
|
+
}
|
|
1657
|
+
fs.writeFileSync(path.resolve(out), `${url}\n`, "utf-8");
|
|
1658
|
+
return { ok: true, url, out };
|
|
1659
|
+
}
|
|
1660
|
+
async function runVisualAnswer(subcommand, args) {
|
|
1661
|
+
if (subcommand === undefined ||
|
|
1662
|
+
subcommand === "help" ||
|
|
1663
|
+
subcommand === "--help" ||
|
|
1664
|
+
subcommand === "-h" ||
|
|
1665
|
+
args.help === true ||
|
|
1666
|
+
args.h === true) {
|
|
1667
|
+
process.stdout.write(HELP);
|
|
1668
|
+
return;
|
|
1669
|
+
}
|
|
1670
|
+
if (subcommand !== "publish") {
|
|
1671
|
+
process.stderr.write(`Unknown plan visual-answer subcommand: ${subcommand}\n${HELP}`);
|
|
1672
|
+
process.exit(1);
|
|
1673
|
+
}
|
|
1674
|
+
const appUrl = optionalArg(args, "app-url") ||
|
|
1675
|
+
process.env.PLAN_VISUAL_ANSWER_APP_URL ||
|
|
1676
|
+
process.env.PLAN_RECAP_APP_URL ||
|
|
1677
|
+
DEFAULT_PLAN_APP_URL;
|
|
1678
|
+
const token = optionalArg(args, "token") ||
|
|
1679
|
+
process.env.PLAN_VISUAL_ANSWER_TOKEN ||
|
|
1680
|
+
process.env.PLAN_RECAP_TOKEN ||
|
|
1681
|
+
"";
|
|
1682
|
+
try {
|
|
1683
|
+
const result = await publishVisualAnswerSource({
|
|
1684
|
+
appUrl,
|
|
1685
|
+
token,
|
|
1686
|
+
question: optionalArg(args, "question"),
|
|
1687
|
+
sourcePath: optionalArg(args, "source") ?? VISUAL_ANSWER_SOURCE_FILENAME,
|
|
1688
|
+
out: optionalArg(args, "out") ?? VISUAL_ANSWER_URL_FILENAME,
|
|
1689
|
+
prevPlanId: optionalArg(args, "prev-plan-id"),
|
|
1690
|
+
repo: optionalArg(args, "repo"),
|
|
1691
|
+
sourceUrl: optionalArg(args, "source-url"),
|
|
1692
|
+
sourceType: optionalArg(args, "source-type"),
|
|
1693
|
+
visibility: normalizeVisibility(optionalArg(args, "visibility")),
|
|
1694
|
+
});
|
|
1695
|
+
process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
|
|
1696
|
+
}
|
|
1697
|
+
catch (error) {
|
|
1698
|
+
process.stdout.write(`${JSON.stringify({
|
|
1699
|
+
ok: false,
|
|
1700
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
1701
|
+
}, null, 2)}\n`);
|
|
1702
|
+
process.exit(1);
|
|
1703
|
+
}
|
|
1704
|
+
}
|
|
1513
1705
|
function runPreview(args) {
|
|
1514
1706
|
const result = writeLocalPlanPreview({
|
|
1515
1707
|
dir: stringArg(args, "dir"),
|
|
@@ -1646,6 +1838,7 @@ const HELP = `agent-native plan — local Agent-Native Plan helpers
|
|
|
1646
1838
|
|
|
1647
1839
|
Usage:
|
|
1648
1840
|
agent-native plan blocks [--format reference|schema] [--app-url <url>] [--out <file>] [--json]
|
|
1841
|
+
agent-native plan visual-answer publish --question <text> [--source visual-answer-source.json] [--out visual-answer-url.txt] [--repo owner/name] [--source-url <url>] [--app-url <url>] [--token <planToken>]
|
|
1649
1842
|
agent-native plan serve --dir <folder> [--app-url <url>] [--kind plan|recap] [--open] [--port <port>] [--url-file <file>]
|
|
1650
1843
|
agent-native plan local init --title <title> [--brief <text>] [--kind plan|recap] [--dir <folder>] [--force]
|
|
1651
1844
|
agent-native plan local check --dir <folder>
|
|
@@ -1659,6 +1852,13 @@ plan content and is safe for local-files authoring before writing MDX. It uses a
|
|
|
1659
1852
|
clack UI in interactive terminals and prints JSON for non-interactive shells or
|
|
1660
1853
|
when --json is passed.
|
|
1661
1854
|
|
|
1855
|
+
The visual-answer publish command sends a coding-agent-authored
|
|
1856
|
+
visual-answer-source.json file to the Plan app's visual-answer action and writes
|
|
1857
|
+
visual-answer-url.txt. The source file should contain a question, optional
|
|
1858
|
+
title/brief/repoPath/sourceUrl, and MDX files under mdx. It is the terminal
|
|
1859
|
+
handoff for /visual-answer workflows after a coding agent has inspected code via
|
|
1860
|
+
the local repo, the Plan bridge, or GitHub and authored structured Plan blocks.
|
|
1861
|
+
|
|
1662
1862
|
The local subcommands are the privacy-focused no-DB path. They only read and
|
|
1663
1863
|
write local files: plan.mdx, optional canvas.mdx, optional prototype.mdx, and
|
|
1664
1864
|
optional .plan-state.json. They do not call the Plan MCP server, the Plan app
|
|
@@ -1695,6 +1895,10 @@ export async function runPlan(argv) {
|
|
|
1695
1895
|
await runServe(args);
|
|
1696
1896
|
return;
|
|
1697
1897
|
}
|
|
1898
|
+
if (area === "visual-answer") {
|
|
1899
|
+
await runVisualAnswer(sub, parseArgs(rest));
|
|
1900
|
+
return;
|
|
1901
|
+
}
|
|
1698
1902
|
if (area !== "local") {
|
|
1699
1903
|
// Bare `agent-native plan` / `plan help` / `plan --help` → show help on
|
|
1700
1904
|
// stdout and exit 0 (informational, not an error).
|