@tenderprompt/accounts 0.2.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.
Files changed (90) hide show
  1. package/README.md +84 -0
  2. package/dist/api.d.ts +27 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +73 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/artifact.d.ts +8 -0
  7. package/dist/artifact.d.ts.map +1 -0
  8. package/dist/artifact.js +205 -0
  9. package/dist/artifact.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +4 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/contracts.d.ts +96 -0
  15. package/dist/contracts.d.ts.map +1 -0
  16. package/dist/contracts.js +5 -0
  17. package/dist/contracts.js.map +1 -0
  18. package/dist/errors.d.ts +10 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +19 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/files.d.ts +21 -0
  23. package/dist/files.d.ts.map +1 -0
  24. package/dist/files.js +263 -0
  25. package/dist/files.js.map +1 -0
  26. package/dist/index.d.ts +4 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +4 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/main.d.ts +15 -0
  31. package/dist/main.d.ts.map +1 -0
  32. package/dist/main.js +565 -0
  33. package/dist/main.js.map +1 -0
  34. package/dist/processes.d.ts +12 -0
  35. package/dist/processes.d.ts.map +1 -0
  36. package/dist/processes.js +44 -0
  37. package/dist/processes.js.map +1 -0
  38. package/dist/starter.d.ts +20 -0
  39. package/dist/starter.d.ts.map +1 -0
  40. package/dist/starter.js +159 -0
  41. package/dist/starter.js.map +1 -0
  42. package/package.json +32 -0
  43. package/skill/tender-accounts/SKILL.md +111 -0
  44. package/templates/shopify-customer-account/AGENTS.md +14 -0
  45. package/templates/shopify-customer-account/README.md +44 -0
  46. package/templates/shopify-customer-account/apps/gateway/AGENTS.md +9 -0
  47. package/templates/shopify-customer-account/apps/gateway/README.md +9 -0
  48. package/templates/shopify-customer-account/apps/gateway/database-schema.json +49 -0
  49. package/templates/shopify-customer-account/apps/gateway/dot.dev.vars.example +11 -0
  50. package/templates/shopify-customer-account/apps/gateway/migrations/0001_customer_auth.sql +76 -0
  51. package/templates/shopify-customer-account/apps/gateway/package.json +25 -0
  52. package/templates/shopify-customer-account/apps/gateway/scripts/build-worker.mjs +15 -0
  53. package/templates/shopify-customer-account/apps/gateway/scripts/pack-tender-artifact.mjs +84 -0
  54. package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/hostname-policy.ts +66 -0
  55. package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/schema.ts +90 -0
  56. package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/session-store.ts +864 -0
  57. package/templates/shopify-customer-account/apps/gateway/src/platform/customer-auth/shopify-route-adapter.ts +1157 -0
  58. package/templates/shopify-customer-account/apps/gateway/src/platform/runtime-hostname.ts +46 -0
  59. package/templates/shopify-customer-account/apps/gateway/src/portal-service.test.ts +18 -0
  60. package/templates/shopify-customer-account/apps/gateway/src/portal-service.ts +51 -0
  61. package/templates/shopify-customer-account/apps/gateway/src/runtime-config.test.ts +30 -0
  62. package/templates/shopify-customer-account/apps/gateway/src/runtime-config.ts +56 -0
  63. package/templates/shopify-customer-account/apps/gateway/src/worker.ts +85 -0
  64. package/templates/shopify-customer-account/apps/gateway/tender-accounts.json +10 -0
  65. package/templates/shopify-customer-account/apps/gateway/tender-app.config.json +40 -0
  66. package/templates/shopify-customer-account/apps/gateway/tsconfig.json +13 -0
  67. package/templates/shopify-customer-account/apps/gateway/vitest.config.ts +8 -0
  68. package/templates/shopify-customer-account/apps/gateway/worker-configuration.d.ts +26 -0
  69. package/templates/shopify-customer-account/apps/gateway/wrangler.jsonc +42 -0
  70. package/templates/shopify-customer-account/apps/portal/AGENTS.md +9 -0
  71. package/templates/shopify-customer-account/apps/portal/README.md +5 -0
  72. package/templates/shopify-customer-account/apps/portal/index.html +13 -0
  73. package/templates/shopify-customer-account/apps/portal/package.json +33 -0
  74. package/templates/shopify-customer-account/apps/portal/scripts/build-worker.mjs +11 -0
  75. package/templates/shopify-customer-account/apps/portal/scripts/pack-tender-artifact.mjs +63 -0
  76. package/templates/shopify-customer-account/apps/portal/scripts/portal-worker.mjs +84 -0
  77. package/templates/shopify-customer-account/apps/portal/scripts/portal-worker.test.mjs +14 -0
  78. package/templates/shopify-customer-account/apps/portal/src/App.tsx +111 -0
  79. package/templates/shopify-customer-account/apps/portal/src/main.tsx +10 -0
  80. package/templates/shopify-customer-account/apps/portal/src/styles.css +54 -0
  81. package/templates/shopify-customer-account/apps/portal/tender-accounts.json +10 -0
  82. package/templates/shopify-customer-account/apps/portal/tender-app.config.json +19 -0
  83. package/templates/shopify-customer-account/apps/portal/tsconfig.json +14 -0
  84. package/templates/shopify-customer-account/apps/portal/vite.config.ts +7 -0
  85. package/templates/shopify-customer-account/apps/portal/worker-configuration.d.ts +11 -0
  86. package/templates/shopify-customer-account/apps/portal/wrangler.jsonc +22 -0
  87. package/templates/shopify-customer-account/dot.dev.vars.example +3 -0
  88. package/templates/shopify-customer-account/dot.gitignore +9 -0
  89. package/templates/shopify-customer-account/package.json +22 -0
  90. package/templates/shopify-customer-account/scripts/artifact-contract.mjs +109 -0
