run402 3.1.0 → 3.3.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/lib/functions.mjs CHANGED
@@ -87,12 +87,12 @@ Notes:
87
87
  export default async (req: Request) => Response
88
88
  Deploy may require payment if the project lease has expired.
89
89
 
90
- The deploy response includes:
91
- - runtime_version: the bundled @run402/functions version (e.g. "1.48.0")
92
- - deps_resolved: map of each --deps name to the actually-installed
93
- concrete version (e.g. {"lodash":"4.17.21"})
94
- - warnings (optional, top-level, sibling to the record): non-fatal
95
- notes such as bundle-size advisories
90
+ Deploy routes through the unified apply engine (functions.patch.set), not
91
+ a legacy admin route. The result sets runtime_version and deps_resolved to
92
+ null (apply returns release-level data, not per-function build metadata) -
93
+ read the resolved versions from 'run402 functions list', whose records
94
+ carry both. The result still includes an optional top-level warnings:
95
+ string[] for non-fatal notes such as bundle-size advisories.
96
96
 
97
97
  Examples:
98
98
  run402 functions deploy prj_abc123 stripe-webhook --file handler.ts
package/lib/transfer.mjs CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  positionalArgs,
11
11
  } from "./argparse.mjs";
12
12
 
13
- const HELP = `run402 transfer — Two-party project transfer (v1.59)
13
+ const HELP = `run402 transfer — Project transfer, one noun for both recipient kinds (v1.93+)
14
14
 
15
15
  Usage:
16
16
  run402 transfer init --to <wallet|email> [--project <id>] [--billing-policy migrate] [--message <text>] [--kysigned <record_id>] [--retain-collaborator developer]
@@ -18,22 +18,22 @@ Usage:
18
18
  run402 transfer list [--incoming | --outgoing] [--limit N] [--offset N]
19
19
  run402 transfer accept <transfer_id>
20
20
  run402 transfer claim <transfer_id> [--into <organization_id>] [--accept-retained-collaborator]
21
- run402 transfer cancel <transfer_id> [--reason <text>] [--handoff]
21
+ run402 transfer cancel <transfer_id> [--reason <text>]
22
22
 
23
23
  Subcommands:
24
- init Initiate ownership change. --to <wallet> = two-party wallet transfer;
25
- --to <email> = email->org handoff (the recipient claims it).
26
- preview Fetch the safe review document (add --handoff for an email handoff)
27
- list List pending transfers (incoming default, --outgoing, or --handoffs)
28
- accept Accept an incoming wallet transfer (your wallet must be the to_wallet)
29
- claim Claim an incoming email handoff into an org (--into <id>; omit = new org)
30
- cancel Cancel a pending transfer/handoff (--handoff routes to a handoff)
24
+ init Initiate ownership change. --to <wallet> = two-party wallet transfer
25
+ (completed by 'accept'); --to <email> = email->org transfer (completed by 'claim').
26
+ preview Fetch the safe review document (wallet or email kind-agnostic)
27
+ list List pending transfers (incoming default, or --outgoing) — both kinds, unioned
28
+ accept Accept an incoming WALLET transfer (your wallet must be the to_wallet)
29
+ claim Claim an incoming EMAIL transfer into an org (--into <id>; omit = new org)
30
+ cancel Cancel a pending transfer of either kind
31
31
 
32
32
  Notes:
33
33
  - Owner-side mutations on a project with a pending transfer return 409
34
34
  PROJECT_HAS_PENDING_TRANSFER. Cancel the transfer or wait 72h for expiry.
35
35
  - Phase 1A supports only billing_policy=migrate (default).
36
- - Secret VALUES are inherited by the recipient on accept; rotation is advised.
36
+ - Secret VALUES are inherited by the recipient on completion; rotation is advised.
37
37
  - GitHub repo ownership is NOT transferred — handle that out of band.
