@withandeo/cli 0.19.17 → 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.
@@ -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,CA6CvF"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;yBA2BK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;CAchD,CAAC;AACF,CAAC"}
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.17",
3
+ "version": "0.19.18",
4
4
  "description": "Developer CLI for Andeo applications",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -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, wait for its exact preview, and have the administrator review that
277
- new snapshot. Source landing never calls the production publisher directly;
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
+ }