package/dist/files.js ADDED
@@ -0,0 +1,263 @@
1
+ import { constants } from "node:fs";
2
+ import { lstat, mkdir, open, stat, writeFile } from "node:fs/promises";
3
+ import { dirname, isAbsolute, parse, relative, resolve, sep } from "node:path";
4
+ import { CLI_CONFIG_SCHEMA, CLI_LINK_SCHEMA, } from "./contracts.js";
5
+ import { CliError } from "./errors.js";
6
+ const CONFIG_FILENAME = "tender-accounts.json";
7
+ const LINK_FILENAME = ".tender/link.json";
8
+ export async function loadProjectContext(startDirectory) {
9
+ const root = resolve(startDirectory);
10
+ const configPath = resolve(root, CONFIG_FILENAME);
11
+ const config = parseProjectConfig(await readUtf8(configPath, 64 * 1024, "Tender Accounts configuration"));
12
+ const linkPath = resolve(root, LINK_FILENAME);
13
+ let link = null;
14
+ try {
15
+ link = parseProjectLink(await readUtf8(linkPath, 8 * 1024, "Tender Accounts project link"));
16
+ }
17
+ catch (error) {
18
+ if (!(error instanceof CliError && error.code === "file_missing"))
19
+ throw error;
20
+ }
21
+ return { root, configPath, config, linkPath, link };
22
+ }
23
+ export function parseProjectConfig(value) {
24
+ const candidate = parseJsonRecord(value, "Tender Accounts configuration");
25
+ if (candidate.schema !== CLI_CONFIG_SCHEMA || !isRecord(candidate.commands)) {
26
+ throw new CliError("config_invalid", `The ${CONFIG_FILENAME} file does not use ${CLI_CONFIG_SCHEMA}.`, "Run tender-accounts config example to see the required shape.");
27
+ }
28
+ const check = requiredCommand(candidate.commands.check, "commands.check");
29
+ const packageCommand = requiredCommand(candidate.commands.package, "commands.package");
30
+ const dev = optionalCommand(candidate.commands.dev, "commands.dev");
31
+ const artifactDirectory = safeRelativeDirectory(candidate.artifactDirectory, "artifactDirectory");
32
+ const returnPath = candidate.returnPath === undefined ? "/account" : safeReturnPath(candidate.returnPath);
33
+ return {
34
+ schema: CLI_CONFIG_SCHEMA,
35
+ commands: { ...(dev ? { dev } : {}), check, package: packageCommand },
36
+ artifactDirectory,
37
+ returnPath,
38
+ };
39
+ }
40
+ export function parseProjectLink(value) {
41
+ const candidate = parseJsonRecord(value, "Tender Accounts project link");
42
+ if (candidate.schema !== CLI_LINK_SCHEMA) {
43
+ throw new CliError("link_invalid", `The ${LINK_FILENAME} file uses an unsupported schema.`);
44
+ }
45
+ return {
46
+ schema: CLI_LINK_SCHEMA,
47
+ projectId: requiredProjectId(candidate.projectId),
48
+ apiUrl: normalizeApiUrl(candidate.apiUrl),
49
+ };
50
+ }
51
+ export async function writeProjectLink(root, link) {
52
+ const path = resolve(root, LINK_FILENAME);
53
+ const directory = dirname(path);
54
+ await mkdir(directory, { recursive: true });
55
+ const directoryEntry = await lstat(directory);
56
+ if (directoryEntry.isSymbolicLink() || !directoryEntry.isDirectory()) {
57
+ throw new CliError("link_path_unsafe", "The .tender directory must be a regular directory owned by this checkout.");
58
+ }
59
+ try {
60
+ const existing = await lstat(path);
61
+ if (existing.isSymbolicLink() || !existing.isFile()) {
62
+ throw new CliError("link_path_unsafe", "The existing .tender/link.json path is not a regular file.");
63
+ }
64
+ }
65
+ catch (error) {
66
+ if (!isMissingFile(error))
67
+ throw error;
68
+ }
69
+ await writeFile(path, `${JSON.stringify(link, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
70
+ return path;
71
+ }
72
+ export async function readToken(root, environment, stdin) {
73
+ if (stdin) {
74
+ const chunks = [];
75
+ for await (const chunk of stdin)
76
+ chunks.push(Buffer.from(chunk));
77
+ const value = Buffer.concat(chunks).toString("utf8").trim();
78
+ if (!value)
79
+ throw new CliError("authentication_required", "--token-stdin received no credential.");
80
+ return validateToken(value);
81
+ }
82
+ if (environment.TENDER_ACCOUNTS_TOKEN)
83
+ return validateToken(environment.TENDER_ACCOUNTS_TOKEN);
84
+ for (const directory of await credentialDirectories(root)) {
85
+ try {
86
+ const dotenv = await readUtf8(resolve(directory, ".dev.vars"), 256 * 1024, ".dev.vars");
87
+ for (const line of dotenv.split(/\r?\n/u)) {
88
+ const match = /^TENDER_ACCOUNTS_TOKEN=(.*)$/u.exec(line.trim());
89
+ if (match?.[1])
90
+ return validateToken(unquote(match[1].trim()));
91
+ }
92
+ }
93
+ catch (error) {
94
+ if (!(error instanceof CliError && error.code === "file_missing"))
95
+ throw error;
96
+ }
97
+ }
98
+ throw new CliError("authentication_required", "No Tender Accounts agent credential was found.", "Put TENDER_ACCOUNTS_TOKEN in the app's ignored .dev.vars file or protected environment.");
99
+ }
100
+ async function credentialDirectories(root) {
101
+ const start = resolve(root);
102
+ const candidates = [start];
103
+ let cursor = start;
104
+ for (let depth = 0; depth < 12; depth += 1) {
105
+ if (await pathExists(resolve(cursor, ".git")))
106
+ return candidates;
107
+ const parent = dirname(cursor);
108
+ if (parent === cursor || parent === parse(cursor).root)
109
+ break;
110
+ cursor = parent;
111
+ candidates.push(cursor);
112
+ }
113
+ return [start];
114
+ }
115
+ export function validateToken(value) {
116
+ const token = value.trim();
117
+ if (!/^ta_agent_agc_[A-Za-z0-9_-]{24}\.[A-Za-z0-9_-]{43}$/u.test(token)) {
118
+ throw new CliError("credential_invalid", "TENDER_ACCOUNTS_TOKEN is not a valid project-scoped credential.");
119
+ }
120
+ return token;
121
+ }
122
+ export function normalizeApiUrl(value) {
123
+ if (typeof value !== "string")
124
+ throw new CliError("api_url_invalid", "The Tender Accounts API URL is invalid.");
125
+ let url;
126
+ try {
127
+ url = new URL(value);
128
+ }
129
+ catch {
130
+ throw new CliError("api_url_invalid", "The Tender Accounts API URL is invalid.");
131
+ }
132
+ const loopback = url.hostname === "localhost" || url.hostname === "127.0.0.1" || url.hostname === "::1";
133
+ if (url.protocol !== "https:" && !(loopback && url.protocol === "http:")) {
134
+ throw new CliError("api_url_invalid", "The agent API must use HTTPS except on loopback.");
135
+ }
136
+ if (url.username || url.password || url.search || url.hash) {
137
+ throw new CliError("api_url_invalid", "The agent API URL cannot contain credentials, query parameters, or fragments.");
138
+ }
139
+ return url.toString().replace(/\/$/u, "");
140
+ }
141
+ export function resolveArtifactDirectory(context) {
142
+ const directory = resolve(context.root, context.config.artifactDirectory);
143
+ assertWithin(context.root, directory, "artifactDirectory");
144
+ return directory;
145
+ }
146
+ export async function readBoundedFile(path, maximumBytes) {
147
+ let entry;
148
+ try {
149
+ entry = await lstat(path);
150
+ }
151
+ catch (error) {
152
+ if (isMissingFile(error))
153
+ throw new CliError("file_missing", `Required file was not found at ${path}.`);
154
+ throw error;
155
+ }
156
+ if (entry.isSymbolicLink() || !entry.isFile()) {
157
+ throw new CliError("artifact_path_unsafe", `Artifact path is not a regular file: ${path}`);
158
+ }
159
+ if (entry.size > maximumBytes) {
160
+ throw new CliError("artifact_file_too_large", `Artifact file exceeds ${maximumBytes} bytes: ${path}`);
161
+ }
162
+ const handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
163
+ try {
164
+ return new Uint8Array(await handle.readFile());
165
+ }
166
+ finally {
167
+ await handle.close();
168
+ }
169
+ }
170
+ export async function pathExists(path) {
171
+ try {
172
+ await stat(path);
173
+ return true;
174
+ }
175
+ catch (error) {
176
+ if (isMissingFile(error))
177
+ return false;
178
+ throw error;
179
+ }
180
+ }
181
+ export function safeArtifactPath(root, path) {
182
+ if (!isSafeRelativePath(path)) {
183
+ throw new CliError("artifact_path_unsafe", `Artifact contains an unsafe path: ${path}`);
184
+ }
185
+ const absolute = resolve(root, path);
186
+ assertWithin(root, absolute, "artifact path");
187
+ return absolute;
188
+ }
189
+ export function requiredProjectId(value) {
190
+ if (typeof value !== "string" || !/^prj_[A-Za-z0-9_-]{8,64}$/u.test(value)) {
191
+ throw new CliError("project_id_invalid", "The Tender Accounts project ID is invalid.");
192
+ }
193
+ return value;
194
+ }
195
+ function safeRelativeDirectory(value, label) {
196
+ if (typeof value !== "string" || !isSafeRelativePath(value) || isAbsolute(value)) {
197
+ throw new CliError("config_invalid", `${label} must be a safe relative directory.`);
198
+ }
199
+ return value.replace(/\/$/u, "");
200
+ }
201
+ function isSafeRelativePath(value) {
202
+ if (!value || value.length > 512 || value.startsWith("/") || value.includes("\\") || value.includes("%"))
203
+ return false;
204
+ return value.split("/").every((segment) => (segment.length > 0 && segment !== "." && segment !== ".." && /^[A-Za-z0-9._-]+$/u.test(segment)));
205
+ }
206
+ function safeReturnPath(value) {
207
+ if (typeof value !== "string" || !value.startsWith("/") || value.startsWith("//") || value.length > 512
208
+ || /[\r\n\\]/u.test(value)) {
209
+ throw new CliError("config_invalid", "returnPath must be a safe same-origin absolute path.");
210
+ }
211
+ return value;
212
+ }
213
+ function requiredCommand(value, label) {
214
+ if (typeof value !== "string" || value.trim().length < 2 || value.length > 1000 || /[\r\n\0]/u.test(value)) {
215
+ throw new CliError("config_invalid", `${label} must be one non-empty command line.`);
216
+ }
217
+ return value.trim();
218
+ }
219
+ function optionalCommand(value, label) {
220
+ return value === undefined ? undefined : requiredCommand(value, label);
221
+ }
222
+ function parseJsonRecord(value, label) {
223
+ let candidate;
224
+ try {
225
+ candidate = JSON.parse(value);
226
+ }
227
+ catch {
228
+ throw new CliError("config_invalid", `${label} is not valid JSON.`);
229
+ }
230
+ if (!isRecord(candidate))
231
+ throw new CliError("config_invalid", `${label} must be a JSON object.`);
232
+ return candidate;
233
+ }
234
+ function isRecord(value) {
235
+ return typeof value === "object" && value !== null && !Array.isArray(value);
236
+ }
237
+ function assertWithin(root, candidate, label) {
238
+ const suffix = relative(resolve(root), resolve(candidate));
239
+ if (!suffix || suffix.startsWith(`..${sep}`) || suffix === ".." || isAbsolute(suffix)) {
240
+ throw new CliError("path_unsafe", `The ${label} must stay inside the app directory.`);
241
+ }
242
+ }
243
+ async function readUtf8(path, maximumBytes, label) {
244
+ try {
245
+ return new TextDecoder("utf-8", { fatal: true }).decode(await readBoundedFile(path, maximumBytes));
246
+ }
247
+ catch (error) {
248
+ if (error instanceof CliError && error.code === "file_missing") {
249
+ throw new CliError("file_missing", `${label} was not found at ${path}.`);
250
+ }
251
+ throw error;
252
+ }
253
+ }
254
+ function unquote(value) {
255
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
256
+ return value.slice(1, -1);
257
+ }
258
+ return value;
259
+ }
260
+ function isMissingFile(value) {
261
+ return value instanceof Error && "code" in value && value.code === "ENOENT";
262
+ }
263
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { CLI_VERSION, runCli, type CliRuntime } from "./main.js";
2
+ export { parseBuildEnvelope, verifyArtifact } from "./artifact.js";
3
+ export { parseProjectConfig, parseProjectLink } from "./files.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { CLI_VERSION, runCli } from "./main.js";
2
+ export { parseBuildEnvelope, verifyArtifact } from "./artifact.js";
3
+ export { parseProjectConfig, parseProjectLink } from "./files.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAmB,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { captureCommand, runProjectCommand } from "./processes.js";
2
+ export declare const CLI_VERSION = "0.2.0";
3
+ export interface CliRuntime {
4
+ cwd: string;
5
+ environment: NodeJS.ProcessEnv;
6
+ stdin: NodeJS.ReadableStream;
7
+ stdout: Pick<NodeJS.WriteStream, "write">;
8
+ stderr: Pick<NodeJS.WriteStream, "write">;
9
+ fetcher: typeof fetch;
10
+ sleep(milliseconds: number): Promise<void>;
11
+ runProjectCommand: typeof runProjectCommand;
12
+ captureCommand: typeof captureCommand;
13
+ }
14
+ export declare function runCli(argv: string[], overrides?: Partial<CliRuntime>): Promise<number>;
15
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnE,eAAO,MAAM,WAAW,UAAU,CAAC;AAcnC,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO,KAAK,CAAC;IACtB,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,iBAAiB,EAAE,OAAO,iBAAiB,CAAC;IAC5C,cAAc,EAAE,OAAO,cAAc,CAAC;CACvC;AAcD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,OAAO,CAAC,UAAU,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BjG"}