@withandeo/cli 0.19.16 → 0.19.18
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 +3 -1
- package/dist/api.d.ts +1 -1
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +2 -2
- package/dist/api.js.map +1 -1
- package/dist/contracts.d.ts +4 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/main.js +7 -10
- package/dist/main.js.map +1 -1
- package/dist/workflow-coordinator.d.ts.map +1 -1
- package/dist/workflow-coordinator.js +3 -2
- package/dist/workflow-coordinator.js.map +1 -1
- package/package.json +2 -2
- package/skill/publication.json +1 -1
- package/skill/tender-accounts/SKILL.md +11 -0
- package/skill/tender-accounts/references/delivery.md +7 -0
- package/skill/tender-accounts/references/email.md +2 -0
- package/skill/tender-accounts/references/managed-source.md +10 -2
- package/templates/shopify-customer-account/apps/gateway/.tender/artifacts/current/tender-accounts-build.json +99 -0
- package/templates/shopify-customer-account/apps/gateway/.tender/artifacts/current/worker.mjs +1785 -0
- package/templates/shopify-customer-account/apps/gateway/.tender/build/worker.mjs +1785 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-coordinator.d.ts","sourceRoot":"","sources":["../src/workflow-coordinator.ts"],"names":[],"mappings":"AAAA;qEACqE;AACrE,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"workflow-coordinator.d.ts","sourceRoot":"","sources":["../src/workflow-coordinator.ts"],"names":[],"mappings":"AAAA;qEACqE;AACrE,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA8CvF"}
|
|
@@ -14,12 +14,13 @@ export class AndeoCoordinator extends WorkerEntrypoint {
|
|
|
14
14
|
|| (options?.retries && typeof options.retries.delay === "function")) throw new Error("app_workflow_step_options_unsupported");
|
|
15
15
|
const execute = async nativeContext => context.run({ native: nativeContext, call: 0 }, async () => {
|
|
16
16
|
await runtime.observeStep?.(nativeContext, "started").catch(() => undefined);
|
|
17
|
+
const startedAt = Date.now();
|
|
17
18
|
try {
|
|
18
19
|
const result = await callback(nativeContext);
|
|
19
|
-
await runtime.observeStep?.(nativeContext, "completed").catch(() => undefined);
|
|
20
|
+
await runtime.observeStep?.(nativeContext, "completed", Date.now() - startedAt).catch(() => undefined);
|
|
20
21
|
return result;
|
|
21
22
|
} catch (error) {
|
|
22
|
-
await runtime.observeStep?.(nativeContext, "errored").catch(() => undefined);
|
|
23
|
+
await runtime.observeStep?.(nativeContext, "errored", Date.now() - startedAt).catch(() => undefined);
|
|
23
24
|
throw error;
|
|
24
25
|
}
|
|
25
26
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-coordinator.js","sourceRoot":"","sources":["../src/workflow-coordinator.ts"],"names":[],"mappings":"AAAA;qEACqE;AACrE,MAAM,UAAU,yBAAyB,CAAC,SAAiB,EAAE,QAAkB;IAC7E,OAAO;;WAEE,SAAS
|
|
1
|
+
{"version":3,"file":"workflow-coordinator.js","sourceRoot":"","sources":["../src/workflow-coordinator.ts"],"names":[],"mappings":"AAAA;qEACqE;AACrE,MAAM,UAAU,yBAAyB,CAAC,SAAiB,EAAE,QAAkB;IAC7E,OAAO;;WAEE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA4BK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;CAchD,CAAC;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@withandeo/cli",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.18",
|
|
4
4
|
"description": "Developer CLI for Andeo applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"jsonc-parser": "3.3.1",
|
|
41
41
|
"miniflare": "5.20260918.0-alpha",
|
|
42
42
|
"semver": "^7.8.5",
|
|
43
|
-
"smol-toml": "1.
|
|
43
|
+
"smol-toml": "1.9.0"
|
|
44
44
|
},
|
|
45
45
|
"exports": {
|
|
46
46
|
"./cli": "./dist/main.js",
|
package/skill/publication.json
CHANGED
|
@@ -98,6 +98,17 @@ artifact or bypass the isolation gate. Reopen with the returned `sbl_` ID while
|
|
|
98
98
|
the run and derived preview remain authorized. Expiry requires a fresh task and
|
|
99
99
|
its own assigned branch/preview, not reuse of the old bearer.
|
|
100
100
|
|
|
101
|
+
With explicitly enrolled `preview.share`, the same preview command automatically
|
|
102
|
+
resolves the published gateway and returns a separately revocable handoff lasting
|
|
103
|
+
up to seven days, capped by ancestor authority. It survives normal run completion
|
|
104
|
+
and issuing-token expiry. The gateway uses normal customer authentication and
|
|
105
|
+
production APIs; sharing does not log in a customer or authorize additional
|
|
106
|
+
provider mutations. Inspect the returned entry, selection, exact source and
|
|
107
|
+
expiry before handing it over. Use `preview entries` and optional `--through`
|
|
108
|
+
only when entry selection is ambiguous. Existing grants do not gain sharing
|
|
109
|
+
from a task scope override. The stateless preview Worker receives no provider
|
|
110
|
+
credentials, customer cookies, resources or outbound network access.
|
|
111
|
+
|
|
101
112
|
`source.merge` delegates approval for the run's validated source. Keep
|
|
102
113
|
`review.prepare` when requesting an implicit source review through merge.
|
|
103
114
|
Use the existing merge command for the assigned branch or exact permitted
|
|
@@ -133,6 +133,13 @@ npx @withandeo/cli preview open --from sbl_EXAMPLE --return-path /account --json
|
|
|
133
133
|
|
|
134
134
|
Preview entry selection follows published app connections automatically. When the response requires a choice, select an eligible app using `--through prj_ENTRY`. Only the previewed app's developer grant is needed. Private apps cannot open directly; a connection administrator must enable an eligible entry. Preserve the exact `from` ID when recovering from a session error and use `preview open` instead of rebuilding. Opening replaces the browser's previous preview selection and preserves sign-in.
|
|
135
135
|
|
|
136
|
+
Persistent Cloud agents need separately consented `preview.share` for this gateway
|
|
137
|
+
handoff. With it, the same `preview` and `preview open` commands resolve the entry
|
|
138
|
+
server-side and return a link lasting at most seven days independently of normal
|
|
139
|
+
run completion/token expiry. Parent deadlines, revocation, cancellation, current
|
|
140
|
+
connection policy and exact preview retirement remain enforced on public and
|
|
141
|
+
bound requests. Without it, the direct stateless preview remains run-bound.
|
|
142
|
+
|
|
136
143
|
`<delivery-id>` is the `dly_` value returned by `preview`. A `dwf_` value is a production workflow ID and must not be passed to developer-delivery commands. If a merchant administrator sees a `dwf_` publish waiting with zero attempts, the supported recovery is **Activity → Resume exact publish**; it resumes the stored exact composition without rebuilding. Use the error code, request ID, and suggested command from the CLI. Do not retry with altered IDs, another project, or raw HTTP requests.
|
|
137
144
|
|
|
138
145
|
When runtime evidence is needed, stream only the linked project and exact target:
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Email identities and prepared test accounts
|
|
2
2
|
|
|
3
|
+
Persistent Cloud agents require an explicitly selected `email.read` grant. In Persistent agents, enable **Read all merchant inboxes, including QA sign-in emails**, confirm the replacement grant, and update the Cloud environment's bootstrap. If the environment still sets optional `ANDEO_AGENT_SCOPE`, remove it to inherit the renewed grant scope, or include `email.read` in the explicit narrower scope. This permits listing, cursors, messages, reading and waiting across all inboxes in that merchant, even when only one app is selected. It does not permit creating or retiring inboxes. Existing grants do not acquire this capability automatically.
|
|
4
|
+
|
|
3
5
|
Use `andeo email capabilities --json` to inspect `enabled`, `tenantId`, and `permissions`. Email is receive-only and belongs to the merchant, shared across all its apps. Developer access to any app in that merchant grants access to all its inboxes, even for an agent scoped to only one app. Viewers cannot read mail. A tenant member and an authorized agent use the same inboxes through the merchant Email section or CLI. Select the merchant with its login `--profile`; optional `--tenant tn_...` checks that the profile belongs to the intended merchant.
|
|
4
6
|
|
|
5
7
|
## Reuse an identity prepared by a person
|
|
@@ -273,8 +273,16 @@ stated remediation and a newly reviewed request instead.
|
|
|
273
273
|
For reviewed repositories, a moved head invalidates the previous approval and
|
|
274
274
|
the newest source build becomes the next exact snapshot. A moved base makes the
|
|
275
275
|
change stale. Rebase or update the feature branch, push a new committed
|
|
276
|
-
revision,
|
|
277
|
-
|
|
276
|
+
revision, then rerun `source change create --head BRANCH --title TITLE --json`.
|
|
277
|
+
The command refreshes the existing open change for that base/head branch pair:
|
|
278
|
+
its ID, number, title, description and history remain, while the current base/head
|
|
279
|
+
SHAs become a new snapshot and any previous approval is invalidated. Repeating
|
|
280
|
+
the command with unchanged refs preserves the snapshot and approval. A change
|
|
281
|
+
already landing cannot be refreshed. Do not close a stale change just to update
|
|
282
|
+
its base. Wait for the exact head preview, then have the administrator review
|
|
283
|
+
and approve the refreshed snapshot. Closed or landed changes remain terminal;
|
|
284
|
+
creating another review for their branch opens a new change.
|
|
285
|
+
Source landing never calls the production publisher directly;
|
|
278
286
|
after landing, the repository's already configured default-branch policy may
|
|
279
287
|
publish the same artifact after its exact preview and production validation succeed.
|
|
280
288
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "tender.external-app-build/v1",
|
|
3
|
+
"sourceRevision": "ffffffffffffffffffffffffffffffffffffffff",
|
|
4
|
+
"bundleDigest": "e66389b6c7916261dd8989277e73cccc53c361d1796eb481f832b73ecca66eb9",
|
|
5
|
+
"manifest": {
|
|
6
|
+
"schema": "tender.account-artifact/v1",
|
|
7
|
+
"app": {
|
|
8
|
+
"slug": "__APP_SLUG__-gateway",
|
|
9
|
+
"version": "0.1.0",
|
|
10
|
+
"label": "__APP_NAME__ gateway",
|
|
11
|
+
"fixture": false
|
|
12
|
+
},
|
|
13
|
+
"runtime": {
|
|
14
|
+
"kind": "worker",
|
|
15
|
+
"compatibilityDate": "2026-08-25",
|
|
16
|
+
"mainModule": "worker.mjs",
|
|
17
|
+
"assetPrefix": "/_tenant-artifacts/e66389b6c7916261dd8989277e73cccc53c361d1796eb481f832b73ecca66eb9"
|
|
18
|
+
},
|
|
19
|
+
"module": {
|
|
20
|
+
"path": "worker.mjs",
|
|
21
|
+
"sha256": "a4e09ddcd26055ce1305ba6ce2d45e648208338615c2b1e72a0ed9d3ad37fa1e",
|
|
22
|
+
"bytes": 73369,
|
|
23
|
+
"contentType": "application/javascript+module"
|
|
24
|
+
},
|
|
25
|
+
"files": [],
|
|
26
|
+
"health": {
|
|
27
|
+
"path": "/api/health"
|
|
28
|
+
},
|
|
29
|
+
"resources": [
|
|
30
|
+
{
|
|
31
|
+
"type": "d1",
|
|
32
|
+
"name": "APP_DB"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"services": [
|
|
36
|
+
{
|
|
37
|
+
"name": "PORTAL_UI",
|
|
38
|
+
"targetProject": "__APP_SLUG__-portal-ui"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"vars": {
|
|
42
|
+
"ACCOUNT_PROJECT_ID": "prj_replace_me",
|
|
43
|
+
"ACCOUNT_RUNTIME_BASE_DOMAIN": "tenderprompt.dev",
|
|
44
|
+
"ACCOUNT_TENANT_ID": "ten_replace_me",
|
|
45
|
+
"SHOPIFY_CUSTOMER_ACCOUNT_CLIENT_ID": "replace_me",
|
|
46
|
+
"SHOPIFY_CUSTOMER_ACCOUNT_DOMAIN": "shopify.com",
|
|
47
|
+
"SHOPIFY_STOREFRONT_DOMAIN": "example.myshopify.com"
|
|
48
|
+
},
|
|
49
|
+
"databaseSchema": {
|
|
50
|
+
"schema": "tender.d1-schema/v1",
|
|
51
|
+
"statements": [
|
|
52
|
+
"CREATE TABLE IF NOT EXISTS public_customer_auth_flows (\n project_id TEXT NOT NULL,\n state_digest TEXT NOT NULL,\n browser_binding_digest TEXT NOT NULL,\n client_key_digest TEXT NOT NULL,\n interaction_mode TEXT NOT NULL,\n pkce_verifier TEXT NOT NULL,\n return_hostname TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL,\n consumed_at INTEGER,\n PRIMARY KEY (project_id, state_digest),\n CHECK (length(project_id) BETWEEN 2 AND 128),\n CHECK (length(state_digest) = 64),\n CHECK (state_digest NOT GLOB '*[^0-9a-f]*'),\n CHECK (length(browser_binding_digest) = 64),\n CHECK (browser_binding_digest NOT GLOB '*[^0-9a-f]*'),\n CHECK (length(client_key_digest) = 64),\n CHECK (client_key_digest NOT GLOB '*[^0-9a-f]*'),\n CHECK (interaction_mode IN ('interactive', 'silent')),\n CHECK (length(pkce_verifier) BETWEEN 43 AND 128),\n CHECK (length(return_hostname) BETWEEN 1 AND 253),\n CHECK (return_hostname = lower(return_hostname)),\n CHECK (expires_at > created_at),\n CHECK (consumed_at IS NULL OR consumed_at BETWEEN created_at AND expires_at)\n )",
|
|
53
|
+
"CREATE INDEX IF NOT EXISTS public_customer_auth_flows_by_expiry\n ON public_customer_auth_flows (expires_at)",
|
|
54
|
+
"CREATE TABLE IF NOT EXISTS public_customer_auth_sessions (\n project_id TEXT NOT NULL,\n session_digest TEXT NOT NULL,\n audience_hostname TEXT NOT NULL,\n session_data TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL,\n PRIMARY KEY (project_id, session_digest),\n CHECK (length(project_id) BETWEEN 2 AND 128),\n CHECK (length(session_digest) = 64),\n CHECK (session_digest NOT GLOB '*[^0-9a-f]*'),\n CHECK (length(audience_hostname) BETWEEN 1 AND 253),\n CHECK (audience_hostname = lower(audience_hostname)),\n CHECK (length(session_data) BETWEEN 1 AND 65536),\n CHECK (expires_at > created_at)\n )",
|
|
55
|
+
"CREATE INDEX IF NOT EXISTS public_customer_auth_sessions_by_expiry\n ON public_customer_auth_sessions (expires_at)",
|
|
56
|
+
"CREATE TABLE IF NOT EXISTS public_customer_auth_handoffs (\n project_id TEXT NOT NULL,\n handoff_digest TEXT NOT NULL,\n return_hostname TEXT NOT NULL,\n session_digest TEXT NOT NULL,\n session_seal TEXT NOT NULL,\n created_at INTEGER NOT NULL,\n expires_at INTEGER NOT NULL,\n claimed_at INTEGER,\n PRIMARY KEY (project_id, handoff_digest),\n CHECK (length(project_id) BETWEEN 2 AND 128),\n CHECK (length(handoff_digest) = 64),\n CHECK (handoff_digest NOT GLOB '*[^0-9a-f]*'),\n CHECK (length(return_hostname) BETWEEN 1 AND 253),\n CHECK (return_hostname = lower(return_hostname)),\n CHECK (length(session_digest) = 64),\n CHECK (session_digest NOT GLOB '*[^0-9a-f]*'),\n CHECK (length(session_seal) BETWEEN 80 AND 100000),\n CHECK (expires_at > created_at),\n CHECK (claimed_at IS NULL OR claimed_at BETWEEN created_at AND expires_at)\n )",
|
|
57
|
+
"CREATE INDEX IF NOT EXISTS public_customer_auth_handoffs_by_expiry\n ON public_customer_auth_handoffs (expires_at)"
|
|
58
|
+
],
|
|
59
|
+
"objects": [
|
|
60
|
+
{
|
|
61
|
+
"type": "table",
|
|
62
|
+
"name": "public_customer_auth_flows",
|
|
63
|
+
"tableName": "public_customer_auth_flows",
|
|
64
|
+
"statementIndex": 0
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"type": "index",
|
|
68
|
+
"name": "public_customer_auth_flows_by_expiry",
|
|
69
|
+
"tableName": "public_customer_auth_flows",
|
|
70
|
+
"statementIndex": 1
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"type": "table",
|
|
74
|
+
"name": "public_customer_auth_sessions",
|
|
75
|
+
"tableName": "public_customer_auth_sessions",
|
|
76
|
+
"statementIndex": 2
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"type": "index",
|
|
80
|
+
"name": "public_customer_auth_sessions_by_expiry",
|
|
81
|
+
"tableName": "public_customer_auth_sessions",
|
|
82
|
+
"statementIndex": 3
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"type": "table",
|
|
86
|
+
"name": "public_customer_auth_handoffs",
|
|
87
|
+
"tableName": "public_customer_auth_handoffs",
|
|
88
|
+
"statementIndex": 4
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"type": "index",
|
|
92
|
+
"name": "public_customer_auth_handoffs_by_expiry",
|
|
93
|
+
"tableName": "public_customer_auth_handoffs",
|
|
94
|
+
"statementIndex": 5
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|