@agent-native/core 0.59.0 → 0.60.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/dist/a2a/index.d.ts +2 -0
- package/dist/a2a/index.d.ts.map +1 -1
- package/dist/a2a/index.js +1 -0
- package/dist/a2a/index.js.map +1 -1
- package/dist/a2a/invoke.d.ts +63 -0
- package/dist/a2a/invoke.d.ts.map +1 -0
- package/dist/a2a/invoke.js +157 -0
- package/dist/a2a/invoke.js.map +1 -0
- package/dist/agent/run-store.d.ts +15 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +28 -0
- package/dist/agent/run-store.js.map +1 -1
- package/dist/chat-threads/store.d.ts +21 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +128 -0
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/agent.d.ts +23 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +300 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/agents.d.ts +14 -0
- package/dist/cli/agents.d.ts.map +1 -0
- package/dist/cli/agents.js +95 -0
- package/dist/cli/agents.js.map +1 -0
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js +264 -2
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/create.d.ts +3 -2
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +154 -83
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +50 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/invoke.d.ts +26 -0
- package/dist/cli/invoke.d.ts.map +1 -0
- package/dist/cli/invoke.js +227 -0
- package/dist/cli/invoke.js.map +1 -0
- package/dist/cli/templates-meta.d.ts +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +9 -8
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspacify.d.ts +1 -1
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +6 -6
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +8 -2
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +5 -4
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +65 -12
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/blocks/library/diagram.d.ts.map +1 -1
- package/dist/client/blocks/library/diagram.js +23 -17
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/blocks/types.d.ts +2 -0
- package/dist/client/blocks/types.d.ts.map +1 -1
- package/dist/client/blocks/types.js.map +1 -1
- package/dist/client/chat/index.d.ts +1 -1
- package/dist/client/chat/index.d.ts.map +1 -1
- package/dist/client/chat/index.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +1 -1
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/notifications/NotificationsBell.d.ts +3 -1
- package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
- package/dist/client/notifications/NotificationsBell.js +7 -3
- package/dist/client/notifications/NotificationsBell.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +13 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +41 -0
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +2 -2
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +102 -0
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/org/auto-join-domain.d.ts +11 -3
- package/dist/org/auto-join-domain.d.ts.map +1 -1
- package/dist/org/auto-join-domain.js +7 -6
- package/dist/org/auto-join-domain.js.map +1 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +68 -32
- package/dist/org/context.js.map +1 -1
- package/dist/org/migrations.d.ts.map +1 -1
- package/dist/org/migrations.js +6 -0
- package/dist/org/migrations.js.map +1 -1
- package/dist/provider-api/actions/github-repo-files.d.ts +84 -0
- package/dist/provider-api/actions/github-repo-files.d.ts.map +1 -0
- package/dist/provider-api/actions/github-repo-files.js +213 -0
- package/dist/provider-api/actions/github-repo-files.js.map +1 -0
- package/dist/provider-api/github-repo.d.ts +11 -0
- package/dist/provider-api/github-repo.d.ts.map +1 -0
- package/dist/provider-api/github-repo.js +553 -0
- package/dist/provider-api/github-repo.js.map +1 -0
- package/dist/provider-api/index.d.ts +184 -11
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +519 -0
- package/dist/provider-api/index.js.map +1 -1
- package/dist/scripts/docs/search.d.ts.map +1 -1
- package/dist/scripts/docs/search.js +38 -13
- package/dist/scripts/docs/search.js.map +1 -1
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +11 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +32 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +297 -2
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth-marketing.d.ts.map +1 -1
- package/dist/server/auth-marketing.js +17 -7
- package/dist/server/auth-marketing.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +6 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +18 -98
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/styles/blocks.css +30 -8
- package/dist/styles/rich-markdown-editor.css +10 -4
- package/dist/templates/{starter-shell-sync.spec.ts → chat-shell-sync.spec.ts} +21 -21
- package/dist/templates/default/.agents/skills/actions/SKILL.md +5 -5
- package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +63 -0
- package/dist/templates/default/AGENTS.md +22 -1
- package/dist/templates/default/actions/hello.ts +1 -1
- package/dist/templates/default/actions/navigate.ts +1 -1
- package/dist/templates/default/actions/view-screen.ts +1 -1
- package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +63 -0
- package/dist/templates/headless/.env.example +4 -0
- package/dist/templates/headless/.prettierrc +5 -0
- package/dist/templates/headless/AGENTS.md +58 -0
- package/dist/templates/headless/DEVELOPING.md +22 -0
- package/dist/templates/headless/_gitignore +36 -0
- package/dist/templates/headless/actions/hello.ts +14 -0
- package/dist/templates/headless/actions/run.ts +3 -0
- package/dist/templates/headless/package.json +22 -0
- package/dist/templates/headless/tsconfig.json +7 -0
- package/dist/templates/ui-primitives-sync.spec.ts +2 -2
- package/dist/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -5
- package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +63 -0
- package/dist/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +9 -0
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +93 -0
- package/dist/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +11 -1
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +1 -1
- package/dist/templates/workspace-core/AGENTS.md +20 -3
- package/dist/templates/workspace-core/src/server/index.ts +1 -1
- package/dist/templates/workspace-root/AGENTS.md +25 -5
- package/dist/templates/workspace-root/README.md +7 -7
- package/dist/triggers/dispatcher.d.ts +2 -3
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +2 -3
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/triggers/routes.d.ts +38 -0
- package/dist/triggers/routes.d.ts.map +1 -0
- package/dist/triggers/routes.js +202 -0
- package/dist/triggers/routes.js.map +1 -0
- package/dist/vite/client.d.ts +2 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +121 -2
- package/dist/vite/client.js.map +1 -1
- package/docs/AGENTS.md +57 -0
- package/docs/SKILL.md +40 -0
- package/docs/content/a2a-protocol.md +1 -1
- package/docs/content/actions.md +48 -8
- package/docs/content/agent-surfaces.md +76 -14
- package/docs/content/cli-adapters.md +1 -1
- package/docs/content/cloneable-saas.md +5 -4
- package/docs/content/code-agents-ui.md +1 -1
- package/docs/content/components.md +1 -1
- package/docs/content/context-awareness.md +15 -3
- package/docs/content/creating-templates.md +15 -7
- package/docs/content/drop-in-agent.md +1 -1
- package/docs/content/faq.md +6 -4
- package/docs/content/getting-started.md +63 -73
- package/docs/content/key-concepts.md +24 -24
- package/docs/content/native-chat-ui.md +4 -4
- package/docs/content/pure-agent-apps.md +34 -10
- package/docs/content/security.md +1 -1
- package/docs/content/server.md +1 -1
- package/docs/content/template-chat.md +85 -0
- package/docs/content/template-dispatch.md +1 -1
- package/docs/content/tracking.md +1 -1
- package/docs/content/what-is-agent-native.md +7 -6
- package/package.json +10 -1
- package/src/templates/{starter-shell-sync.spec.ts → chat-shell-sync.spec.ts} +21 -21
- package/src/templates/default/.agents/skills/actions/SKILL.md +5 -5
- package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +63 -0
- package/src/templates/default/AGENTS.md +22 -1
- package/src/templates/default/actions/hello.ts +1 -1
- package/src/templates/default/actions/navigate.ts +1 -1
- package/src/templates/default/actions/view-screen.ts +1 -1
- package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +63 -0
- package/src/templates/headless/.env.example +4 -0
- package/src/templates/headless/.prettierrc +5 -0
- package/src/templates/headless/AGENTS.md +58 -0
- package/src/templates/headless/DEVELOPING.md +22 -0
- package/src/templates/headless/_gitignore +36 -0
- package/src/templates/headless/actions/hello.ts +14 -0
- package/src/templates/headless/actions/run.ts +3 -0
- package/src/templates/headless/package.json +22 -0
- package/src/templates/headless/tsconfig.json +7 -0
- package/src/templates/ui-primitives-sync.spec.ts +2 -2
- package/src/templates/workspace-core/.agents/skills/actions/SKILL.md +5 -5
- package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +63 -0
- package/src/templates/workspace-core/.agents/skills/client-side-routing/SKILL.md +9 -0
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +93 -0
- package/src/templates/workspace-core/.agents/skills/context-awareness/SKILL.md +11 -1
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +1 -1
- package/src/templates/workspace-core/AGENTS.md +20 -3
- package/src/templates/workspace-core/src/server/index.ts +1 -1
- package/src/templates/workspace-root/AGENTS.md +25 -5
- package/src/templates/workspace-root/README.md +7 -7
- package/docs/content/template-starter.md +0 -78
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { invokeAgent } from "../a2a/invoke.js";
|
|
2
|
+
const VALUE_FLAGS = new Set([
|
|
3
|
+
"agent",
|
|
4
|
+
"target",
|
|
5
|
+
"message",
|
|
6
|
+
"prompt",
|
|
7
|
+
"api-key",
|
|
8
|
+
"api-key-env",
|
|
9
|
+
"context-id",
|
|
10
|
+
"self",
|
|
11
|
+
"self-app-id",
|
|
12
|
+
"self-url",
|
|
13
|
+
"timeout-ms",
|
|
14
|
+
"poll-interval-ms",
|
|
15
|
+
]);
|
|
16
|
+
export function parseInvokeArgs(args) {
|
|
17
|
+
const parsed = {
|
|
18
|
+
json: false,
|
|
19
|
+
help: false,
|
|
20
|
+
errors: [],
|
|
21
|
+
};
|
|
22
|
+
const positional = [];
|
|
23
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
24
|
+
const arg = args[i];
|
|
25
|
+
if (arg === "--") {
|
|
26
|
+
positional.push(...args.slice(i + 1));
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
if (!arg.startsWith("--")) {
|
|
30
|
+
positional.push(arg);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
const eqIndex = arg.indexOf("=");
|
|
34
|
+
const rawName = eqIndex === -1 ? arg.slice("--".length) : arg.slice("--".length, eqIndex);
|
|
35
|
+
const inlineValue = eqIndex === -1 ? undefined : arg.slice(eqIndex + 1);
|
|
36
|
+
const name = rawName.trim();
|
|
37
|
+
if (name === "help" || name === "h") {
|
|
38
|
+
parsed.help = true;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (name === "json") {
|
|
42
|
+
parsed.json = true;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (name === "sync") {
|
|
46
|
+
parsed.async = false;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (name === "async") {
|
|
50
|
+
parsed.async = true;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (name === "no-hint") {
|
|
54
|
+
parsed.includeInvocationHint = false;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (!VALUE_FLAGS.has(name)) {
|
|
58
|
+
parsed.errors.push(`Unknown option: --${name}`);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const value = inlineValue ??
|
|
62
|
+
(args[i + 1] !== undefined && !args[i + 1].startsWith("--")
|
|
63
|
+
? args[++i]
|
|
64
|
+
: undefined);
|
|
65
|
+
if (value === undefined) {
|
|
66
|
+
parsed.errors.push(`Missing value for --${name}`);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
switch (name) {
|
|
70
|
+
case "agent":
|
|
71
|
+
case "target":
|
|
72
|
+
parsed.target = value;
|
|
73
|
+
break;
|
|
74
|
+
case "message":
|
|
75
|
+
case "prompt":
|
|
76
|
+
parsed.prompt = value;
|
|
77
|
+
break;
|
|
78
|
+
case "api-key":
|
|
79
|
+
parsed.apiKey = value;
|
|
80
|
+
break;
|
|
81
|
+
case "api-key-env":
|
|
82
|
+
parsed.apiKeyEnv = value;
|
|
83
|
+
break;
|
|
84
|
+
case "context-id":
|
|
85
|
+
parsed.contextId = value;
|
|
86
|
+
break;
|
|
87
|
+
case "self":
|
|
88
|
+
case "self-app-id":
|
|
89
|
+
parsed.selfAppId = value;
|
|
90
|
+
break;
|
|
91
|
+
case "self-url":
|
|
92
|
+
parsed.selfUrl = value;
|
|
93
|
+
break;
|
|
94
|
+
case "timeout-ms":
|
|
95
|
+
parsed.timeoutMs = parsePositiveInteger("--timeout-ms", value, parsed);
|
|
96
|
+
break;
|
|
97
|
+
case "poll-interval-ms":
|
|
98
|
+
parsed.pollIntervalMs = parsePositiveInteger("--poll-interval-ms", value, parsed);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!parsed.target && positional.length > 0) {
|
|
103
|
+
parsed.target = positional.shift();
|
|
104
|
+
}
|
|
105
|
+
if (!parsed.prompt && positional.length > 0) {
|
|
106
|
+
parsed.prompt = positional.join(" ");
|
|
107
|
+
}
|
|
108
|
+
return parsed;
|
|
109
|
+
}
|
|
110
|
+
export async function runInvoke(args, io = {}) {
|
|
111
|
+
const stdout = io.stdout ?? console.log;
|
|
112
|
+
const stderr = io.stderr ?? console.error;
|
|
113
|
+
const env = io.env ?? process.env;
|
|
114
|
+
const parsed = parseInvokeArgs(args);
|
|
115
|
+
if (parsed.help) {
|
|
116
|
+
stdout(formatInvokeUsage());
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
if (!parsed.target) {
|
|
120
|
+
parsed.errors.push("Missing <app-or-url>");
|
|
121
|
+
}
|
|
122
|
+
if (!parsed.prompt) {
|
|
123
|
+
parsed.errors.push('Missing "prompt"');
|
|
124
|
+
}
|
|
125
|
+
if (parsed.errors.length > 0) {
|
|
126
|
+
stderr(parsed.errors.join("\n"));
|
|
127
|
+
stderr("");
|
|
128
|
+
stderr(formatInvokeUsage());
|
|
129
|
+
return 1;
|
|
130
|
+
}
|
|
131
|
+
const apiKey = resolveApiKey(parsed, env);
|
|
132
|
+
if (apiKey.error) {
|
|
133
|
+
stderr(apiKey.error);
|
|
134
|
+
return 1;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const result = await invokeAgent({
|
|
138
|
+
target: parsed.target,
|
|
139
|
+
prompt: parsed.prompt,
|
|
140
|
+
apiKey: parsed.apiKey ?? apiKey.value,
|
|
141
|
+
contextId: parsed.contextId,
|
|
142
|
+
selfAppId: parsed.selfAppId ?? inferSelfAppId(env),
|
|
143
|
+
selfUrl: parsed.selfUrl ?? env.APP_URL ?? env.BETTER_AUTH_URL,
|
|
144
|
+
async: parsed.async,
|
|
145
|
+
timeoutMs: parsed.timeoutMs,
|
|
146
|
+
pollIntervalMs: parsed.pollIntervalMs,
|
|
147
|
+
includeInvocationHint: parsed.includeInvocationHint,
|
|
148
|
+
});
|
|
149
|
+
if (parsed.json) {
|
|
150
|
+
stdout(JSON.stringify({
|
|
151
|
+
target: result.target,
|
|
152
|
+
responseText: result.responseText,
|
|
153
|
+
}, null, 2));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
stdout(result.responseText);
|
|
157
|
+
}
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
stderr(err instanceof Error ? err.message : String(err));
|
|
162
|
+
return 1;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export function formatInvokeUsage() {
|
|
166
|
+
return [
|
|
167
|
+
'Usage: agent-native invoke <app-or-url> "prompt" [options]',
|
|
168
|
+
"",
|
|
169
|
+
"Calls another agent-native app over A2A by id, name, or URL.",
|
|
170
|
+
"",
|
|
171
|
+
"Options:",
|
|
172
|
+
" --agent <id|name|url> Target agent (alias for positional target)",
|
|
173
|
+
" --message <text> Prompt (alias for positional prompt)",
|
|
174
|
+
" --api-key-env <name> Read bearer token from an env var",
|
|
175
|
+
" --api-key <token> Bearer token value",
|
|
176
|
+
" --context-id <id> A2A context id",
|
|
177
|
+
" --self-app-id <id> Current app id for self-call prevention",
|
|
178
|
+
" --self-url <url> Current app URL for self-call prevention",
|
|
179
|
+
" --timeout-ms <n> Async polling timeout",
|
|
180
|
+
" --poll-interval-ms <n> Async polling interval",
|
|
181
|
+
" --sync Use one blocking A2A message/send request",
|
|
182
|
+
" --no-hint Send the prompt without the cross-app hint",
|
|
183
|
+
" --json Print target metadata and response as JSON",
|
|
184
|
+
].join("\n");
|
|
185
|
+
}
|
|
186
|
+
export function inferSelfAppId(env = process.env) {
|
|
187
|
+
return (normalizeWorkspaceAppId(env.AGENT_NATIVE_WORKSPACE_APP_ID) ??
|
|
188
|
+
normalizeWorkspaceAppId(env.APP_NAME) ??
|
|
189
|
+
normalizeWorkspaceAppId(env.AGENT_APP) ??
|
|
190
|
+
workspaceAppIdFromBasePath(env.APP_BASE_PATH) ??
|
|
191
|
+
workspaceAppIdFromBasePath(env.VITE_APP_BASE_PATH) ??
|
|
192
|
+
undefined);
|
|
193
|
+
}
|
|
194
|
+
function resolveApiKey(parsed, env) {
|
|
195
|
+
if (parsed.apiKey)
|
|
196
|
+
return {};
|
|
197
|
+
if (!parsed.apiKeyEnv)
|
|
198
|
+
return {};
|
|
199
|
+
const value = env[parsed.apiKeyEnv];
|
|
200
|
+
if (!value) {
|
|
201
|
+
return { error: `Env var ${parsed.apiKeyEnv} is not set` };
|
|
202
|
+
}
|
|
203
|
+
return { value };
|
|
204
|
+
}
|
|
205
|
+
function parsePositiveInteger(flag, value, parsed) {
|
|
206
|
+
const n = Number(value);
|
|
207
|
+
if (!Number.isInteger(n) || n <= 0) {
|
|
208
|
+
parsed.errors.push(`${flag} must be a positive integer`);
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
return n;
|
|
212
|
+
}
|
|
213
|
+
function normalizeWorkspaceAppId(value) {
|
|
214
|
+
if (typeof value !== "string")
|
|
215
|
+
return null;
|
|
216
|
+
const trimmed = value.trim();
|
|
217
|
+
if (!trimmed)
|
|
218
|
+
return null;
|
|
219
|
+
const candidate = trimmed.replace(/^\/+/, "").split("/")[0] ?? "";
|
|
220
|
+
if (!/^[a-z0-9][a-z0-9-]{0,127}$/.test(candidate))
|
|
221
|
+
return null;
|
|
222
|
+
return candidate;
|
|
223
|
+
}
|
|
224
|
+
function workspaceAppIdFromBasePath(value) {
|
|
225
|
+
return normalizeWorkspaceAppId(value);
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=invoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/cli/invoke.ts"],"names":[],"mappings":"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","sourcesContent":["import { invokeAgent } from \"../a2a/invoke.js\";\n\nexport interface ParsedInvokeArgs {\n target?: string;\n prompt?: string;\n apiKey?: string;\n apiKeyEnv?: string;\n contextId?: string;\n selfAppId?: string;\n selfUrl?: string;\n timeoutMs?: number;\n pollIntervalMs?: number;\n async?: boolean;\n includeInvocationHint?: boolean;\n json: boolean;\n help: boolean;\n errors: string[];\n}\n\nexport interface InvokeCliIo {\n stdout?: (text: string) => void;\n stderr?: (text: string) => void;\n env?: NodeJS.ProcessEnv;\n}\n\nconst VALUE_FLAGS = new Set([\n \"agent\",\n \"target\",\n \"message\",\n \"prompt\",\n \"api-key\",\n \"api-key-env\",\n \"context-id\",\n \"self\",\n \"self-app-id\",\n \"self-url\",\n \"timeout-ms\",\n \"poll-interval-ms\",\n]);\n\nexport function parseInvokeArgs(args: string[]): ParsedInvokeArgs {\n const parsed: ParsedInvokeArgs = {\n json: false,\n help: false,\n errors: [],\n };\n const positional: string[] = [];\n\n for (let i = 0; i < args.length; i += 1) {\n const arg = args[i];\n if (arg === \"--\") {\n positional.push(...args.slice(i + 1));\n break;\n }\n if (!arg.startsWith(\"--\")) {\n positional.push(arg);\n continue;\n }\n\n const eqIndex = arg.indexOf(\"=\");\n const rawName =\n eqIndex === -1 ? arg.slice(\"--\".length) : arg.slice(\"--\".length, eqIndex);\n const inlineValue = eqIndex === -1 ? undefined : arg.slice(eqIndex + 1);\n const name = rawName.trim();\n\n if (name === \"help\" || name === \"h\") {\n parsed.help = true;\n continue;\n }\n if (name === \"json\") {\n parsed.json = true;\n continue;\n }\n if (name === \"sync\") {\n parsed.async = false;\n continue;\n }\n if (name === \"async\") {\n parsed.async = true;\n continue;\n }\n if (name === \"no-hint\") {\n parsed.includeInvocationHint = false;\n continue;\n }\n if (!VALUE_FLAGS.has(name)) {\n parsed.errors.push(`Unknown option: --${name}`);\n continue;\n }\n\n const value =\n inlineValue ??\n (args[i + 1] !== undefined && !args[i + 1].startsWith(\"--\")\n ? args[++i]\n : undefined);\n if (value === undefined) {\n parsed.errors.push(`Missing value for --${name}`);\n continue;\n }\n\n switch (name) {\n case \"agent\":\n case \"target\":\n parsed.target = value;\n break;\n case \"message\":\n case \"prompt\":\n parsed.prompt = value;\n break;\n case \"api-key\":\n parsed.apiKey = value;\n break;\n case \"api-key-env\":\n parsed.apiKeyEnv = value;\n break;\n case \"context-id\":\n parsed.contextId = value;\n break;\n case \"self\":\n case \"self-app-id\":\n parsed.selfAppId = value;\n break;\n case \"self-url\":\n parsed.selfUrl = value;\n break;\n case \"timeout-ms\":\n parsed.timeoutMs = parsePositiveInteger(\"--timeout-ms\", value, parsed);\n break;\n case \"poll-interval-ms\":\n parsed.pollIntervalMs = parsePositiveInteger(\n \"--poll-interval-ms\",\n value,\n parsed,\n );\n break;\n }\n }\n\n if (!parsed.target && positional.length > 0) {\n parsed.target = positional.shift();\n }\n if (!parsed.prompt && positional.length > 0) {\n parsed.prompt = positional.join(\" \");\n }\n\n return parsed;\n}\n\nexport async function runInvoke(\n args: string[],\n io: InvokeCliIo = {},\n): Promise<number> {\n const stdout = io.stdout ?? console.log;\n const stderr = io.stderr ?? console.error;\n const env = io.env ?? process.env;\n const parsed = parseInvokeArgs(args);\n\n if (parsed.help) {\n stdout(formatInvokeUsage());\n return 0;\n }\n if (!parsed.target) {\n parsed.errors.push(\"Missing <app-or-url>\");\n }\n if (!parsed.prompt) {\n parsed.errors.push('Missing \"prompt\"');\n }\n if (parsed.errors.length > 0) {\n stderr(parsed.errors.join(\"\\n\"));\n stderr(\"\");\n stderr(formatInvokeUsage());\n return 1;\n }\n\n const apiKey = resolveApiKey(parsed, env);\n if (apiKey.error) {\n stderr(apiKey.error);\n return 1;\n }\n\n try {\n const result = await invokeAgent({\n target: parsed.target!,\n prompt: parsed.prompt!,\n apiKey: parsed.apiKey ?? apiKey.value,\n contextId: parsed.contextId,\n selfAppId: parsed.selfAppId ?? inferSelfAppId(env),\n selfUrl: parsed.selfUrl ?? env.APP_URL ?? env.BETTER_AUTH_URL,\n async: parsed.async,\n timeoutMs: parsed.timeoutMs,\n pollIntervalMs: parsed.pollIntervalMs,\n includeInvocationHint: parsed.includeInvocationHint,\n });\n\n if (parsed.json) {\n stdout(\n JSON.stringify(\n {\n target: result.target,\n responseText: result.responseText,\n },\n null,\n 2,\n ),\n );\n } else {\n stdout(result.responseText);\n }\n return 0;\n } catch (err) {\n stderr(err instanceof Error ? err.message : String(err));\n return 1;\n }\n}\n\nexport function formatInvokeUsage(): string {\n return [\n 'Usage: agent-native invoke <app-or-url> \"prompt\" [options]',\n \"\",\n \"Calls another agent-native app over A2A by id, name, or URL.\",\n \"\",\n \"Options:\",\n \" --agent <id|name|url> Target agent (alias for positional target)\",\n \" --message <text> Prompt (alias for positional prompt)\",\n \" --api-key-env <name> Read bearer token from an env var\",\n \" --api-key <token> Bearer token value\",\n \" --context-id <id> A2A context id\",\n \" --self-app-id <id> Current app id for self-call prevention\",\n \" --self-url <url> Current app URL for self-call prevention\",\n \" --timeout-ms <n> Async polling timeout\",\n \" --poll-interval-ms <n> Async polling interval\",\n \" --sync Use one blocking A2A message/send request\",\n \" --no-hint Send the prompt without the cross-app hint\",\n \" --json Print target metadata and response as JSON\",\n ].join(\"\\n\");\n}\n\nexport function inferSelfAppId(\n env: NodeJS.ProcessEnv = process.env,\n): string | undefined {\n return (\n normalizeWorkspaceAppId(env.AGENT_NATIVE_WORKSPACE_APP_ID) ??\n normalizeWorkspaceAppId(env.APP_NAME) ??\n normalizeWorkspaceAppId(env.AGENT_APP) ??\n workspaceAppIdFromBasePath(env.APP_BASE_PATH) ??\n workspaceAppIdFromBasePath(env.VITE_APP_BASE_PATH) ??\n undefined\n );\n}\n\nfunction resolveApiKey(\n parsed: Pick<ParsedInvokeArgs, \"apiKey\" | \"apiKeyEnv\">,\n env: NodeJS.ProcessEnv,\n): { value?: string; error?: string } {\n if (parsed.apiKey) return {};\n if (!parsed.apiKeyEnv) return {};\n const value = env[parsed.apiKeyEnv];\n if (!value) {\n return { error: `Env var ${parsed.apiKeyEnv} is not set` };\n }\n return { value };\n}\n\nfunction parsePositiveInteger(\n flag: string,\n value: string,\n parsed: ParsedInvokeArgs,\n): number | undefined {\n const n = Number(value);\n if (!Number.isInteger(n) || n <= 0) {\n parsed.errors.push(`${flag} must be a positive integer`);\n return undefined;\n }\n return n;\n}\n\nfunction normalizeWorkspaceAppId(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const candidate = trimmed.replace(/^\\/+/, \"\").split(\"/\")[0] ?? \"\";\n if (!/^[a-z0-9][a-z0-9-]{0,127}$/.test(candidate)) return null;\n return candidate;\n}\n\nfunction workspaceAppIdFromBasePath(value: unknown): string | null {\n return normalizeWorkspaceAppId(value);\n}\n"]}
|
|
@@ -41,7 +41,7 @@ export interface TemplateMeta {
|
|
|
41
41
|
hidden?: boolean;
|
|
42
42
|
/** Include as a built-in connected A2A agent even when hidden from pickers */
|
|
43
43
|
defaultAgent?: boolean;
|
|
44
|
-
/** Always scaffold without prompting (e.g.
|
|
44
|
+
/** Always scaffold without prompting (e.g. chat as fallback) */
|
|
45
45
|
alwaysAvailable?: boolean;
|
|
46
46
|
/** Internal workspace packages this template depends on (e.g. "scheduling") */
|
|
47
47
|
requiredPackages?: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates-meta.d.ts","sourceRoot":"","sources":["../../src/cli/templates-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,
|
|
1
|
+
{"version":3,"file":"templates-meta.d.ts","sourceRoot":"","sources":["../../src/cli/templates-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,uEAAuE;IACvE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gEAAgE;IAChE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,wEAAwE;IACxE,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,eAAO,MAAM,SAAS,EAAE,YAAY,EA2LnC,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,gBAAgB,IAAI,YAAY,EAAE,CAEjD;AAED,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,YAAY,EAAE,CAE9C;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CASlE;AAED,gEAAgE;AAChE,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C"}
|
|
@@ -126,18 +126,17 @@ export const TEMPLATES = [
|
|
|
126
126
|
core: true,
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
|
-
name: "
|
|
130
|
-
label: "
|
|
131
|
-
hint: "Minimal
|
|
132
|
-
icon: "
|
|
133
|
-
color: "#
|
|
134
|
-
colorRgb: "
|
|
129
|
+
name: "chat",
|
|
130
|
+
label: "Chat",
|
|
131
|
+
hint: "Minimal chat-first app with durable threads, actions, and the app-agent loop",
|
|
132
|
+
icon: "MessageCircle",
|
|
133
|
+
color: "#18181B",
|
|
134
|
+
colorRgb: "24 24 27",
|
|
135
135
|
devPort: 8089,
|
|
136
|
-
prodUrl: "https://
|
|
136
|
+
prodUrl: "https://chat.agent-native.com",
|
|
137
137
|
defaultMode: "prod",
|
|
138
138
|
alwaysAvailable: true,
|
|
139
139
|
core: true,
|
|
140
|
-
hidden: true,
|
|
141
140
|
},
|
|
142
141
|
{
|
|
143
142
|
name: "clips",
|
|
@@ -214,6 +213,8 @@ export function coreTemplates() {
|
|
|
214
213
|
/** Lookup by name. Returns undefined for unknown names. */
|
|
215
214
|
export function getTemplate(name) {
|
|
216
215
|
// Tolerate legacy / renamed aliases.
|
|
216
|
+
if (name === "starter")
|
|
217
|
+
name = "chat";
|
|
217
218
|
if (name === "video")
|
|
218
219
|
name = "videos";
|
|
219
220
|
if (name === "image" || name === "images" || name === "asset") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates-meta.js","sourceRoot":"","sources":["../../src/cli/templates-meta.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-party template metadata used by the `agent-native` CLI.\n *\n * This file is intentionally inlined here (rather than imported from a\n * separate workspace package) so that the published `@agent-native/core`\n * has no `workspace:*` runtime dependencies. Without this inlining, `npx\n * @agent-native/core create ...` fails on a fresh machine with:\n *\n * npm error code EUNSUPPORTEDPROTOCOL\n * npm error Unsupported URL Type \"workspace:\": workspace:*\n *\n * Keep this list in sync with `packages/shared-app-config/templates.ts`,\n * which serves the same metadata to the desktop / mobile / frame packages\n * that always run inside the workspace. Duplication is intentional: the\n * CLI must remain installable outside the monorepo.\n */\n\nexport interface TemplateMeta {\n /** Directory name under templates/ and package name */\n name: string;\n /** Display name in pickers */\n label: string;\n /** One-line description shown in the picker */\n hint: string;\n /** Longer description (optional) */\n description?: string;\n /** Tabler icon name used in the desktop sidebar */\n icon: string;\n /** Hex accent color */\n color: string;\n /** CSS-safe RGB triplet (e.g. \"59 130 246\") */\n colorRgb: string;\n /** Dev server port for desktop `pnpm dev` */\n devPort: number;\n /** Production URL when running as a first-party app on agent-native.com */\n prodUrl?: string;\n /** Default URL path when deployed in a workspace (defaults to \"/<name>\") */\n prodPath?: string;\n /** Default mode when added to desktop app */\n defaultMode?: \"dev\" | \"prod\";\n /** Hide from pickers but still scaffoldable via explicit --template */\n hidden?: boolean;\n /** Include as a built-in connected A2A agent even when hidden from pickers */\n defaultAgent?: boolean;\n /** Always scaffold without prompting (e.g. starter as fallback) */\n alwaysAvailable?: boolean;\n /** Internal workspace packages this template depends on (e.g. \"scheduling\") */\n requiredPackages?: string[];\n /** Core app — featured in the CLI picker, homepage, and docs gallery */\n core?: boolean;\n}\n\nexport const TEMPLATES: TemplateMeta[] = [\n {\n name: \"calendar\",\n label: \"Calendar\",\n hint: \"Agent-native Google Calendar — manage events, sync, and public booking\",\n icon: \"CalendarDays\",\n color: \"#00B5FF\",\n colorRgb: \"0 181 255\",\n devPort: 8082,\n prodUrl: \"https://calendar.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"scheduling\"],\n core: true,\n },\n {\n name: \"content\",\n label: \"Content\",\n hint: \"Open-source Obsidian for MDX — edit local docs with agent assistance\",\n icon: \"FileText\",\n color: \"#10B981\",\n colorRgb: \"16 185 129\",\n devPort: 8083,\n prodUrl: \"https://content.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"plan\",\n label: \"Plan\",\n hint: \"Structured visual plans and PR recaps with diagrams, wireframes, prototypes, annotations, and sharing\",\n icon: \"FileText\",\n color: \"#52525B\",\n colorRgb: \"82 82 91\",\n devPort: 8105,\n prodUrl: \"https://plan.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"slides\",\n label: \"Slides\",\n hint: \"Agent-native Google Slides — generate and edit React presentations\",\n icon: \"GalleryHorizontal\",\n color: \"#EC4899\",\n colorRgb: \"236 72 153\",\n devPort: 8086,\n prodUrl: \"https://slides.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\"],\n core: true,\n },\n {\n name: \"videos\",\n label: \"Video\",\n hint: \"Agent-native video editing with Remotion\",\n icon: \"Video\",\n color: \"#EF4444\",\n colorRgb: \"239 68 68\",\n devPort: 8087,\n prodUrl: \"https://videos.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\"],\n },\n {\n name: \"analytics\",\n label: \"Analytics\",\n hint: \"Agent-native Amplitude/Mixpanel — connect data sources, prompt for charts\",\n icon: \"BarChart2\",\n color: \"#F59E0B\",\n colorRgb: \"245 158 11\",\n devPort: 8088,\n prodUrl: \"https://analytics.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"mail\",\n label: \"Mail\",\n hint: \"Agent-native Superhuman — email client with keyboard shortcuts and AI triage\",\n icon: \"Mail\",\n color: \"#3B82F6\",\n colorRgb: \"59 130 246\",\n devPort: 8085,\n prodUrl: \"https://mail.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"dispatch\",\n label: \"Dispatch\",\n hint: \"Central Slack/Telegram router with jobs, memory, approvals, and A2A delegation\",\n icon: \"MessageCircle\",\n color: \"#14B8A6\",\n colorRgb: \"20 184 166\",\n devPort: 8092,\n prodUrl: \"https://dispatch.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"forms\",\n label: \"Forms\",\n hint: \"Agent-native form builder — create, edit, and manage forms\",\n icon: \"ClipboardList\",\n color: \"#06B6D4\",\n colorRgb: \"6 182 212\",\n devPort: 8084,\n prodUrl: \"https://forms.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"starter\",\n label: \"Starter\",\n hint: \"Minimal scaffold with the agent chat and core architecture wired up\",\n icon: \"Code\",\n color: \"#71717A\",\n colorRgb: \"113 113 122\",\n devPort: 8089,\n prodUrl: \"https://starter.agent-native.com\",\n defaultMode: \"prod\",\n alwaysAvailable: true,\n core: true,\n hidden: true,\n },\n {\n name: \"clips\",\n label: \"Clips\",\n hint: \"Screen recording, meeting notes, and voice dictation — all with AI\",\n icon: \"ScreenShare\",\n color: \"#0EA5E9\",\n colorRgb: \"14 165 233\",\n devPort: 8094,\n prodUrl: \"https://clips.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"brain\",\n label: \"Brain\",\n hint: \"Cited company knowledge from Slack, meetings, transcripts, and decisions\",\n icon: \"Brain\",\n color: \"#8B5CF6\",\n colorRgb: \"139 92 246\",\n devPort: 8102,\n prodUrl: \"https://brain.agent-native.com\",\n defaultMode: \"prod\",\n defaultAgent: true,\n core: true,\n },\n {\n name: \"design\",\n label: \"Design\",\n hint: \"Agent-native design tool — create and edit visual designs with agent assistance\",\n icon: \"Brush\",\n color: \"#F472B6\",\n colorRgb: \"244 114 182\",\n devPort: 8099,\n prodUrl: \"https://design.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\", \"embedding\"],\n core: true,\n },\n {\n name: \"assets\",\n label: \"Assets\",\n hint: \"Digital asset manager — upload, organize, search, and generate on-brand images and videos\",\n icon: \"Photo\",\n color: \"#0F766E\",\n colorRgb: \"15 118 110\",\n devPort: 8100,\n prodUrl: \"https://assets.agent-native.com\",\n defaultMode: \"prod\",\n defaultAgent: true,\n core: true,\n },\n {\n name: \"macros\",\n label: \"Macros\",\n hint: \"Internal template — not shown in pickers\",\n icon: \"Code\",\n color: \"#71717A\",\n colorRgb: \"113 113 122\",\n devPort: 8093,\n prodUrl: \"https://macros.agent-native.com\",\n hidden: true,\n defaultMode: \"dev\",\n },\n];\n\n/** Return templates visible in user-facing pickers (excludes hidden). */\nexport function visibleTemplates(): TemplateMeta[] {\n return TEMPLATES.filter((t) => !t.hidden);\n}\n\n/** Return core templates — the featured set shown in CLI pickers by default. */\nexport function coreTemplates(): TemplateMeta[] {\n return TEMPLATES.filter((t) => t.core);\n}\n\n/** Lookup by name. Returns undefined for unknown names. */\nexport function getTemplate(name: string): TemplateMeta | undefined {\n // Tolerate legacy / renamed aliases.\n if (name === \"video\") name = \"videos\";\n if (name === \"image\" || name === \"images\" || name === \"asset\") {\n name = \"assets\";\n }\n if (name === \"contracts\" || name === \"visual-plans\") name = \"plan\";\n return TEMPLATES.find((t) => t.name === name);\n}\n\n/** Names of all templates (including hidden) for validation. */\nexport function allTemplateNames(): string[] {\n return TEMPLATES.map((t) => t.name);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"templates-meta.js","sourceRoot":"","sources":["../../src/cli/templates-meta.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * First-party template metadata used by the `agent-native` CLI.\n *\n * This file is intentionally inlined here (rather than imported from a\n * separate workspace package) so that the published `@agent-native/core`\n * has no `workspace:*` runtime dependencies. Without this inlining, `npx\n * @agent-native/core create ...` fails on a fresh machine with:\n *\n * npm error code EUNSUPPORTEDPROTOCOL\n * npm error Unsupported URL Type \"workspace:\": workspace:*\n *\n * Keep this list in sync with `packages/shared-app-config/templates.ts`,\n * which serves the same metadata to the desktop / mobile / frame packages\n * that always run inside the workspace. Duplication is intentional: the\n * CLI must remain installable outside the monorepo.\n */\n\nexport interface TemplateMeta {\n /** Directory name under templates/ and package name */\n name: string;\n /** Display name in pickers */\n label: string;\n /** One-line description shown in the picker */\n hint: string;\n /** Longer description (optional) */\n description?: string;\n /** Tabler icon name used in the desktop sidebar */\n icon: string;\n /** Hex accent color */\n color: string;\n /** CSS-safe RGB triplet (e.g. \"59 130 246\") */\n colorRgb: string;\n /** Dev server port for desktop `pnpm dev` */\n devPort: number;\n /** Production URL when running as a first-party app on agent-native.com */\n prodUrl?: string;\n /** Default URL path when deployed in a workspace (defaults to \"/<name>\") */\n prodPath?: string;\n /** Default mode when added to desktop app */\n defaultMode?: \"dev\" | \"prod\";\n /** Hide from pickers but still scaffoldable via explicit --template */\n hidden?: boolean;\n /** Include as a built-in connected A2A agent even when hidden from pickers */\n defaultAgent?: boolean;\n /** Always scaffold without prompting (e.g. chat as fallback) */\n alwaysAvailable?: boolean;\n /** Internal workspace packages this template depends on (e.g. \"scheduling\") */\n requiredPackages?: string[];\n /** Core app — featured in the CLI picker, homepage, and docs gallery */\n core?: boolean;\n}\n\nexport const TEMPLATES: TemplateMeta[] = [\n {\n name: \"calendar\",\n label: \"Calendar\",\n hint: \"Agent-native Google Calendar — manage events, sync, and public booking\",\n icon: \"CalendarDays\",\n color: \"#00B5FF\",\n colorRgb: \"0 181 255\",\n devPort: 8082,\n prodUrl: \"https://calendar.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"scheduling\"],\n core: true,\n },\n {\n name: \"content\",\n label: \"Content\",\n hint: \"Open-source Obsidian for MDX — edit local docs with agent assistance\",\n icon: \"FileText\",\n color: \"#10B981\",\n colorRgb: \"16 185 129\",\n devPort: 8083,\n prodUrl: \"https://content.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"plan\",\n label: \"Plan\",\n hint: \"Structured visual plans and PR recaps with diagrams, wireframes, prototypes, annotations, and sharing\",\n icon: \"FileText\",\n color: \"#52525B\",\n colorRgb: \"82 82 91\",\n devPort: 8105,\n prodUrl: \"https://plan.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"slides\",\n label: \"Slides\",\n hint: \"Agent-native Google Slides — generate and edit React presentations\",\n icon: \"GalleryHorizontal\",\n color: \"#EC4899\",\n colorRgb: \"236 72 153\",\n devPort: 8086,\n prodUrl: \"https://slides.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\"],\n core: true,\n },\n {\n name: \"videos\",\n label: \"Video\",\n hint: \"Agent-native video editing with Remotion\",\n icon: \"Video\",\n color: \"#EF4444\",\n colorRgb: \"239 68 68\",\n devPort: 8087,\n prodUrl: \"https://videos.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\"],\n },\n {\n name: \"analytics\",\n label: \"Analytics\",\n hint: \"Agent-native Amplitude/Mixpanel — connect data sources, prompt for charts\",\n icon: \"BarChart2\",\n color: \"#F59E0B\",\n colorRgb: \"245 158 11\",\n devPort: 8088,\n prodUrl: \"https://analytics.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"mail\",\n label: \"Mail\",\n hint: \"Agent-native Superhuman — email client with keyboard shortcuts and AI triage\",\n icon: \"Mail\",\n color: \"#3B82F6\",\n colorRgb: \"59 130 246\",\n devPort: 8085,\n prodUrl: \"https://mail.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"dispatch\",\n label: \"Dispatch\",\n hint: \"Central Slack/Telegram router with jobs, memory, approvals, and A2A delegation\",\n icon: \"MessageCircle\",\n color: \"#14B8A6\",\n colorRgb: \"20 184 166\",\n devPort: 8092,\n prodUrl: \"https://dispatch.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"forms\",\n label: \"Forms\",\n hint: \"Agent-native form builder — create, edit, and manage forms\",\n icon: \"ClipboardList\",\n color: \"#06B6D4\",\n colorRgb: \"6 182 212\",\n devPort: 8084,\n prodUrl: \"https://forms.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"chat\",\n label: \"Chat\",\n hint: \"Minimal chat-first app with durable threads, actions, and the app-agent loop\",\n icon: \"MessageCircle\",\n color: \"#18181B\",\n colorRgb: \"24 24 27\",\n devPort: 8089,\n prodUrl: \"https://chat.agent-native.com\",\n defaultMode: \"prod\",\n alwaysAvailable: true,\n core: true,\n },\n {\n name: \"clips\",\n label: \"Clips\",\n hint: \"Screen recording, meeting notes, and voice dictation — all with AI\",\n icon: \"ScreenShare\",\n color: \"#0EA5E9\",\n colorRgb: \"14 165 233\",\n devPort: 8094,\n prodUrl: \"https://clips.agent-native.com\",\n defaultMode: \"prod\",\n core: true,\n },\n {\n name: \"brain\",\n label: \"Brain\",\n hint: \"Cited company knowledge from Slack, meetings, transcripts, and decisions\",\n icon: \"Brain\",\n color: \"#8B5CF6\",\n colorRgb: \"139 92 246\",\n devPort: 8102,\n prodUrl: \"https://brain.agent-native.com\",\n defaultMode: \"prod\",\n defaultAgent: true,\n core: true,\n },\n {\n name: \"design\",\n label: \"Design\",\n hint: \"Agent-native design tool — create and edit visual designs with agent assistance\",\n icon: \"Brush\",\n color: \"#F472B6\",\n colorRgb: \"244 114 182\",\n devPort: 8099,\n prodUrl: \"https://design.agent-native.com\",\n defaultMode: \"prod\",\n requiredPackages: [\"pinpoint\", \"embedding\"],\n core: true,\n },\n {\n name: \"assets\",\n label: \"Assets\",\n hint: \"Digital asset manager — upload, organize, search, and generate on-brand images and videos\",\n icon: \"Photo\",\n color: \"#0F766E\",\n colorRgb: \"15 118 110\",\n devPort: 8100,\n prodUrl: \"https://assets.agent-native.com\",\n defaultMode: \"prod\",\n defaultAgent: true,\n core: true,\n },\n {\n name: \"macros\",\n label: \"Macros\",\n hint: \"Internal template — not shown in pickers\",\n icon: \"Code\",\n color: \"#71717A\",\n colorRgb: \"113 113 122\",\n devPort: 8093,\n prodUrl: \"https://macros.agent-native.com\",\n hidden: true,\n defaultMode: \"dev\",\n },\n];\n\n/** Return templates visible in user-facing pickers (excludes hidden). */\nexport function visibleTemplates(): TemplateMeta[] {\n return TEMPLATES.filter((t) => !t.hidden);\n}\n\n/** Return core templates — the featured set shown in CLI pickers by default. */\nexport function coreTemplates(): TemplateMeta[] {\n return TEMPLATES.filter((t) => t.core);\n}\n\n/** Lookup by name. Returns undefined for unknown names. */\nexport function getTemplate(name: string): TemplateMeta | undefined {\n // Tolerate legacy / renamed aliases.\n if (name === \"starter\") name = \"chat\";\n if (name === \"video\") name = \"videos\";\n if (name === \"image\" || name === \"images\" || name === \"asset\") {\n name = \"assets\";\n }\n if (name === \"contracts\" || name === \"visual-plans\") name = \"plan\";\n return TEMPLATES.find((t) => t.name === name);\n}\n\n/** Names of all templates (including hidden) for validation. */\nexport function allTemplateNames(): string[] {\n return TEMPLATES.map((t) => t.name);\n}\n"]}
|
|
@@ -3,7 +3,7 @@ export interface WorkspacifyOptions {
|
|
|
3
3
|
appDir: string;
|
|
4
4
|
/** App name (e.g. "mail") */
|
|
5
5
|
appName: string;
|
|
6
|
-
/** Source template name (e.g. "
|
|
6
|
+
/** Source template name (e.g. "chat" when appName is "crm") */
|
|
7
7
|
templateName?: string;
|
|
8
8
|
/** Workspace root directory */
|
|
9
9
|
workspaceRoot: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspacify.d.ts","sourceRoot":"","sources":["../../src/cli/workspacify.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB
|
|
1
|
+
{"version":3,"file":"workspacify.d.ts","sourceRoot":"","sources":["../../src/cli/workspacify.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,+DAA+D;IAC/D,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CA0G7D;AA2DD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAGrE"}
|
package/dist/cli/workspacify.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* inherits shared plugins/skills/AGENTS.md via the three-layer model.
|
|
11
11
|
* 2. Removes files that only make sense in standalone apps
|
|
12
12
|
* (`learnings.defaults.md`, etc.).
|
|
13
|
-
* 3. Replaces
|
|
13
|
+
* 3. Replaces chat's stock auth/chat wrappers with inherited wrappers so
|
|
14
14
|
* the workspace core can own those plugin slots while framework defaults
|
|
15
15
|
* still mount when the workspace core is empty.
|
|
16
16
|
* 4. Leaves app source code untouched. The three-layer framework
|
|
@@ -117,15 +117,15 @@ export function workspacifyApp(opts) {
|
|
|
117
117
|
// Non-fatal: leave AGENTS.md unchanged.
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
|
-
if ((opts.templateName ?? opts.appName)
|
|
121
|
-
|
|
120
|
+
if (["starter", "chat"].includes(opts.templateName ?? opts.appName)) {
|
|
121
|
+
writeInheritedChatPlugin(appDir, workspaceCoreName, {
|
|
122
122
|
fileName: "auth.ts",
|
|
123
123
|
exportName: "defaultAuthPlugin",
|
|
124
124
|
});
|
|
125
|
-
|
|
125
|
+
writeInheritedChatAgentChatPlugin(appDir, workspaceCoreName, opts.appName);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
|
-
function
|
|
128
|
+
function writeInheritedChatPlugin(appDir, workspaceCoreName, opts) {
|
|
129
129
|
const pluginsDir = path.join(appDir, "server", "plugins");
|
|
130
130
|
fs.mkdirSync(pluginsDir, { recursive: true });
|
|
131
131
|
const pluginPath = path.join(pluginsDir, opts.fileName);
|
|
@@ -141,7 +141,7 @@ function writeInheritedStarterPlugin(appDir, workspaceCoreName, opts) {
|
|
|
141
141
|
"",
|
|
142
142
|
].join("\n"));
|
|
143
143
|
}
|
|
144
|
-
function
|
|
144
|
+
function writeInheritedChatAgentChatPlugin(appDir, workspaceCoreName, appId) {
|
|
145
145
|
const pluginsDir = path.join(appDir, "server", "plugins");
|
|
146
146
|
fs.mkdirSync(pluginsDir, { recursive: true });
|
|
147
147
|
const pluginPath = path.join(pluginsDir, "agent-chat.ts");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspacify.js","sourceRoot":"","sources":["../../src/cli/workspacify.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Transform a standalone template directory into a workspace app in place.\n *\n * Called after copying any template under `apps/<name>/` inside an enterprise\n * workspace. The transform:\n *\n * 1. Rewrites package.json:\n * - @agent-native/core and package-backed apps stay as regular npm deps\n * - Adds @<workspace-scope>/shared as a workspace:* dep so the app\n * inherits shared plugins/skills/AGENTS.md via the three-layer model.\n * 2. Removes files that only make sense in standalone apps\n * (`learnings.defaults.md`, etc.).\n * 3. Replaces starter's stock auth/chat wrappers with inherited wrappers so\n * the workspace core can own those plugin slots while framework defaults\n * still mount when the workspace core is empty.\n * 4. Leaves app source code untouched. The three-layer framework\n * auto-discovers workspace-core via `agent-native.workspaceCore` in the\n * workspace root package.json — no per-app wiring needed.\n *\n * This means any first-party template under templates/* is usable as a\n * workspace app without maintaining a parallel copy.\n */\nimport fs from \"fs\";\nimport path from \"path\";\n\nconst POSTGRES_DEPENDENCY_VERSION = \"^3.4.9\";\n\nexport interface WorkspacifyOptions {\n /** Target app directory (already populated with the copied template) */\n appDir: string;\n /** App name (e.g. \"mail\") */\n appName: string;\n /** Source template name (e.g. \"starter\" when appName is \"crm\") */\n templateName?: string;\n /** Workspace root directory */\n workspaceRoot: string;\n /** Shared workspace package name (e.g. \"@my-company/shared\") */\n workspaceCoreName: string;\n /** Version range to use for the published @agent-native/core package */\n coreDependencyVersion?: string;\n /** Version range to use for the package-backed Dispatch app */\n dispatchDependencyVersion?: string;\n}\n\nexport function workspacifyApp(opts: WorkspacifyOptions): void {\n const { appDir, workspaceCoreName } = opts;\n const coreDependencyVersion = opts.coreDependencyVersion ?? \"latest\";\n const dispatchDependencyVersion = opts.dispatchDependencyVersion ?? \"latest\";\n\n // 1) Rewrite package.json to add the workspace core dep and resolve\n // @agent-native/core / @agent-native/dispatch workspace:* refs to\n // published package ranges. Other workspace:* deps (e.g.\n // @agent-native/scheduling) stay as-is — they resolve within the\n // workspace because the required package is scaffolded alongside the app.\n const pkgPath = path.join(appDir, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n for (const depType of [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n ] as const) {\n const deps = pkg[depType];\n if (!deps) continue;\n for (const [key, val] of Object.entries(deps)) {\n if (typeof val === \"string\" && val.startsWith(\"workspace:\")) {\n if (key === \"@agent-native/core\") {\n deps[key] = coreDependencyVersion;\n }\n if (key === \"@agent-native/dispatch\") {\n deps[key] = dispatchDependencyVersion;\n }\n }\n }\n }\n // Ensure the dependency on the workspace shared package is present.\n pkg.dependencies = pkg.dependencies ?? {};\n pkg.dependencies[workspaceCoreName] = \"workspace:*\";\n // Core loads postgres-js lazily when DATABASE_URL points at Postgres.\n // Add the runtime package to workspace apps so production bundles do\n // not fail only after a hosted Postgres database is configured.\n pkg.dependencies.postgres ??= POSTGRES_DEPENDENCY_VERSION;\n // pnpm build-script approvals belong at the workspace root. Leaving the\n // template's per-app setting in place makes pnpm warn on every install.\n if (pkg.pnpm && typeof pkg.pnpm === \"object\") {\n delete pkg.pnpm.onlyBuiltDependencies;\n if (Object.keys(pkg.pnpm).length === 0) {\n delete pkg.pnpm;\n }\n }\n // Pin @assistant-ui/store and @assistant-ui/tap so pre-existing workspaces\n // whose root pnpm-workspace.yaml pre-dates this fix are still protected.\n // The constraints exclude the breaking store@0.2.14/tap@0.6.0 combination\n // that causes Vite pre-bundling failures via a missing ./react-shim export.\n pkg.devDependencies = pkg.devDependencies ?? {};\n pkg.devDependencies[\"@assistant-ui/store\"] ??= \">=0.2.9 <0.2.14\";\n pkg.devDependencies[\"@assistant-ui/tap\"] ??= \"^0.5.14\";\n fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n } catch {\n // Non-fatal: leave package.json unchanged.\n }\n }\n\n // 2) Remove standalone-only files that would confuse the workspace layout.\n for (const f of [\n \"learnings.defaults.md\",\n // pnpm-workspace.yaml marks a directory as a pnpm workspace root.\n // Leaving it in an app directory nested under a parent workspace causes\n // ERR_PNPM_WORKSPACE_PKG_NOT_FOUND when the app depends on workspace:*\n // packages (e.g. @<scope>/shared). Overrides belong at the workspace root.\n \"pnpm-workspace.yaml\",\n ]) {\n const p = path.join(appDir, f);\n try {\n if (fs.existsSync(p)) fs.unlinkSync(p);\n } catch {\n // Non-fatal: leave the file in place.\n }\n }\n\n // 3) Templates document action commands from the framework repo layout.\n // Workspace apps live under apps/<name>, so point every agent at the\n // generated app directory instead.\n const agentsPath = path.join(appDir, \"AGENTS.md\");\n if (fs.existsSync(agentsPath)) {\n try {\n let content = fs.readFileSync(agentsPath, \"utf-8\");\n content = content\n .replace(\n \"The terminal cwd is the framework root. Always `cd` to this template's root before running any action:\",\n `The terminal cwd is the workspace root. Always \\`cd\\` to this app's root before running any action:`,\n )\n .replace(\n /cd templates\\/[^ \\n]+ && pnpm action/g,\n `cd apps/${opts.appName} && pnpm action`,\n );\n fs.writeFileSync(agentsPath, content);\n } catch {\n // Non-fatal: leave AGENTS.md unchanged.\n }\n }\n\n if ((opts.templateName ?? opts.appName) === \"starter\") {\n writeInheritedStarterPlugin(appDir, workspaceCoreName, {\n fileName: \"auth.ts\",\n exportName: \"defaultAuthPlugin\",\n });\n writeInheritedStarterAgentChatPlugin(\n appDir,\n workspaceCoreName,\n opts.appName,\n );\n }\n}\n\nfunction writeInheritedStarterPlugin(\n appDir: string,\n workspaceCoreName: string,\n opts: { fileName: string; exportName: string },\n): void {\n const pluginsDir = path.join(appDir, \"server\", \"plugins\");\n fs.mkdirSync(pluginsDir, { recursive: true });\n const pluginPath = path.join(pluginsDir, opts.fileName);\n fs.writeFileSync(\n pluginPath,\n [\n `import { ${opts.exportName} as frameworkDefault } from \"@agent-native/core/server\";`,\n `import * as workspaceServer from ${JSON.stringify(`${workspaceCoreName}/server`)};`,\n \"\",\n `const workspacePlugin = (workspaceServer as Record<string, unknown>).${opts.exportName};`,\n \"\",\n 'export default typeof workspacePlugin === \"function\"',\n \" ? workspacePlugin\",\n \" : frameworkDefault;\",\n \"\",\n ].join(\"\\n\"),\n );\n}\n\nfunction writeInheritedStarterAgentChatPlugin(\n appDir: string,\n workspaceCoreName: string,\n appId: string,\n): void {\n const pluginsDir = path.join(appDir, \"server\", \"plugins\");\n fs.mkdirSync(pluginsDir, { recursive: true });\n const pluginPath = path.join(pluginsDir, \"agent-chat.ts\");\n fs.writeFileSync(\n pluginPath,\n [\n `import {`,\n ` createAgentChatPlugin,`,\n ` loadActionsFromStaticRegistry,`,\n ` type AgentChatPluginOptions,`,\n `} from \"@agent-native/core/server\";`,\n `import * as workspaceServer from ${JSON.stringify(`${workspaceCoreName}/server`)};`,\n `import actionsRegistry from \"../../.generated/actions-registry.js\";`,\n \"\",\n `const createWorkspaceAgentChatPlugin = (workspaceServer as Record<string, unknown>).createWorkspaceAgentChatPlugin;`,\n `const options = {`,\n ` appId: ${JSON.stringify(appId)},`,\n ` actions: loadActionsFromStaticRegistry(actionsRegistry),`,\n `} satisfies AgentChatPluginOptions;`,\n \"\",\n `export default typeof createWorkspaceAgentChatPlugin === \"function\"`,\n ` ? (createWorkspaceAgentChatPlugin as (options: AgentChatPluginOptions) => unknown)(options)`,\n ` : createAgentChatPlugin(options);`,\n \"\",\n ].join(\"\\n\"),\n );\n}\n\n/**\n * Parse a workspace core package name into its npm scope.\n * \"@my-company/shared\" → \"my-company\"\n * \"shared\" → \"\" (no scope — shouldn't happen)\n */\nexport function parseWorkspaceScope(workspaceCoreName: string): string {\n const m = workspaceCoreName.match(/^@([^/]+)\\//);\n return m ? m[1] : \"\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workspacify.js","sourceRoot":"","sources":["../../src/cli/workspacify.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Transform a standalone template directory into a workspace app in place.\n *\n * Called after copying any template under `apps/<name>/` inside an enterprise\n * workspace. The transform:\n *\n * 1. Rewrites package.json:\n * - @agent-native/core and package-backed apps stay as regular npm deps\n * - Adds @<workspace-scope>/shared as a workspace:* dep so the app\n * inherits shared plugins/skills/AGENTS.md via the three-layer model.\n * 2. Removes files that only make sense in standalone apps\n * (`learnings.defaults.md`, etc.).\n * 3. Replaces chat's stock auth/chat wrappers with inherited wrappers so\n * the workspace core can own those plugin slots while framework defaults\n * still mount when the workspace core is empty.\n * 4. Leaves app source code untouched. The three-layer framework\n * auto-discovers workspace-core via `agent-native.workspaceCore` in the\n * workspace root package.json — no per-app wiring needed.\n *\n * This means any first-party template under templates/* is usable as a\n * workspace app without maintaining a parallel copy.\n */\nimport fs from \"fs\";\nimport path from \"path\";\n\nconst POSTGRES_DEPENDENCY_VERSION = \"^3.4.9\";\n\nexport interface WorkspacifyOptions {\n /** Target app directory (already populated with the copied template) */\n appDir: string;\n /** App name (e.g. \"mail\") */\n appName: string;\n /** Source template name (e.g. \"chat\" when appName is \"crm\") */\n templateName?: string;\n /** Workspace root directory */\n workspaceRoot: string;\n /** Shared workspace package name (e.g. \"@my-company/shared\") */\n workspaceCoreName: string;\n /** Version range to use for the published @agent-native/core package */\n coreDependencyVersion?: string;\n /** Version range to use for the package-backed Dispatch app */\n dispatchDependencyVersion?: string;\n}\n\nexport function workspacifyApp(opts: WorkspacifyOptions): void {\n const { appDir, workspaceCoreName } = opts;\n const coreDependencyVersion = opts.coreDependencyVersion ?? \"latest\";\n const dispatchDependencyVersion = opts.dispatchDependencyVersion ?? \"latest\";\n\n // 1) Rewrite package.json to add the workspace core dep and resolve\n // @agent-native/core / @agent-native/dispatch workspace:* refs to\n // published package ranges. Other workspace:* deps (e.g.\n // @agent-native/scheduling) stay as-is — they resolve within the\n // workspace because the required package is scaffolded alongside the app.\n const pkgPath = path.join(appDir, \"package.json\");\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n for (const depType of [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n ] as const) {\n const deps = pkg[depType];\n if (!deps) continue;\n for (const [key, val] of Object.entries(deps)) {\n if (typeof val === \"string\" && val.startsWith(\"workspace:\")) {\n if (key === \"@agent-native/core\") {\n deps[key] = coreDependencyVersion;\n }\n if (key === \"@agent-native/dispatch\") {\n deps[key] = dispatchDependencyVersion;\n }\n }\n }\n }\n // Ensure the dependency on the workspace shared package is present.\n pkg.dependencies = pkg.dependencies ?? {};\n pkg.dependencies[workspaceCoreName] = \"workspace:*\";\n // Core loads postgres-js lazily when DATABASE_URL points at Postgres.\n // Add the runtime package to workspace apps so production bundles do\n // not fail only after a hosted Postgres database is configured.\n pkg.dependencies.postgres ??= POSTGRES_DEPENDENCY_VERSION;\n // pnpm build-script approvals belong at the workspace root. Leaving the\n // template's per-app setting in place makes pnpm warn on every install.\n if (pkg.pnpm && typeof pkg.pnpm === \"object\") {\n delete pkg.pnpm.onlyBuiltDependencies;\n if (Object.keys(pkg.pnpm).length === 0) {\n delete pkg.pnpm;\n }\n }\n // Pin @assistant-ui/store and @assistant-ui/tap so pre-existing workspaces\n // whose root pnpm-workspace.yaml pre-dates this fix are still protected.\n // The constraints exclude the breaking store@0.2.14/tap@0.6.0 combination\n // that causes Vite pre-bundling failures via a missing ./react-shim export.\n pkg.devDependencies = pkg.devDependencies ?? {};\n pkg.devDependencies[\"@assistant-ui/store\"] ??= \">=0.2.9 <0.2.14\";\n pkg.devDependencies[\"@assistant-ui/tap\"] ??= \"^0.5.14\";\n fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n } catch {\n // Non-fatal: leave package.json unchanged.\n }\n }\n\n // 2) Remove standalone-only files that would confuse the workspace layout.\n for (const f of [\n \"learnings.defaults.md\",\n // pnpm-workspace.yaml marks a directory as a pnpm workspace root.\n // Leaving it in an app directory nested under a parent workspace causes\n // ERR_PNPM_WORKSPACE_PKG_NOT_FOUND when the app depends on workspace:*\n // packages (e.g. @<scope>/shared). Overrides belong at the workspace root.\n \"pnpm-workspace.yaml\",\n ]) {\n const p = path.join(appDir, f);\n try {\n if (fs.existsSync(p)) fs.unlinkSync(p);\n } catch {\n // Non-fatal: leave the file in place.\n }\n }\n\n // 3) Templates document action commands from the framework repo layout.\n // Workspace apps live under apps/<name>, so point every agent at the\n // generated app directory instead.\n const agentsPath = path.join(appDir, \"AGENTS.md\");\n if (fs.existsSync(agentsPath)) {\n try {\n let content = fs.readFileSync(agentsPath, \"utf-8\");\n content = content\n .replace(\n \"The terminal cwd is the framework root. Always `cd` to this template's root before running any action:\",\n `The terminal cwd is the workspace root. Always \\`cd\\` to this app's root before running any action:`,\n )\n .replace(\n /cd templates\\/[^ \\n]+ && pnpm action/g,\n `cd apps/${opts.appName} && pnpm action`,\n );\n fs.writeFileSync(agentsPath, content);\n } catch {\n // Non-fatal: leave AGENTS.md unchanged.\n }\n }\n\n if ([\"starter\", \"chat\"].includes(opts.templateName ?? opts.appName)) {\n writeInheritedChatPlugin(appDir, workspaceCoreName, {\n fileName: \"auth.ts\",\n exportName: \"defaultAuthPlugin\",\n });\n writeInheritedChatAgentChatPlugin(appDir, workspaceCoreName, opts.appName);\n }\n}\n\nfunction writeInheritedChatPlugin(\n appDir: string,\n workspaceCoreName: string,\n opts: { fileName: string; exportName: string },\n): void {\n const pluginsDir = path.join(appDir, \"server\", \"plugins\");\n fs.mkdirSync(pluginsDir, { recursive: true });\n const pluginPath = path.join(pluginsDir, opts.fileName);\n fs.writeFileSync(\n pluginPath,\n [\n `import { ${opts.exportName} as frameworkDefault } from \"@agent-native/core/server\";`,\n `import * as workspaceServer from ${JSON.stringify(`${workspaceCoreName}/server`)};`,\n \"\",\n `const workspacePlugin = (workspaceServer as Record<string, unknown>).${opts.exportName};`,\n \"\",\n 'export default typeof workspacePlugin === \"function\"',\n \" ? workspacePlugin\",\n \" : frameworkDefault;\",\n \"\",\n ].join(\"\\n\"),\n );\n}\n\nfunction writeInheritedChatAgentChatPlugin(\n appDir: string,\n workspaceCoreName: string,\n appId: string,\n): void {\n const pluginsDir = path.join(appDir, \"server\", \"plugins\");\n fs.mkdirSync(pluginsDir, { recursive: true });\n const pluginPath = path.join(pluginsDir, \"agent-chat.ts\");\n fs.writeFileSync(\n pluginPath,\n [\n `import {`,\n ` createAgentChatPlugin,`,\n ` loadActionsFromStaticRegistry,`,\n ` type AgentChatPluginOptions,`,\n `} from \"@agent-native/core/server\";`,\n `import * as workspaceServer from ${JSON.stringify(`${workspaceCoreName}/server`)};`,\n `import actionsRegistry from \"../../.generated/actions-registry.js\";`,\n \"\",\n `const createWorkspaceAgentChatPlugin = (workspaceServer as Record<string, unknown>).createWorkspaceAgentChatPlugin;`,\n `const options = {`,\n ` appId: ${JSON.stringify(appId)},`,\n ` actions: loadActionsFromStaticRegistry(actionsRegistry),`,\n `} satisfies AgentChatPluginOptions;`,\n \"\",\n `export default typeof createWorkspaceAgentChatPlugin === \"function\"`,\n ` ? (createWorkspaceAgentChatPlugin as (options: AgentChatPluginOptions) => unknown)(options)`,\n ` : createAgentChatPlugin(options);`,\n \"\",\n ].join(\"\\n\"),\n );\n}\n\n/**\n * Parse a workspace core package name into its npm scope.\n * \"@my-company/shared\" → \"my-company\"\n * \"shared\" → \"\" (no scope — shouldn't happen)\n */\nexport function parseWorkspaceScope(workspaceCoreName: string): string {\n const m = workspaceCoreName.match(/^@([^/]+)\\//);\n return m ? m[1] : \"\";\n}\n"]}
|
|
@@ -908,7 +908,7 @@ function URLSync({ browserTabId }) {
|
|
|
908
908
|
// Replace rather than push so repeated agent URL updates don't
|
|
909
909
|
// clutter the history stack and can't trigger extra remounts from
|
|
910
910
|
// router navigation lifecycle.
|
|
911
|
-
navigate(url, { replace: true });
|
|
911
|
+
navigate(url, { replace: true, flushSync: true });
|
|
912
912
|
}
|
|
913
913
|
catch {
|
|
914
914
|
// Malformed command — ignore.
|