@somewhere-tech/cli 0.33.11 → 0.34.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -7
- package/dist/commands/advisor.js +1 -1
- package/dist/commands/advisor.js.map +1 -1
- package/dist/commands/api.js +12 -5
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/auth.js +7 -7
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/browser.js +2 -2
- package/dist/commands/browser.js.map +1 -1
- package/dist/commands/call.js +1 -1
- package/dist/commands/call.js.map +1 -1
- package/dist/commands/catalog.js +1 -1
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/check.js +123 -9
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/cron.js +12 -9
- package/dist/commands/cron.js.map +1 -1
- package/dist/commands/db.js +3 -3
- package/dist/commands/db.js.map +1 -1
- package/dist/commands/deploy.js +54 -18
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.js +47 -15
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/docs.js +3 -3
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/email.js +11 -8
- package/dist/commands/email.js.map +1 -1
- package/dist/commands/env.js +13 -5
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/errors.js +2 -2
- package/dist/commands/errors.js.map +1 -1
- package/dist/commands/feedback.js +1 -1
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/fs.js +14 -8
- package/dist/commands/fs.js.map +1 -1
- package/dist/commands/git.js +3 -3
- package/dist/commands/git.js.map +1 -1
- package/dist/commands/grep.js +1 -1
- package/dist/commands/grep.js.map +1 -1
- package/dist/commands/init.js +20 -8
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logs.js +1 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/mcp.js +10 -5
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/open.js +1 -1
- package/dist/commands/open.js.map +1 -1
- package/dist/commands/postgres.js +2 -2
- package/dist/commands/postgres.js.map +1 -1
- package/dist/commands/project.js +12 -12
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/promote.js +13 -3
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/pull.js +2 -2
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/rollback.js +3 -3
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/run.js +11 -4
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/tasks.js +1 -1
- package/dist/commands/tasks.js.map +1 -1
- package/dist/commands/usage.js +5 -3
- package/dist/commands/usage.js.map +1 -1
- package/dist/commands/verify.js +3 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/client.js +7 -0
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/config.js +16 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/declared-data.js +53 -1
- package/dist/lib/declared-data.js.map +1 -1
- package/dist/lib/frontend-dev.js +46 -0
- package/dist/lib/frontend-dev.js.map +1 -1
- package/dist/lib/init-agent-guide.js +26 -27
- package/dist/lib/init-agent-guide.js.map +1 -1
- package/dist/lib/init-auth-template.js +230 -0
- package/dist/lib/init-auth-template.js.map +1 -0
- package/dist/lib/init-green-template.js +8 -29
- package/dist/lib/init-green-template.js.map +1 -1
- package/dist/lib/output.js +42 -2
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/platform-tools.js +30 -2
- package/dist/lib/platform-tools.js.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"declared-data.js","sourceRoot":"","sources":["../../src/lib/declared-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAC5C,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAClD,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,6DAA6D,CAAC;
|
|
1
|
+
{"version":3,"file":"declared-data.js","sourceRoot":"","sources":["../../src/lib/declared-data.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/frontend-dev.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { realpathSync } from 'node:fs';
|
|
3
|
+
import { createConnection, createServer as createNetServer } from 'node:net';
|
|
3
4
|
import { join } from 'node:path';
|
|
4
5
|
import { pathToFileURL } from 'node:url';
|
|
5
6
|
import { declaredDataPlugin } from './declared-data.js';
|
|
@@ -68,6 +69,42 @@ export function frontendProxy(target, localOrigin) {
|
|
|
68
69
|
},
|
|
69
70
|
};
|
|
70
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* `localhost` resolves to ::1 first on many machines, and Vite binds exactly one
|
|
74
|
+
* address, so a browser opening http://localhost:<port> could be refused while
|
|
75
|
+
* the server sat on 127.0.0.1. Relay the IPv6 loopback to the IPv4 one so both
|
|
76
|
+
* families reach the same server — loopback only, never a wildcard address.
|
|
77
|
+
* Resolves null where the machine has no IPv6 loopback.
|
|
78
|
+
*/
|
|
79
|
+
export async function relayIpv6Loopback(port) {
|
|
80
|
+
const sockets = new Set();
|
|
81
|
+
const relay = createNetServer((client) => {
|
|
82
|
+
const upstream = createConnection({ host: '127.0.0.1', port });
|
|
83
|
+
for (const socket of [client, upstream]) {
|
|
84
|
+
sockets.add(socket);
|
|
85
|
+
socket.on('close', () => sockets.delete(socket));
|
|
86
|
+
}
|
|
87
|
+
client.pipe(upstream).pipe(client);
|
|
88
|
+
client.on('error', () => upstream.destroy());
|
|
89
|
+
upstream.on('error', () => client.destroy());
|
|
90
|
+
});
|
|
91
|
+
// An open HMR socket must not hold the relay (and so `somewhere dev`) open.
|
|
92
|
+
const closeRelay = relay.close.bind(relay);
|
|
93
|
+
relay.close = (callback) => {
|
|
94
|
+
for (const socket of sockets)
|
|
95
|
+
socket.destroy();
|
|
96
|
+
return closeRelay(callback);
|
|
97
|
+
};
|
|
98
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
99
|
+
relay.once('error', (error) => {
|
|
100
|
+
if (error.code === 'EADDRNOTAVAIL' || error.code === 'EAFNOSUPPORT')
|
|
101
|
+
resolvePromise(null);
|
|
102
|
+
else
|
|
103
|
+
rejectPromise(error);
|
|
104
|
+
});
|
|
105
|
+
relay.listen({ host: '::1', port, ipv6Only: true }, () => resolvePromise(relay));
|
|
106
|
+
});
|
|
107
|
+
}
|
|
71
108
|
export async function startFrontendDev(cwd, target, port = 8787, open = false) {
|
|
72
109
|
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
73
110
|
throw new Error('Port must be an integer from 1 through 65535.');
|
|
@@ -107,6 +144,14 @@ export async function startFrontendDev(cwd, target, port = 8787, open = false) {
|
|
|
107
144
|
await server.close();
|
|
108
145
|
throw error;
|
|
109
146
|
}
|
|
147
|
+
let relay;
|
|
148
|
+
try {
|
|
149
|
+
relay = await relayIpv6Loopback(port);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
await server.close();
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
110
155
|
console.log(`Frontend hot reload: ${localOrigin}`);
|
|
111
156
|
console.log(`API requests use the deployed backend: ${origin}`);
|
|
112
157
|
console.log('Backend changes require somewhere deploy or somewhere preview.');
|
|
@@ -114,6 +159,7 @@ export async function startFrontendDev(cwd, target, port = 8787, open = false) {
|
|
|
114
159
|
server.close = async () => {
|
|
115
160
|
process.removeListener('SIGINT', close);
|
|
116
161
|
process.removeListener('SIGTERM', close);
|
|
162
|
+
await new Promise((resolvePromise) => (relay ? relay.close(() => resolvePromise()) : resolvePromise()));
|
|
117
163
|
return closeServer();
|
|
118
164
|
};
|
|
119
165
|
const close = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend-dev.js","sourceRoot":"","sources":["../../src/lib/frontend-dev.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"frontend-dev.js","sourceRoot":"","sources":["../../src/lib/frontend-dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,36 +2,35 @@
|
|
|
2
2
|
// docs lint byte-compares this value when SOMEWHERE_CLI_REPO points here.
|
|
3
3
|
export const AGENT_WORKFLOW = `## Getting started — build, deploy, verify
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
\`shared()\` (cross-user rows), or \`serverOnly()\`, and add a \`client\` block for
|
|
7
|
-
browser access. See \`docs({ topic: 'declared-data' })\`.
|
|
8
|
-
2. Add a \`tsconfig.json\` for TypeScript source, then run \`somewhere typecheck\`.
|
|
9
|
-
The CLI generates declaration types from \`db/schema.ts\`; it does not need
|
|
10
|
-
hand-written module stubs. See the complete files in \`/start.txt\`.
|
|
11
|
-
3. Deploy raw source with \`somewhere deploy\`; do not build first. The CLI links
|
|
12
|
-
the directory to the project it created.
|
|
13
|
-
4. Write a \`flow.json\` that submits data and checks the rendered result. From
|
|
14
|
-
the linked directory run \`somewhere verify --flow flow.json\` to exercise it
|
|
15
|
-
at desktop and phone sizes. \`/start.txt\` includes a working flow.
|
|
5
|
+
The loop, after every change:
|
|
16
6
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
7
|
+
1. \`somewhere deploy\` — raw source; do not build first. It prints the live URL.
|
|
8
|
+
2. \`somewhere verify\` — the live app at desktop and phone sizes, with
|
|
9
|
+
screenshots and console/network health. \`somewhere verify --flow flow.json\`
|
|
10
|
+
fills and clicks (\`/start.txt\` has a flow); \`somewhere browser\` inspects a page.
|
|
11
|
+
3. \`somewhere logs --tail 10\`, then \`somewhere errors\` (claimed project,
|
|
12
|
+
signed in): read the failure before guessing.
|
|
13
|
+
4. Email flows: sign up as \`<name>@<subdomain>.test.somewhere.site\`, then
|
|
14
|
+
\`somewhere email test-inbox <addr>\` prints the message and its magic link.
|
|
22
15
|
|
|
23
|
-
|
|
16
|
+
Default build path, in order:
|
|
17
|
+
1. Sign-in (\`somewhere init\` writes it): \`api/auth/[...path].ts\` is
|
|
18
|
+
\`export { somewhereAuth as default } from '@somewhere-tech/sdk/server'\`;
|
|
19
|
+
the page calls \`createSomewhereAuth()\` from \`@somewhere-tech/sdk/auth\`.
|
|
20
|
+
2. Data: tables in \`db/schema.ts\` — \`owner()\` (own rows), \`shared()\` or
|
|
21
|
+
\`serverOnly()\` — with a \`client\` block; the page reads and writes them
|
|
22
|
+
through \`somewhere:data\` (\`docs({ topic: 'declared-data' })\`).
|
|
23
|
+
3. Counts and groups: \`data.<table>.aggregate\` (\`sw.db.aggregate\` server-side).
|
|
24
|
+
4. A function only when a business rule needs the server:
|
|
25
|
+
\`sw.endpoint({ auth, body, rateLimit, handler })\`.
|
|
24
26
|
|
|
25
|
-
|
|
26
|
-
\`Promise.all\`
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
\`https://somewhere.tech/start.txt\`; uncertain architecture or composition:
|
|
33
|
-
\`somewhere advisor "<question>"\`. Without a shell: MCP \`docs({ topic })\`,
|
|
34
|
-
\`advisor({ question })\`; \`catalog\` finds tools.
|
|
27
|
+
\`somewhere typecheck\` generates the types for \`sw\` and your tables. Independent
|
|
28
|
+
reads go in one \`Promise.all\`. \`owner()\` tables need no auth guard; a custom
|
|
29
|
+
endpoint enforces its own caller policy. \`somewhere docs <topic>\` for a
|
|
30
|
+
contract; \`somewhere advisor "<question>"\` for uncertain architecture (MCP:
|
|
31
|
+
\`docs({ topic })\`, \`advisor({ question })\`, \`catalog\`). \`somewhere dev\` is
|
|
32
|
+
optional local UI work; \`somewhere cron run <id> --wait\` runs a scheduled job
|
|
33
|
+
(plain \`cron run\` only queues it).
|
|
35
34
|
|
|
36
35
|
No account yet? \`npx @somewhere-tech/cli deploy\` publishes a temporary app and
|
|
37
36
|
prints its live URL, claim URL, and expiry. On a hosted VM, after consent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-agent-guide.js","sourceRoot":"","sources":["../../src/lib/init-agent-guide.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG
|
|
1
|
+
{"version":3,"file":"init-agent-guide.js","sourceRoot":"","sources":["../../src/lib/init-agent-guide.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmCb,CAAC;AAElB,MAAM,CAAC,MAAM,cAAc,GAAG,wCAAwC,cAAc,IAAI,CAAC;AACzF,MAAM,CAAC,MAAM,cAAc,GAAG,4CAA4C,CAAC"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { INIT_AGENTS_MD, INIT_CLAUDE_MD } from './init-agent-guide.js';
|
|
2
|
+
// The default `somewhere init` starter: cookie sign-in through the SDK client
|
|
3
|
+
// and the SDK's packaged /api/auth handler, plus one protected endpoint.
|
|
4
|
+
// `--template minimal` keeps the no-auth starter (init-green-template.ts).
|
|
5
|
+
const PACKAGE_JSON = `{
|
|
6
|
+
"name": "somewhere-starter",
|
|
7
|
+
"private": true,
|
|
8
|
+
"version": "0.1.0",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"scripts": {
|
|
11
|
+
"dev": "somewhere dev",
|
|
12
|
+
"typecheck": "somewhere typecheck"
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@somewhere-tech/sdk": "0.8.0",
|
|
16
|
+
"react": "19.2.7",
|
|
17
|
+
"react-dom": "19.2.7"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/react": "19.2.2",
|
|
21
|
+
"@types/react-dom": "19.2.2",
|
|
22
|
+
"typescript": "5.9.3",
|
|
23
|
+
"vite": "7.2.2"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
`;
|
|
27
|
+
const TSCONFIG = `{
|
|
28
|
+
"compilerOptions": {
|
|
29
|
+
"target": "ES2022",
|
|
30
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
31
|
+
"strict": true,
|
|
32
|
+
"noEmit": true,
|
|
33
|
+
"skipLibCheck": true,
|
|
34
|
+
"module": "ESNext",
|
|
35
|
+
"moduleResolution": "Bundler",
|
|
36
|
+
"isolatedModules": true,
|
|
37
|
+
"jsx": "react-jsx"
|
|
38
|
+
},
|
|
39
|
+
"include": ["src", "api", "db", "types"]
|
|
40
|
+
}
|
|
41
|
+
`;
|
|
42
|
+
const APP_TYPES = `export interface GreetingResponse {
|
|
43
|
+
message: string;
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
const SCHEMA = `import { id, schema, serverOnly, table, text } from 'somewhere/db';
|
|
47
|
+
|
|
48
|
+
export default schema({
|
|
49
|
+
greetings: table({
|
|
50
|
+
id: id(),
|
|
51
|
+
message: text({ default: 'You are signed in.' }),
|
|
52
|
+
}, {
|
|
53
|
+
scope: serverOnly(),
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
`;
|
|
57
|
+
const AUTH_API = `export { somewhereAuth as default } from '@somewhere-tech/sdk/server';
|
|
58
|
+
`;
|
|
59
|
+
const GREETING_API = `export default sw.endpoint({
|
|
60
|
+
auth: 'required',
|
|
61
|
+
rateLimit: '30/minute',
|
|
62
|
+
handler: async ({ user }, sw) => {
|
|
63
|
+
const result = await sw.db.from('greetings', { limit: 1 });
|
|
64
|
+
const message = result.data[0]?.message;
|
|
65
|
+
return { message: \`\${typeof message === 'string' ? message : 'You are signed in.'} (\${user.email ?? user.id})\` };
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
`;
|
|
69
|
+
const AUTH_SERVICE = `import { createSomewhereAuth, type User } from '@somewhere-tech/sdk/auth';
|
|
70
|
+
|
|
71
|
+
// Talks to api/auth/[...path].ts. The session is an httpOnly cookie; this
|
|
72
|
+
// code never sees a token.
|
|
73
|
+
export const auth = createSomewhereAuth();
|
|
74
|
+
export type { User };
|
|
75
|
+
`;
|
|
76
|
+
const GREETING_SERVICE = `import type { GreetingResponse } from '../../types/app';
|
|
77
|
+
|
|
78
|
+
export async function loadGreeting(): Promise<GreetingResponse> {
|
|
79
|
+
const response = await fetch('/api/greeting', { credentials: 'include' });
|
|
80
|
+
const body = (await response.json().catch(() => ({}))) as Partial<GreetingResponse> & { message?: string };
|
|
81
|
+
if (!response.ok) throw new Error(body.message ?? \`Request failed (\${response.status})\`);
|
|
82
|
+
return { message: body.message ?? '' };
|
|
83
|
+
}
|
|
84
|
+
`;
|
|
85
|
+
const APP = `import { useEffect, useState, type FormEvent } from 'react';
|
|
86
|
+
import { auth, type User } from './services/auth';
|
|
87
|
+
import { loadGreeting } from './services/greeting';
|
|
88
|
+
|
|
89
|
+
export function App() {
|
|
90
|
+
const [user, setUser] = useState<User | null>(auth.getCachedUser());
|
|
91
|
+
const [checking, setChecking] = useState(true);
|
|
92
|
+
const [mode, setMode] = useState<'signIn' | 'signUp'>('signIn');
|
|
93
|
+
const [email, setEmail] = useState('');
|
|
94
|
+
const [password, setPassword] = useState('');
|
|
95
|
+
const [error, setError] = useState('');
|
|
96
|
+
const [message, setMessage] = useState('');
|
|
97
|
+
|
|
98
|
+
useEffect(() => {
|
|
99
|
+
void auth.getUser().then(setUser).finally(() => setChecking(false));
|
|
100
|
+
}, []);
|
|
101
|
+
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (!user) return;
|
|
104
|
+
void loadGreeting()
|
|
105
|
+
.then((result) => setMessage(result.message))
|
|
106
|
+
.catch((reason: unknown) => setMessage(reason instanceof Error ? reason.message : 'Could not load the greeting.'));
|
|
107
|
+
}, [user]);
|
|
108
|
+
|
|
109
|
+
async function submit(event: FormEvent<HTMLFormElement>) {
|
|
110
|
+
event.preventDefault();
|
|
111
|
+
setError('');
|
|
112
|
+
try {
|
|
113
|
+
const next = mode === 'signIn'
|
|
114
|
+
? await auth.signIn({ email, password })
|
|
115
|
+
: await auth.signUp({ email, password });
|
|
116
|
+
setUser(next);
|
|
117
|
+
} catch (reason: unknown) {
|
|
118
|
+
setError(reason instanceof Error ? reason.message : 'Sign-in failed.');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
async function signOut() {
|
|
123
|
+
await auth.signOut();
|
|
124
|
+
setUser(null);
|
|
125
|
+
setMessage('');
|
|
126
|
+
setMode('signIn');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (checking && !user) return <main><p className="hint">Loading…</p></main>;
|
|
130
|
+
|
|
131
|
+
if (user) {
|
|
132
|
+
return (
|
|
133
|
+
<main>
|
|
134
|
+
<p className="eyebrow">somewhere.tech starter</p>
|
|
135
|
+
<h1>You are signed in.</h1>
|
|
136
|
+
<p className="message">{message || 'Loading your greeting…'}</p>
|
|
137
|
+
<button type="button" onClick={() => void signOut()}>Sign out</button>
|
|
138
|
+
</main>
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
<main>
|
|
144
|
+
<p className="eyebrow">somewhere.tech starter</p>
|
|
145
|
+
<h1>{mode === 'signIn' ? 'Sign in' : 'Create an account'}</h1>
|
|
146
|
+
<form onSubmit={(event) => void submit(event)}>
|
|
147
|
+
<label>Email<input type="email" name="email" autoComplete="email" required value={email} onChange={(event) => setEmail(event.target.value)} /></label>
|
|
148
|
+
<label>Password<input type="password" name="password" autoComplete={mode === 'signIn' ? 'current-password' : 'new-password'} required minLength={8} value={password} onChange={(event) => setPassword(event.target.value)} /></label>
|
|
149
|
+
{error ? <p className="error" role="alert">{error}</p> : null}
|
|
150
|
+
<button type="submit">{mode === 'signIn' ? 'Sign in' : 'Create account'}</button>
|
|
151
|
+
</form>
|
|
152
|
+
<button type="button" className="link" onClick={() => { setMode(mode === 'signIn' ? 'signUp' : 'signIn'); setError(''); }}>
|
|
153
|
+
{mode === 'signIn' ? 'New here? Create an account' : 'Have an account? Sign in'}
|
|
154
|
+
</button>
|
|
155
|
+
</main>
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
`;
|
|
159
|
+
const MAIN = `import { StrictMode } from 'react';
|
|
160
|
+
import { createRoot } from 'react-dom/client';
|
|
161
|
+
import { App } from './App';
|
|
162
|
+
import './styles.css';
|
|
163
|
+
|
|
164
|
+
createRoot(document.getElementById('root')!).render(
|
|
165
|
+
<StrictMode>
|
|
166
|
+
<App />
|
|
167
|
+
</StrictMode>,
|
|
168
|
+
);
|
|
169
|
+
`;
|
|
170
|
+
const STYLES = `:root {
|
|
171
|
+
font-family: Inter, ui-sans-serif, system-ui, sans-serif;
|
|
172
|
+
color: #17201c;
|
|
173
|
+
background: #edf4ef;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
* { box-sizing: border-box; }
|
|
177
|
+
body { margin: 0; min-width: 320px; }
|
|
178
|
+
main { width: min(480px, calc(100% - 32px)); margin: 12vh auto; }
|
|
179
|
+
h1 { margin: 12px 0 24px; font-size: clamp(2.2rem, 7vw, 3.6rem); line-height: 1; letter-spacing: -.04em; }
|
|
180
|
+
.eyebrow { color: #14734c; font-weight: 750; text-transform: uppercase; letter-spacing: .12em; }
|
|
181
|
+
form { display: grid; gap: 14px; }
|
|
182
|
+
label { display: grid; gap: 6px; font-weight: 600; }
|
|
183
|
+
input { padding: 12px 14px; border: 1px solid #c6d8ce; border-radius: 10px; font: inherit; }
|
|
184
|
+
button { padding: 12px 16px; border: 0; border-radius: 10px; background: #14734c; color: #fff; font: inherit; font-weight: 650; cursor: pointer; }
|
|
185
|
+
button.link { margin-top: 12px; padding: 0; background: none; color: #0e6542; }
|
|
186
|
+
.message { padding: 20px 22px; border: 1px solid #c6d8ce; border-radius: 16px; background: rgba(255, 255, 255, .82); }
|
|
187
|
+
.error { margin: 0; color: #a3261b; }
|
|
188
|
+
.hint { color: #4f665b; }
|
|
189
|
+
`;
|
|
190
|
+
const README = `# somewhere.tech starter
|
|
191
|
+
|
|
192
|
+
This project starts signed in: a React page signs users up and in with the
|
|
193
|
+
SDK client (\`src/services/auth.ts\`), \`api/auth/[...path].ts\` is the SDK's
|
|
194
|
+
packaged auth handler, and \`api/greeting.ts\` is a protected endpoint
|
|
195
|
+
(\`sw.endpoint({ auth: 'required' })\`). The session is an httpOnly cookie.
|
|
196
|
+
|
|
197
|
+
\`\`\`sh
|
|
198
|
+
somewhere typecheck
|
|
199
|
+
somewhere deploy
|
|
200
|
+
somewhere verify
|
|
201
|
+
\`\`\`
|
|
202
|
+
|
|
203
|
+
Deploy the raw source. The platform compiles it; do not create or deploy a
|
|
204
|
+
\`dist/\` or \`build/\` directory. For a starter without sign-in, run
|
|
205
|
+
\`somewhere init --template minimal\` in an empty directory.
|
|
206
|
+
`;
|
|
207
|
+
export function createAuthTemplate() {
|
|
208
|
+
return [
|
|
209
|
+
{ path: '.gitignore', content: 'node_modules\ndist\nbuild\n.env\n' },
|
|
210
|
+
{ path: 'AGENTS.md', content: INIT_AGENTS_MD },
|
|
211
|
+
{ path: 'CLAUDE.md', content: INIT_CLAUDE_MD },
|
|
212
|
+
{ path: 'README.md', content: README },
|
|
213
|
+
{ path: 'package.json', content: PACKAGE_JSON },
|
|
214
|
+
{ path: 'tsconfig.json', content: TSCONFIG },
|
|
215
|
+
{
|
|
216
|
+
path: 'index.html',
|
|
217
|
+
content: '<!doctype html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n <title>somewhere.tech starter</title>\n </head>\n <body>\n <div id="root"></div>\n <script type="module" src="/src/main.tsx"></script>\n </body>\n</html>\n',
|
|
218
|
+
},
|
|
219
|
+
{ path: 'src/App.tsx', content: APP },
|
|
220
|
+
{ path: 'src/main.tsx', content: MAIN },
|
|
221
|
+
{ path: 'src/services/auth.ts', content: AUTH_SERVICE },
|
|
222
|
+
{ path: 'src/services/greeting.ts', content: GREETING_SERVICE },
|
|
223
|
+
{ path: 'src/styles.css', content: STYLES },
|
|
224
|
+
{ path: 'api/auth/[...path].ts', content: AUTH_API },
|
|
225
|
+
{ path: 'api/greeting.ts', content: GREETING_API },
|
|
226
|
+
{ path: 'db/schema.ts', content: SCHEMA },
|
|
227
|
+
{ path: 'types/app.ts', content: APP_TYPES },
|
|
228
|
+
];
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=init-auth-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-auth-template.js","sourceRoot":"","sources":["../../src/lib/init-auth-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,8EAA8E;AAC9E,yEAAyE;AACzE,2EAA2E;AAE3E,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBpB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;CAUd,CAAC;AAEF,MAAM,QAAQ,GAAG;CAChB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;CASpB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;CAMpB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;CAQxB,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEX,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;CAUZ,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;CAmBd,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;CAgBd,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mCAAmC,EAAE;QACpE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE;QAC/C,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC5C;YACE,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,mUAAmU;SAC7U;QACD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE;QACrC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,EAAE;QACvD,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,gBAAgB,EAAE;QAC/D,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3C,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,QAAQ,EAAE;QACpD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE;QAClD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -39,18 +39,6 @@ const APP_TYPES = `export interface GreetingResponse {
|
|
|
39
39
|
message: string;
|
|
40
40
|
}
|
|
41
41
|
`;
|
|
42
|
-
const RUNTIME_TYPES = `export interface QueryResult<T> {
|
|
43
|
-
data: T[];
|
|
44
|
-
count: number;
|
|
45
|
-
changes: number;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface SomewhereRuntime {
|
|
49
|
-
db: {
|
|
50
|
-
from<T>(table: string, options: { limit: number }): Promise<QueryResult<T>>;
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
`;
|
|
54
42
|
const SCHEMA = `import { id, schema, serverOnly, table, text } from 'somewhere/db';
|
|
55
43
|
|
|
56
44
|
export default schema({
|
|
@@ -62,22 +50,14 @@ export default schema({
|
|
|
62
50
|
}),
|
|
63
51
|
});
|
|
64
52
|
`;
|
|
65
|
-
const API = `
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
sw: SomewhereRuntime,
|
|
74
|
-
): Promise<Response> {
|
|
75
|
-
const result = await sw.db.from<GreetingRow>('greetings', { limit: 1 });
|
|
76
|
-
|
|
77
|
-
return Response.json({
|
|
78
|
-
message: result.data[0]?.message ?? 'Your full-stack app is ready.',
|
|
79
|
-
});
|
|
80
|
-
}
|
|
53
|
+
const API = `export default sw.endpoint({
|
|
54
|
+
auth: 'none',
|
|
55
|
+
handler: async (_input, sw) => {
|
|
56
|
+
const result = await sw.db.from('greetings', { limit: 1 });
|
|
57
|
+
const message = result.data[0]?.message;
|
|
58
|
+
return { message: typeof message === 'string' ? message : 'Your full-stack app is ready.' };
|
|
59
|
+
},
|
|
60
|
+
});
|
|
81
61
|
`;
|
|
82
62
|
const SERVICE = `import type { GreetingResponse } from '../../types/app';
|
|
83
63
|
|
|
@@ -173,7 +153,6 @@ export function createGreenTemplate() {
|
|
|
173
153
|
{ path: 'api/greeting.ts', content: API },
|
|
174
154
|
{ path: 'db/schema.ts', content: SCHEMA },
|
|
175
155
|
{ path: 'types/app.ts', content: APP_TYPES },
|
|
176
|
-
{ path: 'types/runtime.ts', content: RUNTIME_TYPES },
|
|
177
156
|
];
|
|
178
157
|
}
|
|
179
158
|
//# sourceMappingURL=init-green-template.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-green-template.js","sourceRoot":"","sources":["../../src/lib/init-green-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;CAoBpB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"init-green-template.js","sourceRoot":"","sources":["../../src/lib/init-green-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;CAoBpB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;CAUd,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;CAQX,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;;;CAOf,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBX,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;CAUZ,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;CAcd,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;CAgBd,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mCAAmC,EAAE;QACpE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE;QAC/C,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC5C;YACE,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,mUAAmU;SAC7U;QACD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE;QACrC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,OAAO,EAAE;QACtD,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3C,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;KAC7C,CAAC;AACJ,CAAC"}
|
package/dist/lib/output.js
CHANGED
|
@@ -18,9 +18,49 @@ export const cyan = ansi('\x1b[36m', '\x1b[39m');
|
|
|
18
18
|
export function success(msg) {
|
|
19
19
|
console.log(`${green('✓')} ${msg}`);
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* The platform's own refusal, exactly as it should reach `--json`.
|
|
23
|
+
*
|
|
24
|
+
* Both error types that carry one (the API's CliApiError and an MCP tool's
|
|
25
|
+
* PlatformToolError) are matched by shape rather than imported: output.ts sits
|
|
26
|
+
* below client.ts in the import graph. Anything else — a bad flag, a missing
|
|
27
|
+
* file — originated in the CLI and has no code of its own.
|
|
28
|
+
*/
|
|
29
|
+
export function platformErrorEnvelope(cause) {
|
|
30
|
+
if (!(cause instanceof Error))
|
|
31
|
+
return null;
|
|
32
|
+
if (cause.name !== 'CliApiError' && cause.name !== 'PlatformToolError')
|
|
33
|
+
return null;
|
|
34
|
+
const typed = cause;
|
|
35
|
+
if (typeof typed.code !== 'string' || !typed.code)
|
|
36
|
+
return null;
|
|
37
|
+
const meta = typed.meta ?? {};
|
|
38
|
+
return {
|
|
39
|
+
code: typed.code,
|
|
40
|
+
message: typeof typed.detail === 'string' ? typed.detail : typed.message,
|
|
41
|
+
extra: {
|
|
42
|
+
...(typeof typed.hint === 'string' && typed.hint ? { hint: typed.hint } : {}),
|
|
43
|
+
...(meta.requestId ? { request_id: meta.requestId } : {}),
|
|
44
|
+
...(meta.traceId ? { trace_id: meta.traceId } : {}),
|
|
45
|
+
...(typeof meta.retry === 'boolean' ? { retry: meta.retry } : {}),
|
|
46
|
+
...(typeof meta.retryAfterMs === 'number' ? { retry_after_ms: meta.retryAfterMs } : {}),
|
|
47
|
+
...(typed.data && typeof typed.data === 'object' ? { data: typed.data } : {}),
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Print a failure. `cause` is the error behind it, when there is one: in
|
|
53
|
+
* `--json` mode a platform refusal keeps its own code, message, hint and
|
|
54
|
+
* request id, and only a failure that began in the CLI says CLI_ERROR.
|
|
55
|
+
*/
|
|
56
|
+
export function error(msg, cause) {
|
|
22
57
|
if (jsonOutputMode) {
|
|
23
|
-
if (
|
|
58
|
+
if (jsonErrorWritten)
|
|
59
|
+
return;
|
|
60
|
+
const platform = platformErrorEnvelope(cause);
|
|
61
|
+
if (platform)
|
|
62
|
+
printJsonError(platform.code, platform.message, platform.extra);
|
|
63
|
+
else
|
|
24
64
|
printJsonError('CLI_ERROR', stripAnsi(msg));
|
|
25
65
|
return;
|
|
26
66
|
}
|
package/dist/lib/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,IAAI,cAAc,GAAG,KAAK,CAAC;AAC3B,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAE7B,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,cAAc,GAAG,OAAO,CAAC;IACzB,gBAAgB,GAAG,KAAK,CAAC;AAC3B,CAAC;AAED,MAAM,QAAQ,GAAG,GAAY,EAAE,CAC7B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAEzD,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACvC,OAAO,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAC/C,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAChD,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAEjD,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,20 @@ const MCP_BASE_URL = process.env.SOMEWHERE_MCP_URL?.replace(/\/$/, '') || 'https
|
|
|
5
5
|
let isSdkAuthError = () => false;
|
|
6
6
|
export class PlatformToolError extends Error {
|
|
7
7
|
tool;
|
|
8
|
-
|
|
8
|
+
code;
|
|
9
|
+
detail;
|
|
10
|
+
hint;
|
|
11
|
+
meta;
|
|
12
|
+
constructor(tool, message,
|
|
13
|
+
/** The platform's own error code, message, fix and request id, when the
|
|
14
|
+
* tool answered with its JSON envelope — `message` above flattens them. */
|
|
15
|
+
code, detail, hint, meta = {}) {
|
|
9
16
|
super(message);
|
|
10
17
|
this.tool = tool;
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.detail = detail;
|
|
20
|
+
this.hint = hint;
|
|
21
|
+
this.meta = meta;
|
|
11
22
|
this.name = 'PlatformToolError';
|
|
12
23
|
}
|
|
13
24
|
}
|
|
@@ -116,6 +127,23 @@ function textFromResult(result) {
|
|
|
116
127
|
.map((block) => block.text)
|
|
117
128
|
.join('\n');
|
|
118
129
|
}
|
|
130
|
+
export function platformToolErrorFromText(name, text) {
|
|
131
|
+
const message = toolErrorMessage(text);
|
|
132
|
+
try {
|
|
133
|
+
const parsed = JSON.parse(text);
|
|
134
|
+
const field = (key) => typeof parsed[key] === 'string' && parsed[key] ? parsed[key] : undefined;
|
|
135
|
+
const code = field('error');
|
|
136
|
+
if (!code)
|
|
137
|
+
return new PlatformToolError(name, message);
|
|
138
|
+
return new PlatformToolError(name, message, code, field('message') ?? text, field('next_step') ?? field('hint'), {
|
|
139
|
+
requestId: field('request_id'),
|
|
140
|
+
traceId: field('trace_id'),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return new PlatformToolError(name, message);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
119
147
|
function toolErrorMessage(text) {
|
|
120
148
|
try {
|
|
121
149
|
const parsed = JSON.parse(text);
|
|
@@ -139,7 +167,7 @@ export async function callPlatformToolRaw(name, args, options = {}) {
|
|
|
139
167
|
const result = await withPlatformClient(options, (client) => client.callTool({ name, arguments: invocationArgs }));
|
|
140
168
|
const typed = result;
|
|
141
169
|
if (typed.isError) {
|
|
142
|
-
throw
|
|
170
|
+
throw platformToolErrorFromText(name, textFromResult(typed));
|
|
143
171
|
}
|
|
144
172
|
return typed;
|
|
145
173
|
}
|