38
38
  `;
39
39
 
@@ -45,17 +45,18 @@ Usage:
45
45
 
46
46
  Options:
47
47
  --project <id> Project id (defaults to the active project)
48
- --to <wallet> Recipient wallet (required). Any case; lowercased server-side.
49
- --billing-policy <p> Billing policy. Phase 1A only allows 'migrate' (default).
48
+ --to <wallet|email> Recipient (required). A wallet uses the two-party rail (completed by
49
+ 'accept'); an email uses the email->org rail (completed by 'claim').
50
+ --billing-policy <p> Billing policy (wallet rail). Phase 1A only allows 'migrate' (default).
50
51
  --message <text> Optional note shown to the recipient in preview + emails.
51
- --kysigned <record_id> Optional KySigned record id (Phase 1A: informational only).
52
- --retain-collaborator <role> Email handoffs only (v1.91): keep a 'developer' membership in
53
- the recipient's org after handoff. The recipient must accept it at
52
+ --kysigned <record_id> Optional KySigned record id (wallet rail; Phase 1A: informational only).
53
+ --retain-collaborator <role> Email recipients only (v1.91): keep a 'developer' membership in
54
+ the recipient's org after the transfer. The recipient must accept it at
54
55
  claim (--accept-retained-collaborator); omit for full severance.
55
56
 
56
57
  Notes:
57
- - Caller's wallet must currently own the project (gateway re-checks fresh DB).
58
- - Owner-side mutations on the project are frozen until accept/cancel/expiry.
58
+ - Caller's wallet/session must currently own or admin the project (gateway re-checks fresh DB).
59
+ - Owner-side mutations on the project are frozen until accept/claim/cancel/expiry.
59
60
  - The project lease stays with your organization; it is NOT refunded.
60
61
  `,
61
62
  preview: `run402 transfer preview — Fetch the preview document
@@ -64,21 +65,25 @@ Usage:
64
65
  run402 transfer preview <transfer_id>
65
66
 
66
67
  Returns project name, custom domains, subdomains, function names, secret NAMES
67
- (values are never returned), CI bindings that will be revoked on accept, and
68
- billing implications. Either the from_wallet or the to_wallet may preview.
68
+ (values are never returned), CI bindings that will be revoked on completion, and
69
+ billing implications. Works for both wallet- and email-addressed transfers; any
70
+ party to the transfer may preview.
69
71
  `,
70
72
  list: `run402 transfer list — List pending transfers
71
73
 
72
74
  Usage:
73
75
  run402 transfer list [--incoming | --outgoing] [--limit N] [--offset N]
74
76
 
77
+ Lists both wallet- and email-addressed transfers, unioned; each row carries
78
+ recipient_kind.
79
+
75
80
  Options:
76
- --incoming List transfers OFFERED TO your wallet (default).
77
- --outgoing List transfers INITIATED BY your wallet.
81
+ --incoming List transfers OFFERED TO you (default).
82
+ --outgoing List transfers INITIATED BY you.
78
83
  --limit N Page size (default 50).
79
84
  --offset N Pagination offset (default 0).
80
85
  `,
81
- accept: `run402 transfer accept — Accept an incoming transfer
86
+ accept: `run402 transfer accept — Accept an incoming WALLET transfer
82
87
 
83
88
  Usage:
84
89
  run402 transfer accept <transfer_id>
@@ -86,24 +91,26 @@ Usage:
86
91
  Your wallet must equal the transfer's to_wallet. The accept transaction
87
92
  atomically: flips ownership, revokes the previous owner's CI bindings on the
88
93
  project, enqueues notifications to both parties, and stamps a
89
- 'secrets_rotation_advised' advisory on the project.
94
+ 'secrets_rotation_advised' advisory on the project. (Email transfers complete
95
+ via 'claim', not 'accept'.)
90
96
  `,
91
97
  cancel: `run402 transfer cancel — Cancel a pending transfer
92
98
 
93
99
  Usage:
94
- run402 transfer cancel <transfer_id> [--reason <text>] [--handoff]
100
+ run402 transfer cancel <transfer_id> [--reason <text>]
95
101
 
