lua-cli 3.42.0-beta.1 → 3.42.0-beta.2
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/dist/api-exports.d.ts +2396 -121
- package/dist/api-exports.js +17955 -11411
- package/dist/api-exports.js.map +1 -1
- package/dist/index.js +9433 -980
- package/dist/index.js.map +1 -1
- package/dist/voice/test/index.d.ts +54 -54
- package/dist/workflow-builder.d.ts +16 -2
- package/dist/workflow-builder.js +5641 -316
- package/dist/workflow-builder.js.map +1 -1
- package/docs/API_REFERENCE.md +7 -1
- package/docs/api/AI.md +3 -1
- package/docs/api/Agents.md +197 -12
- package/docs/api/Data.md +192 -61
- package/docs/api/Jobs.md +2 -0
- package/docs/api/LuaWebhook.md +128 -85
- package/docs/api/LuaWorkflow.md +15 -15
- package/docs/api/Orders.md +7 -5
- package/docs/api/Products.md +1 -1
- package/docs/api/Progress.md +57 -0
- package/docs/api/Threads.md +122 -0
- package/docs/api/User.md +2 -2
- package/docs/api/Workflows.md +22 -1
- package/docs/workflows/approvals.md +4 -0
- package/docs/workflows/coding-harness.md +27 -1
- package/docs/workflows/workspaces-and-long-steps.md +3 -1
- package/package.json +3 -3
- package/scripts/generate-catalog.lib.ts +813 -0
- package/scripts/generate-catalog.ts +94 -0
- package/template/package.json +1 -1
- package/template-web-app/web/src/lua/client.ts +11 -1
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Threads
|
|
2
|
+
|
|
3
|
+
`Threads` lets a job, trigger, webhook or supervision handler reach a person on a conversation your agent owns:
|
|
4
|
+
|
|
5
|
+
- `Threads.open(userId)` returns the agent's home thread with that person.
|
|
6
|
+
- `Threads.followUp(threadId, …)` either starts a background agent turn on the thread or posts a message as the agent.
|
|
7
|
+
|
|
8
|
+
```typescript
|
|
9
|
+
import { Threads } from 'lua-cli';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
> **Availability.** `Threads` is behind the platform flag `LUA_THREAD_FOLLOW_UP_ENABLED`. While the flag is off, every call throws `thread_follow_up_disabled`. In `lua test` and `lua dev`, both members always throw `thread_follow_up_unavailable`, because they write into a real person's conversation.
|
|
13
|
+
|
|
14
|
+
## Threads.open
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
const { threadId, created } = await Threads.open(userId);
|
|
18
|
+
// threadId === `${userId}-${agentId}:home`
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- **Idempotent.** It returns the same home thread for this agent and person every time. `created` is `true` only the first time.
|
|
22
|
+
- **Who you can reach.** This is the same rule as `User.Inbox.push`:
|
|
23
|
+
- the user the run belongs to;
|
|
24
|
+
- for an agent-level run (a webhook, a user-less job or trigger), a member of the agent's notify list.
|
|
25
|
+
|
|
26
|
+
Anyone else throws `thread_user_unreachable`. A supervisor that wants to reach the OWNER of an agent it
|
|
27
|
+
supervises uses `Agents.notifyOwner(agentId, { message })` instead (the owner opts in on the grant; see
|
|
28
|
+
[Agents](./Agents.md#messaging-a-supervised-agents-owner)).
|
|
29
|
+
|
|
30
|
+
## Threads.followUp
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// Post the text as the agent, with no model turn.
|
|
34
|
+
await Threads.followUp(threadId, { message: 'Your weekly report is ready.' }); // { status: 'posted' }
|
|
35
|
+
|
|
36
|
+
// Start a background agent turn on the thread.
|
|
37
|
+
await Threads.followUp(threadId, { prompt: 'Check whether order 1042 shipped and tell the user.' }); // { status: 'queued' }
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Pass exactly one of these:
|
|
41
|
+
|
|
42
|
+
| Field | Max length | What happens |
|
|
43
|
+
| --------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
44
|
+
| `prompt` | 8,000 chars | A background turn runs on the thread. The prompt is labelled as coming from your own background run, not from the user. The receipt is `queued`. |
|
|
45
|
+
| `message` | 4,000 chars | The text is posted as an agent message. The receipt is `posted`. |
|
|
46
|
+
|
|
47
|
+
Either way, the person's open conversation refreshes without a reload.
|
|
48
|
+
|
|
49
|
+
- **Only the agent's own threads.** Allowed: a home thread, or any `{userId}-{agentId}[:suffix]` thread of one of the agent's own turns. Refused with `thread_not_owned_by_agent`: another agent's thread, a room, a task-run thread, or a hidden utility thread.
|
|
50
|
+
- **Rate limited.** The limit is 12 follow-ups per thread per hour and 120 per agent per hour. Over the limit, the call throws `thread_follow_up_rate_limited`. If the limit cannot be checked, the call is refused.
|
|
51
|
+
- **Audited.** Every follow-up writes a `thread_follow_up` row to the agent's logs. The row records the thread, the mode, the site and the outcome, never the text.
|
|
52
|
+
- **Delivery of `queued`.** A queued turn runs in the background. If it fails, the failure is in the agent's logs; the call has already returned.
|
|
53
|
+
|
|
54
|
+
### Safe retries with `idempotencyKey`
|
|
55
|
+
|
|
56
|
+
A job, trigger or webhook can run twice for the same event. Add an `idempotencyKey` and a repeat never reaches the
|
|
57
|
+
person twice:
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
await Threads.followUp(threadId, { message: 'Order 1042 shipped.', idempotencyKey: 'order-1042-shipped' });
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- A second call from this agent with the same key, within 24 hours, delivers nothing. It returns the first call's
|
|
64
|
+
receipt, with the same `followUpId`. It does not count against the rate limit.
|
|
65
|
+
- If a second call arrives while the first is still delivering, it waits briefly and returns the first receipt. If
|
|
66
|
+
the first is still running after that wait, it throws `thread_follow_up_in_progress`; retry it.
|
|
67
|
+
- If the first call was refused before it wrote anything (rate limit, audit), the key is free again and a retry
|
|
68
|
+
delivers. If the message write itself failed, the write may still have landed, so the key stays reserved for about
|
|
69
|
+
two minutes. A retry after that re-posts under the same message id, which replaces the message instead of adding a
|
|
70
|
+
second one.
|
|
71
|
+
- With `{ prompt }`, the key covers queueing the background turn, not the turn's completion. A retry never queues a
|
|
72
|
+
second turn, even if the first turn fails later.
|
|
73
|
+
- The key names the delivery, not the text: reusing it with a different message on the same thread still delivers
|
|
74
|
+
nothing. Reusing it on a different thread, or for the other mode (`prompt` instead of `message`), is refused with
|
|
75
|
+
`thread_follow_up_input_invalid`. Use one key per delivery, so a loop over users needs a key per user. Keys are
|
|
76
|
+
1-256 characters with no control characters; an invalid key is `thread_follow_up_input_invalid`.
|
|
77
|
+
- The same key used again after its 24 hours re-posts under the same message id, which replaces the earlier message.
|
|
78
|
+
- Delivery is at most once unless the platform's key store fails in the middle of a delivery. In that case a retry
|
|
79
|
+
after about two minutes can deliver again, onto the same message id for a message.
|
|
80
|
+
- The key is not split by environment: sandbox and production runs of the same agent share it. Inside a `lua test`
|
|
81
|
+
session, follow-ups are recorded rather than delivered, and keyed calls are recorded each time (no dedupe).
|
|
82
|
+
- The key is scoped to your agent and to `Threads.followUp`. `Agents.notifyOwner` keys are separate.
|
|
83
|
+
- If the platform cannot check the key, the call is refused with `thread_follow_up_guard_unavailable` and nothing is
|
|
84
|
+
delivered.
|
|
85
|
+
- Without a key, every call delivers, as before.
|
|
86
|
+
|
|
87
|
+
## Errors
|
|
88
|
+
|
|
89
|
+
Refusals throw an error with `name: 'ThreadFollowUpError'` and one of these codes:
|
|
90
|
+
|
|
91
|
+
| Code | When |
|
|
92
|
+
| ------------------------------------ | -------------------------------------------------------------------------------------------------- |
|
|
93
|
+
| `thread_follow_up_disabled` | The platform flag is off |
|
|
94
|
+
| `thread_follow_up_input_invalid` | Bad `ownerUserId` or `idempotencyKey`, or not exactly one of `prompt` / `message` within its limit |
|
|
95
|
+
| `thread_not_owned_by_agent` | The thread is not one of this agent's own threads |
|
|
96
|
+
| `thread_user_unreachable` | The person is not one this run may reach |
|
|
97
|
+
| `thread_follow_up_rate_limited` | Over the per-thread or per-agent hourly limit |
|
|
98
|
+
| `thread_follow_up_guard_unavailable` | The rate limit, the audit row or the idempotency key could not be written |
|
|
99
|
+
| `thread_follow_up_in_progress` | A call with the same `idempotencyKey` is still delivering (retryable) |
|
|
100
|
+
| `thread_follow_up_room_refused` | Called from a room turn |
|
|
101
|
+
| `thread_follow_up_unavailable` | `lua test` / `lua dev`, or a runtime without the Threads seam |
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
try {
|
|
105
|
+
await Threads.followUp(threadId, { message: 'Done.' });
|
|
106
|
+
} catch (err: any) {
|
|
107
|
+
if (err.name === 'ThreadFollowUpError' && err.code === 'thread_follow_up_rate_limited') {
|
|
108
|
+
// try again next hour
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Approval cards from a job
|
|
114
|
+
|
|
115
|
+
A workflow run started from a job or a user-bound trigger can point its approval cards at the user's home thread. Pass the thread as `originThreadId`:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
const { threadId } = await Threads.open(userId);
|
|
119
|
+
await Workflows.start('refund', input, { originThreadId: threadId, callback: true });
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
This works only for the run's own user. A user-less, agent-level run cannot target a home thread yet.
|
package/docs/api/User.md
CHANGED
|
@@ -216,7 +216,7 @@ Sends messages to the user.
|
|
|
216
216
|
**Parameters:**
|
|
217
217
|
- `messages` (ChatMessage[]) - Array of messages to send
|
|
218
218
|
|
|
219
|
-
**Returns:** Promise<boolean>
|
|
219
|
+
**Returns:** Promise<boolean> - `true` only when the platform confirmed delivery, `false` otherwise (including an unconfirmed result). It never throws, so check the result instead of using try/catch.
|
|
220
220
|
|
|
221
221
|
**Example:**
|
|
222
222
|
```typescript
|
|
@@ -247,7 +247,7 @@ await user.send([
|
|
|
247
247
|
|
|
248
248
|
Clears all user data.
|
|
249
249
|
|
|
250
|
-
**Returns:** Promise<boolean
|
|
250
|
+
**Returns:** `Promise<{ success: boolean }>` - `{ success: true }` once the data is cleared. Throws if the clear fails.
|
|
251
251
|
|
|
252
252
|
**Example:**
|
|
253
253
|
```typescript
|
package/docs/api/Workflows.md
CHANGED
|
@@ -36,9 +36,30 @@ Starts a run.
|
|
|
36
36
|
- `waitSeconds` (number ≤ 55) — server long-poll
|
|
37
37
|
- `initialState` (object ≤ 64 KB) — seeds `ctx.state`
|
|
38
38
|
- `correlationKey` (string), `tags` (string[] ≤ 10)
|
|
39
|
-
- `replyTo` (`{ channel, threadId }`) — customer-channel continuation
|
|
39
|
+
- `replyTo` (`{ channel, threadId }`) — customer-channel continuation; `channel` is one of `whatsapp | sms | email | webchat | slack`
|
|
40
|
+
- `onBehalfOf` (`{ kind: 'customer', externalId }`) — run as an end customer (`principalKind: 'customer'`; never an approver)
|
|
41
|
+
- `callback` (boolean) — opt-in loopback: when the run completes, fails or times out, the agent takes one background turn on `originThreadId` with the outcome. Throws `CALLBACK_THREAD_REQUIRED` when there is no origin thread
|
|
42
|
+
- `originThreadId` (string) — the chat thread the run's cards and callback land on. Defaults to `Lua.request.threadId` when called from a chat turn (a tool or pre/postprocessor); an explicit value must be the calling user's own thread on this agent (`ORIGIN_THREAD_INVALID` otherwise)
|
|
43
|
+
- `notify` (`'emailApp' | 'email' | 'app' | 'off'`)
|
|
40
44
|
- `workflowVersionId` (string) — pin a version (default: the active one)
|
|
41
45
|
|
|
46
|
+
Inside a deployed agent (tools, jobs, webhooks, triggers, workflow code steps), an option key that is not listed above throws `WorkflowApiError { code: 'VALIDATION_FAILED' }` naming it, as does a malformed `replyTo` / `onBehalfOf` / `callback` / `initialState` / `notify`.
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// From a tool: report back in this chat when the run finishes.
|
|
50
|
+
await Workflows.start('refund-review', { orderId }, { callback: true });
|
|
51
|
+
|
|
52
|
+
// A customer-facing start that replies on WhatsApp.
|
|
53
|
+
await Workflows.start(
|
|
54
|
+
'order-status',
|
|
55
|
+
{ orderId },
|
|
56
|
+
{
|
|
57
|
+
onBehalfOf: { kind: 'customer', externalId: customerId },
|
|
58
|
+
replyTo: { channel: 'whatsapp', threadId: waThreadId },
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
```
|
|
62
|
+
|
|
42
63
|
**Returns:** `Promise<{ runId, status: 'queued' | 'gated' | 'running' | 'completed' | 'failed', output? }>`
|
|
43
64
|
|
|
44
65
|
```typescript
|
|
@@ -46,6 +46,10 @@ Offline, `lua workflows run --approve <id>` completes the node with `decidedBy:
|
|
|
46
46
|
|
|
47
47
|
`timeoutHours` runs on **business time** when `businessHours: { tz, calendar }` is set. `onTimeout` is a chain: each `{ escalateTo, timeoutHours }` hop re-prompts the next audience; the terminal `'deny'` (or `'cancel-run'`/`'continue'`) completes the node — e.g. `{approved:false, timedOut:true, escalations:2}`.
|
|
48
48
|
|
|
49
|
+
## Reminders
|
|
50
|
+
|
|
51
|
+
`remindAfterHours: 24` re-sends the approval push to the approvers who still have to decide, every 24 hours while the approval is pending: at most **3 reminders** per ask (an escalation hop is a new ask, so its count starts again), and never at or after the deadline. The reminder replaces the earlier notification in place (same collapse key) and reads "Reminder: …". It takes a plain number of hours in `1..720` (no binding); anything else is refused as `remind-after-invalid`, and a value at or above the first deadline pushes with the `remind-after-exceeds-timeout` warning, because it can never fire. The first deadline is the first escalation hop's `timeoutHours` when `onTimeout` starts with a hop, otherwise `timeoutHours` (168 hours when you leave it out). Reminders ride the approval **push**, so they reach the approvers an agent's approval routing names (shared-agent approvers); an approval with no routing gets the inbox row and the channel fallback but no push, and so no reminder. They are sent on the platform's sweep cadence, so a reminder can arrive a few minutes after it is due, and quiet hours and do-not-disturb drop it like any other push.
|
|
52
|
+
|
|
49
53
|
## Edited payloads
|
|
50
54
|
|
|
51
55
|
`editablePaths: ['amount', 'drafts[*].body']` (the `a.b[0].c` / `[*]` grammar) lets the approver patch the payload — a non-empty list implies `editable: true`, so the flag is optional (3.32.6, LUA-825; an explicit `editable: false` beside paths is refused as contradictory). The sequence is **fetch → patch → approve-with-fingerprint**: the approve call echoes the fingerprint of the revision the approver saw, so a concurrent edit forces a re-read. Out-of-grammar paths are refused; `editedPayloadSchema` validates the result.
|
|
@@ -4,9 +4,35 @@ _Source of truth: workflows-spec 05 §5.17.6 (D27). This page is the developer s
|
|
|
4
4
|
|
|
5
5
|
`harness:'claude-code'` runs Claude Code against Anthropic-class models; `harness:'generic'` runs Lua's own agent loop with the **same nine workspace tools** against any provider your org is allowed — the tool ids, the budget, the secret scan and the turn limit are identical.
|
|
6
6
|
|
|
7
|
-
- Absent `harness`, the platform derives one from the step's model; the local driver prints the derived value so you see what the server will stamp.
|
|
7
|
+
- Absent `harness`, the platform derives one from the step's model (see [Which model a Job step runs on](#which-model-a-job-step-runs-on)); the local driver prints the derived value so you see what the server will stamp.
|
|
8
8
|
- `LUA_WF_JOB_PROVIDERS` gates providers per org; an out-of-list model is `job-tier-provider-unsupported`.
|
|
9
9
|
- **Org BYOK keys go through the sidecar proxy — your key never enters the agent container.**
|
|
10
10
|
- Billing rows carry `model` + `harness` (seat multiplier per provider).
|
|
11
11
|
|
|
12
12
|
Offline: `--agents live` with `harness:'generic'` runs the generic provider in-process against **your own** key from the environment (`OPENAI_API_KEY` / `GOOGLE_API_KEY` / `ANTHROPIC_API_KEY`) — billing and governance are server-side only.
|
|
13
|
+
|
|
14
|
+
## Which model a Job step runs on
|
|
15
|
+
|
|
16
|
+
A Job-tier step picks its model with one fixed rule:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
node.model ?? LUA_WF_JOB_DEFAULT_MODEL ?? org default
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`node.model` is the step's own `model`, which may be a literal, a run-input placeholder or `class/<c>`. **The agent that owns the step is not in this chain.** A Job step with no `model` does not use the agent's configured model: it runs, and is billed, on the platform default (`LUA_WF_JOB_DEFAULT_MODEL`), or on the org default where the platform default is unset.
|
|
23
|
+
|
|
24
|
+
Example (approximate, from a production audit; not a guarantee): with the platform default `claude-opus-4-8` (×16.67) a standard-tier Job attempt costs about 3 × 16.67 ≈ 50.01 actions, while an inline step on a ×0.5 model costs 3 × 0.5 = 1.5. A model-less Job step on a cheap agent still bills the first figure.
|
|
25
|
+
|
|
26
|
+
**Pin `model` on the step** to choose the model and its price.
|
|
27
|
+
|
|
28
|
+
Where to read the model a Job step actually uses, and what it multiplies by:
|
|
29
|
+
|
|
30
|
+
- `lua push` / deploy: the `job-model-default` advisory, one per Job step that names no `model`. It is not shown for a pinned step.
|
|
31
|
+
- The compose plan: the Job row.
|
|
32
|
+
- `lua workflows status --steps`: the `⚙` line per Job attempt (model, leg, multiplier).
|
|
33
|
+
- `lua workflows logs`: the `job model →` line.
|
|
34
|
+
- The `step.job_model_resolved` event, appended once per attempt.
|
|
35
|
+
|
|
36
|
+
The leg is named in plain words: `node.model`, `platform default`, `org default`, `run input`, `placeholder default` or `lease stamp`.
|
|
37
|
+
|
|
38
|
+
A non-Anthropic pin must pass `LUA_WF_JOB_PROVIDERS`, and `harness:'claude-code'` needs an Anthropic model (otherwise `WORKFLOW_MODEL_HARNESS_MISMATCH`); use `harness:'generic'` for other providers.
|
|
@@ -8,9 +8,11 @@ _Source of truth: workflows-spec 05 §5.17 (D19-r1/r2). This page is the develop
|
|
|
8
8
|
|
|
9
9
|
`workspace` on `createWorkflow` declares the checkout: `{ kind:'git', repo, ref, credentialsRef, sizeGb?, verify? }` or `{ kind:'empty' }`. Steps mount it with `workspace: { mount: 'rw'|'ro', isolation?: 'worktree' }` and read `ctx.workspace = { root, mount, branch, headSha, isolation, baseSha?, arm?, backend? }` — `root` is the absolute directory of the checkout (`/workspace`); `baseSha` is the commit the run's base ref resolved to at provision (`headSha` is where this step's checkout is), `arm` the worktree arm id under `isolation:'worktree'`, `backend` the volume backend — the three are present when the pod hands the run's stamps to the step and absent otherwise (an `empty` workspace, a shared mount). The pre-3.33 name `path` is served by the Job pod as a deprecated alias for one minor (it warns once per step) and then removed; new code reads `root`.
|
|
10
10
|
|
|
11
|
+
`ttlHours` is how long a released or held volume is kept before it expires: 72 h by default, 24 h for a completed `keepArtefacts` volume. The platform has a **168 h** ceiling on it, a platform setting that applies once the platform enables it: a larger value is then refused at `lua push` with `workspace-ttl-exceeds-cap` (a non-positive or non-numeric one with `workspace-ttl-invalid`) and held volumes are clamped to 168 h. Until then `lua compile` does not check it, so do not rely on a long hold.
|
|
12
|
+
|
|
11
13
|
`credentialsRef` is a connection id **or a key you declare under `connections: [{ key, integrationType }]`** — declare a key; it resolves against the owner agent's own connections on any agent at run time (see [Git credentials](./git-credentials.md)), so the definition never freezes a production id.
|
|
12
14
|
|
|
13
|
-
**Suspension does not release the workspace.** When your run waits for a person or a signal, its volume is left exactly as it was — it keeps holding one of the org's `maxWorkspacesPerOrg` slots until a terminal reason releases it, or, for a kept `empty` workspace, `ttlHours` expires. Releasing a workspace at suspension is not implemented yet (tracked as SA-134); until then, commit before a step suspends so your work is durable on the run branch `lua/wf-<lineageId>` independent of the volume.
|
|
15
|
+
**Suspension does not release the workspace.** When your run waits for a person or a signal, its volume is left exactly as it was — it keeps holding one of the org's `maxWorkspacesPerOrg` slots until a terminal reason releases it, or, for a kept `empty` workspace, `ttlHours` expires (168 h at most once the ceiling is enabled). Releasing a workspace at suspension is not implemented yet (tracked as SA-134); until then, commit before a step suspends so your work is durable on the run branch `lua/wf-<lineageId>` independent of the volume.
|
|
14
16
|
|
|
15
17
|
**Worktree arms:** parallel arms never share a filesystem; each gets its own clone and branch and the `merge` step integrates them — put `verify` on the workspace so an agent-resolved conflict must pass your tests. `onConflict:'agent'` lets one resolver turn fix conflicts.
|
|
16
18
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lua-cli",
|
|
3
|
-
"version": "3.42.0-beta.
|
|
3
|
+
"version": "3.42.0-beta.2",
|
|
4
4
|
"description": "Build, test, and deploy AI agents with custom tools, webhooks, and scheduled jobs. Features LuaAgent unified configuration, streaming chat, and batch deployment.",
|
|
5
5
|
"readmeFilename": "README.md",
|
|
6
6
|
"main": "dist/api-exports.js",
|
|
@@ -115,10 +115,10 @@
|
|
|
115
115
|
"ts-node": "^10.9.2",
|
|
116
116
|
"tsup": "^8.5.1",
|
|
117
117
|
"@lua/sandbox-runtime": "0.0.1",
|
|
118
|
+
"@lua/shared-sandbox": "0.0.1",
|
|
118
119
|
"@lua/shared-source-sync": "0.0.1",
|
|
119
120
|
"@lua/shared-types": "0.0.1",
|
|
120
|
-
"@lua/workflow-graph": "0.0.1"
|
|
121
|
-
"@lua/shared-sandbox": "0.0.1"
|
|
121
|
+
"@lua/workflow-graph": "0.0.1"
|
|
122
122
|
},
|
|
123
123
|
"scripts": {
|
|
124
124
|
"clean": "rm -rf dist temp",
|