96
- Either the from_wallet or the to_wallet may cancel. Already-processed
97
- transfers return 409 TRANSFER_ALREADY_PROCESSED. Pass --handoff to cancel an
98
- email->org handoff instead of a wallet transfer.
102
+ Cancels a pending transfer of either kind. You must be authorized for the row's
103
+ kind (a wallet signing party, or an owner/admin of the offering org / the
104
+ addressed-email principal). Already-processed transfers return 409
105
+ TRANSFER_ALREADY_PROCESSED.
99
106
  `,
100
- claim: `run402 transfer claim — Claim an incoming email handoff
107
+ claim: `run402 transfer claim — Claim an incoming EMAIL transfer
101
108
 
102
109
  Usage:
103
110
  run402 transfer claim <transfer_id> [--into <organization_id>] [--accept-retained-collaborator]
104
111
 
105
- Claims a handoff addressed to your email into an org you own. Omit --into to
106
- claim into a brand-new org. This is the email-handoff analog of 'accept'.
112
+ Claims an email-addressed transfer into an org you own. Omit --into to claim into
113
+ a brand-new org. This is the email analog of 'accept'.
107
114
 
108
115
  Options:
109
116
  --into <organization_id> Org to claim into (omit = brand-new org).
@@ -123,9 +130,9 @@ async function init(args) {
123
130
  if (extra.length > 0) {
124
131
  fail({ code: "BAD_USAGE", message: `Unexpected argument for transfer init: ${extra[0]}` });
125
132
  }
126
- const toWallet = flagValue(parsedArgs, "--to");
127
- if (!toWallet) {
128
- fail({ code: "BAD_USAGE", message: "Missing --to <wallet>" });
133
+ const to = flagValue(parsedArgs, "--to");
134
+ if (!to) {
135
+ fail({ code: "BAD_USAGE", message: "Missing --to <wallet|email>" });
129
136
  }
130
137
  const projectFlag = flagValue(parsedArgs, "--project");
131
138
  const projectId = await resolveProjectId(projectFlag);
@@ -144,17 +151,18 @@ async function init(args) {
144
151
  const kysigned = flagValue(parsedArgs, "--kysigned");
145
152
  const retainCollaborator = flagValue(parsedArgs, "--retain-collaborator");
146
153
 
147
- // One noun, two rails: an email recipient routes to the email->org handoff;
148
- // a wallet recipient routes to the two-party wallet transfer.
149
- const isEmail = toWallet.includes("@");
154
+ // One noun, two rails: an email recipient routes to the email->org completion
155
+ // ('claim'); a wallet recipient routes to the two-party wallet completion
156
+ // ('accept'). Both initiate on the SAME endpoint, discriminated by the body.
157
+ const isEmail = to.includes("@");
150
158
 
151
- // --retain-collaborator (v1.91) is a handoff-only opt-in: the sender keeps a
159
+ // --retain-collaborator (v1.91) is an email-only opt-in: the sender keeps a
152
160
  // developer membership in the recipient's org (recipient must accept at claim).
153
161
  if (retainCollaborator !== null) {
154
162
  if (!isEmail) {
155
163
  fail({
156
164
  code: "BAD_FLAG",
157
- message: "--retain-collaborator applies only to email handoffs; a wallet --to uses the two-party transfer rail.",
165
+ message: "--retain-collaborator applies only to email recipients; a wallet --to uses the two-party transfer rail.",
158
166
  details: { flag: "--retain-collaborator" },
159
167
  });
160
168
  }
@@ -167,21 +175,20 @@ async function init(args) {
167
175
  }
168
176
  }
169
177
 
170
- allowanceAuthHeaders(
171
- isEmail ? `/projects/v1/${projectId}/handoffs` : `/projects/v1/${projectId}/transfers`,
172
- );
178
+ // Both kinds initiate on the unified transfer endpoint — sign that path.
179
+ allowanceAuthHeaders(`/projects/v1/${projectId}/transfers`);
173
180
 
174
181
  try {
175
182
  const res = isEmail
176
- ? await getSdk().admin.transfers.initiateHandoff({
183
+ ? await getSdk().admin.transfers.initiate({
177
184
  projectId,
178
- toEmail: toWallet,
185
+ toEmail: to,
179
186
  message: message ?? undefined,
180
187
  retainCollaborator: retainCollaborator ? { role: retainCollaborator } : undefined,
181
188
  })
182
189
  : await getSdk().admin.transfers.initiate({
183
190
  projectId,
184
- toWallet,
191
+ toWallet: to,
185
192
  billingPolicy: billingPolicy ?? undefined,
186
193
  message: message ?? undefined,
187
194
  kysignedRecordId: kysigned ?? undefined,
@@ -194,19 +201,17 @@ async function init(args) {
194
201
 
195
202
  async function preview(args) {
196
203
  const parsedArgs = normalizeArgv(args);
197
- assertKnownFlags(parsedArgs, ["--handoff", "--help", "-h"]);
204
+ assertKnownFlags(parsedArgs, ["--help", "-h"]);
198
205
  const positionals = positionalArgs(parsedArgs);
199
206
  if (positionals.length !== 1) {
200
- fail({ code: "BAD_USAGE", message: "Usage: run402 transfer preview <transfer_id> [--handoff]" });
207
+ fail({ code: "BAD_USAGE", message: "Usage: run402 transfer preview <transfer_id>" });
201
208
  }
202
209
  const transferId = positionals[0];
203
- const handoff = parsedArgs.includes("--handoff");
204
- allowanceAuthHeaders(`/agent/v1/${handoff ? "handoffs" : "transfers"}/${transferId}`);
210
+ // Preview is kind-agnostic — one route serves wallet and email transfers.
211
+ allowanceAuthHeaders(`/agent/v1/transfers/${transferId}`);
205
212
 
206
213
  try {
207
- const data = handoff
208
- ? await getSdk().admin.transfers.previewHandoff(transferId)
209
- : await getSdk().admin.transfers.preview(transferId);
214
+ const data = await getSdk().admin.transfers.preview(transferId);
210
215
  console.log(JSON.stringify(data, null, 2));
211
216
  } catch (err) {
212
217
  reportSdkError(err);
@@ -216,24 +221,12 @@ async function preview(args) {
216
221
  async function list(args) {
217
222
  const parsedArgs = normalizeArgv(args);
218
223
  const valueFlags = ["--limit", "--offset"];
219
- assertKnownFlags(parsedArgs, [...valueFlags, "--incoming", "--outgoing", "--handoffs", "--help", "-h"], valueFlags);
224
+ assertKnownFlags(parsedArgs, [...valueFlags, "--incoming", "--outgoing", "--help", "-h"], valueFlags);
220
225
  const extra = positionalArgs(parsedArgs, valueFlags);
221
226
  if (extra.length > 0) {
222
227
  fail({ code: "BAD_USAGE", message: `Unexpected argument for transfer list: ${extra[0]}` });
223
228
  }
224
229
 
225
- // Email->org handoffs ride the same rail but have their own incoming inbox.
226
- if (parsedArgs.includes("--handoffs")) {
227
- allowanceAuthHeaders("/agent/v1/handoffs/incoming");
228
- try {
229
- const handoffs = await getSdk().admin.transfers.listIncomingHandoffs();
230
- console.log(JSON.stringify({ kind: "handoffs", handoffs }, null, 2));
231
- } catch (err) {
232
- reportSdkError(err);
233
- }
234
- return;
235
- }
236
-
237
230
  const incoming = parsedArgs.includes("--incoming");
238
231
  const outgoing = parsedArgs.includes("--outgoing");
239
232
  if (incoming && outgoing) {
@@ -252,6 +245,8 @@ async function list(args) {
252
245
  ? undefined
253
246
  : parseIntegerFlag("--offset", offsetFlag, { min: 0 });
254
247
 
248
+ // Incoming/outgoing are kind-agnostic — each returns the union of wallet- and
249
+ // email-addressed rows, tagged with recipient_kind.
255
250
  allowanceAuthHeaders(`/agent/v1/transfers/${direction}`);
256
251
 
257
252
  try {
@@ -286,20 +281,18 @@ async function accept(args) {
286
281
  async function cancel(args) {
287
282
  const parsedArgs = normalizeArgv(args);
288
283
  const valueFlags = ["--reason"];
289
- assertKnownFlags(parsedArgs, [...valueFlags, "--handoff", "--help", "-h"], valueFlags);
284
+ assertKnownFlags(parsedArgs, [...valueFlags, "--help", "-h"], valueFlags);
290
285
  const positionals = positionalArgs(parsedArgs, valueFlags);
291
286
  if (positionals.length !== 1) {
292
- fail({ code: "BAD_USAGE", message: "Usage: run402 transfer cancel <transfer_id> [--reason <text>] [--handoff]" });
287
+ fail({ code: "BAD_USAGE", message: "Usage: run402 transfer cancel <transfer_id> [--reason <text>]" });
293
288
  }
294
289
  const transferId = positionals[0];
295
290
  const reason = flagValue(parsedArgs, "--reason");
296
- const handoff = parsedArgs.includes("--handoff");
297
- allowanceAuthHeaders(`/agent/v1/${handoff ? "handoffs" : "transfers"}/${transferId}/cancel`);
291
+ // Cancel is kind-agnostic — one route serves wallet and email transfers.
292
+ allowanceAuthHeaders(`/agent/v1/transfers/${transferId}/cancel`);
298
293
 
299
294
  try {
300
- const data = handoff
301
- ? await getSdk().admin.transfers.cancelHandoff(transferId)
302
- : await getSdk().admin.transfers.cancel(transferId, reason ?? undefined);
295
+ const data = await getSdk().admin.transfers.cancel(transferId, reason ?? undefined);
303
296
  console.log(JSON.stringify(data, null, 2));
304
297
  } catch (err) {
305
298
  reportSdkError(err);
@@ -319,10 +312,10 @@ async function claim(args) {
319
312
  // v1.91: accept the sender's retained-developer-membership offer (see the
320
313
  // preview's `retain_collaborator` block). Absent = full severance (default).
321
314
  const acceptRetain = parsedArgs.includes("--accept-retained-collaborator");
322
- allowanceAuthHeaders(`/agent/v1/handoffs/${transferId}/claim`);
315
+ allowanceAuthHeaders(`/agent/v1/transfers/${transferId}/claim`);
323
316
 
324
317
  try {
325
- const data = await getSdk().admin.transfers.claimHandoff(transferId, {
318
+ const data = await getSdk().admin.transfers.claim(transferId, {
326
319
  organizationId: into ?? undefined,
327
320
  acceptRetainedCollaborator: acceptRetain || undefined,
328
321
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "run402",
3
- "version": "3.1.0",
3
+ "version": "3.3.0",
4
4
  "description": "CLI for Run402 — provision Postgres databases, deploy static sites, generate images, and manage wallets via x402 and MPP micropayments.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +1 @@
1
- {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAkB3C,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EAQtB,WAAW,EACX,oBAAoB,EAEpB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EAarB,iBAAiB,EAGjB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,uBAAuB,EACvB,WAAW,EACX,oBAAoB,EACpB,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAqE3B,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;OAIG;IACG,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4C9E;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;IAI3E;;;;OAIG;IACG,IAAI,CACR,IAAI,EAAE,WAAW,EACjB,IAAI,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GACvD,OAAO,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;KAAE,CAAC;IAIxE;;;;;OAKG;IACG,MAAM,CACV,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;KACxC,GACA,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;OAKG;IACG,MAAM,CACV,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QACJ,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;QACvC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;KACb,GACL,OAAO,CAAC,YAAY,CAAC;IAMxB;;;;;;;;;OASG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GACtE,OAAO,CAAC,YAAY,CAAC;IAqBxB;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,OAAO,CACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,CAAC;IA2CzB;;;;OAIG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9B,OAAO,CAAC,iBAAiB,CAAC;IAmB7B;;;;;;OAMG;IACG,IAAI,CACR,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IA6B9B;;;;;;;;OAQG;IACG,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GACxB,OAAO,CAAC,oBAAoB,CAAC;IAmBhC;;;;OAIG;IACG,UAAU,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2B9E;;;;OAIG;IACG,gBAAgB,CACpB,IAAI,EAAE,uBAAuB,GAC5B,OAAO,CAAC,sBAAsB,CAAC;IAqBlC;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA+BnE;;;;OAIG;IACG,OAAO,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAW1E;AAijDD;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;iEAG6D;IAC7D,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;CACvC"}
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/namespaces/deploy.ts"],"names":[],"mappings":"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"}
@@ -673,6 +673,7 @@ function functionToWire(fn) {
673
673
  },
674
674
  }
675
675
  : {}),
676
+ ...(fn.deps !== undefined ? { deps: fn.deps } : {}),
676
677
  ...(fn.schedule !== undefined ? { schedule: fn.schedule } : {}),
677
678
  ...(fn.requireAuth !== undefined ? { require_auth: fn.requireAuth } : {}),
678
679
  ...(fn.requireRole !== undefined
@@ -1687,6 +1688,7 @@ const FUNCTION_SPEC_FIELDS = new Set([
1687
1688
  "files",
1688
1689
  "entrypoint",
1689
1690
  "config",
1691
+ "deps",
1690
1692
  "schedule",
1691
1693
  "requireAuth",
1692
1694
  "requireRole",
@@ -2653,6 +2655,8 @@ async function normalizeFunction(fn, remember) {
2653
2655
  };
2654
2656
  if (fn.config)
2655
2657
  out.config = fn.config;
2658
+ if (fn.deps !== undefined)
2659
+ out.deps = fn.deps;
2656
2660
  if (fn.schedule !== undefined)
2657
2661
  out.schedule = fn.schedule;
2658
2662
  if (fn.entrypoint)