@nebutra/agent-runtime 0.2.1 → 2.0.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/LICENSE +21 -676
- package/README.md +33 -10
- package/dist/adapters/index.d.ts +24 -5
- package/dist/adapters/index.js +27 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/{chunk-KCNN4QUQ.js → chunk-5UGIUYJR.js} +4 -4
- package/dist/chunk-7ELA4SWE.js +73 -0
- package/dist/chunk-7ELA4SWE.js.map +1 -0
- package/dist/chunk-Q62VKHIT.js +178 -0
- package/dist/chunk-Q62VKHIT.js.map +1 -0
- package/dist/chunk-VXILZAXK.js +541 -0
- package/dist/chunk-VXILZAXK.js.map +1 -0
- package/dist/command-exec.d.ts +45 -0
- package/dist/command-exec.js +15 -0
- package/dist/command-exec.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.js +81 -28
- package/dist/index.js.map +1 -1
- package/dist/orchestration.d.ts +42 -1
- package/dist/orchestration.js +7 -3
- package/dist/pulsar.js +2 -2
- package/dist/sandbox-DfcRttXt.d.ts +219 -0
- package/dist/sandbox.d.ts +2 -64
- package/dist/sandbox.js +25 -3
- package/package.json +81 -30
- package/.turbo/turbo-build.log +0 -130
- package/.turbo/turbo-test.log +0 -47
- package/.turbo/turbo-typecheck.log +0 -4
- package/CHANGELOG.md +0 -250
- package/dist/chunk-MUF7ZZTO.js +0 -57
- package/dist/chunk-MUF7ZZTO.js.map +0 -1
- package/dist/chunk-MX2WL43P.js +0 -90
- package/dist/chunk-MX2WL43P.js.map +0 -1
- package/examples/pulsar-quickstart.ts +0 -35
- package/examples/resume-branch.ts +0 -45
- package/examples/subagent-fanout.ts +0 -20
- package/src/adapters/dispatcher-sse.test.ts +0 -218
- package/src/adapters/dispatcher-sse.ts +0 -222
- package/src/adapters/index.ts +0 -18
- package/src/adapters/mcp-catalog.test.ts +0 -213
- package/src/adapters/mcp-catalog.ts +0 -188
- package/src/adapters/prisma-rollout.test.ts +0 -153
- package/src/adapters/prisma-rollout.ts +0 -104
- package/src/agent-runtime.test.ts +0 -176
- package/src/artifact-stream.test.ts +0 -330
- package/src/artifact-stream.ts +0 -453
- package/src/channel-gateway.test.ts +0 -432
- package/src/channel-gateway.ts +0 -357
- package/src/cli.ts +0 -49
- package/src/code-review.test.ts +0 -501
- package/src/code-review.ts +0 -495
- package/src/command-suggestions.test.ts +0 -251
- package/src/command-suggestions.ts +0 -338
- package/src/commands.test.ts +0 -184
- package/src/commands.ts +0 -140
- package/src/commit-message.test.ts +0 -249
- package/src/commit-message.ts +0 -180
- package/src/context-compaction.test.ts +0 -522
- package/src/context-compaction.ts +0 -438
- package/src/definitions.test.ts +0 -78
- package/src/definitions.ts +0 -190
- package/src/deployment-status.test.ts +0 -215
- package/src/deployment-status.ts +0 -227
- package/src/design-context.test.ts +0 -195
- package/src/design-context.ts +0 -198
- package/src/dispatcher.test.ts +0 -234
- package/src/dispatcher.ts +0 -189
- package/src/durable-turn.test.ts +0 -209
- package/src/durable-turn.ts +0 -135
- package/src/edit-planner.test.ts +0 -204
- package/src/edit-planner.ts +0 -325
- package/src/fuzzy-match.test.ts +0 -311
- package/src/fuzzy-match.ts +0 -444
- package/src/hook-pipeline.test.ts +0 -279
- package/src/hook-pipeline.ts +0 -373
- package/src/inbound-admission.test.ts +0 -394
- package/src/inbound-admission.ts +0 -246
- package/src/index.ts +0 -49
- package/src/loop.test.ts +0 -161
- package/src/loop.ts +0 -211
- package/src/mcp-bridge.test.ts +0 -165
- package/src/mcp-bridge.ts +0 -81
- package/src/memory-provider.test.ts +0 -232
- package/src/memory-provider.ts +0 -257
- package/src/model.ts +0 -168
- package/src/orchestration.test.ts +0 -53
- package/src/orchestration.ts +0 -146
- package/src/permission-ruleset.test.ts +0 -301
- package/src/permission-ruleset.ts +0 -1
- package/src/policy.ts +0 -151
- package/src/project-repo.test.ts +0 -232
- package/src/project-repo.ts +0 -311
- package/src/protocol.ts +0 -159
- package/src/pulsar.test.ts +0 -156
- package/src/pulsar.ts +0 -322
- package/src/rollout-store-persistent.test.ts +0 -217
- package/src/rollout-store-persistent.ts +0 -166
- package/src/rollout.ts +0 -150
- package/src/sandbox.ts +0 -113
- package/src/session-share.test.ts +0 -360
- package/src/session-share.ts +0 -310
- package/src/skill-distillation.test.ts +0 -177
- package/src/skill-distillation.ts +0 -369
- package/src/skills.test.ts +0 -277
- package/src/skills.ts +0 -277
- package/src/subagents.test.ts +0 -290
- package/src/subagents.ts +0 -332
- package/src/tools.test.ts +0 -12
- package/src/tools.ts +0 -129
- package/src/workbench.test.ts +0 -0
- package/src/workbench.ts +0 -0
- package/tsconfig.json +0 -12
- package/tsup.config.ts +0 -36
- /package/dist/{chunk-KCNN4QUQ.js.map → chunk-5UGIUYJR.js.map} +0 -0
package/.turbo/turbo-build.log
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @nebutra/agent-runtime@0.2.1 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
|
|
3
|
-
> tsup
|
|
4
|
-
|
|
5
|
-
[34mCLI[39m Building entry: {"index":"src/index.ts","adapters/index":"src/adapters/index.ts","adapters/dispatcher-sse":"src/adapters/dispatcher-sse.ts","adapters/mcp-catalog":"src/adapters/mcp-catalog.ts","adapters/prisma-rollout":"src/adapters/prisma-rollout.ts","commands":"src/commands.ts","cli":"src/cli.ts","definitions":"src/definitions.ts","dispatcher":"src/dispatcher.ts","durable-turn":"src/durable-turn.ts","hook-pipeline":"src/hook-pipeline.ts","loop":"src/loop.ts","mcp-bridge":"src/mcp-bridge.ts","model":"src/model.ts","orchestration":"src/orchestration.ts","policy":"src/policy.ts","protocol":"src/protocol.ts","pulsar":"src/pulsar.ts","rollout":"src/rollout.ts","rollout-store-persistent":"src/rollout-store-persistent.ts","sandbox":"src/sandbox.ts","skills":"src/skills.ts","subagents":"src/subagents.ts","tools":"src/tools.ts"}
|
|
6
|
-
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
-
[34mCLI[39m tsup v8.5.1
|
|
8
|
-
[34mCLI[39m Using tsup config: /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime/tsup.config.ts
|
|
9
|
-
[34mCLI[39m Target: es2022
|
|
10
|
-
[34mCLI[39m Cleaning output folder
|
|
11
|
-
[34mESM[39m Build start
|
|
12
|
-
[32mESM[39m [1mdist/protocol.js [22m[32m293.00 B[39m
|
|
13
|
-
[32mESM[39m [1mdist/adapters/index.js [22m[32m480.00 B[39m
|
|
14
|
-
[32mESM[39m [1mdist/pulsar.js [22m[32m349.00 B[39m
|
|
15
|
-
[32mESM[39m [1mdist/rollout.js [22m[32m316.00 B[39m
|
|
16
|
-
[32mESM[39m [1mdist/rollout-store-persistent.js [22m[32m219.00 B[39m
|
|
17
|
-
[32mESM[39m [1mdist/sandbox.js [22m[32m348.00 B[39m
|
|
18
|
-
[32mESM[39m [1mdist/skills.js [22m[32m215.00 B[39m
|
|
19
|
-
[32mESM[39m [1mdist/subagents.js [22m[32m404.00 B[39m
|
|
20
|
-
[32mESM[39m [1mdist/tools.js [22m[32m229.00 B[39m
|
|
21
|
-
[32mESM[39m [1mdist/dispatcher.js [22m[32m191.00 B[39m
|
|
22
|
-
[32mESM[39m [1mdist/durable-turn.js [22m[32m221.00 B[39m
|
|
23
|
-
[32mESM[39m [1mdist/hook-pipeline.js [22m[32m244.00 B[39m
|
|
24
|
-
[32mESM[39m [1mdist/loop.js [22m[32m193.00 B[39m
|
|
25
|
-
[32mESM[39m [1mdist/mcp-bridge.js [22m[32m187.00 B[39m
|
|
26
|
-
[32mESM[39m [1mdist/model.js [22m[32m186.00 B[39m
|
|
27
|
-
[32mESM[39m [1mdist/orchestration.js [22m[32m234.00 B[39m
|
|
28
|
-
[32mESM[39m [1mdist/policy.js [22m[32m527.00 B[39m
|
|
29
|
-
[32mESM[39m [1mdist/index.js [22m[32m100.03 KB[39m
|
|
30
|
-
[32mESM[39m [1mdist/chunk-KCNN4QUQ.js [22m[32m6.91 KB[39m
|
|
31
|
-
[32mESM[39m [1mdist/chunk-2DA6Q6TN.js [22m[32m3.42 KB[39m
|
|
32
|
-
[32mESM[39m [1mdist/chunk-MUF7ZZTO.js [22m[32m1.62 KB[39m
|
|
33
|
-
[32mESM[39m [1mdist/chunk-GQZKYWFT.js [22m[32m4.41 KB[39m
|
|
34
|
-
[32mESM[39m [1mdist/chunk-5YS7WAPS.js [22m[32m5.67 KB[39m
|
|
35
|
-
[32mESM[39m [1mdist/chunk-RDKYDMXT.js [22m[32m4.08 KB[39m
|
|
36
|
-
[32mESM[39m [1mdist/chunk-FUG5DT2C.js [22m[32m2.45 KB[39m
|
|
37
|
-
[32mESM[39m [1mdist/chunk-SD2ZJ7XG.js [22m[32m1.92 KB[39m
|
|
38
|
-
[32mESM[39m [1mdist/chunk-LO24VOA3.js [22m[32m6.31 KB[39m
|
|
39
|
-
[32mESM[39m [1mdist/chunk-D4YAPLOW.js [22m[32m4.19 KB[39m
|
|
40
|
-
[32mESM[39m [1mdist/chunk-37BBB2P2.js [22m[32m2.19 KB[39m
|
|
41
|
-
[32mESM[39m [1mdist/chunk-NI4EDT4T.js [22m[32m1.00 KB[39m
|
|
42
|
-
[32mESM[39m [1mdist/chunk-4Y25ZTKI.js [22m[32m1.40 KB[39m
|
|
43
|
-
[32mESM[39m [1mdist/chunk-6EGG2OZC.js [22m[32m324.00 B[39m
|
|
44
|
-
[32mESM[39m [1mdist/chunk-MX2WL43P.js [22m[32m3.28 KB[39m
|
|
45
|
-
[32mESM[39m [1mdist/chunk-CGRCUKGT.js [22m[32m2.38 KB[39m
|
|
46
|
-
[32mESM[39m [1mdist/adapters/dispatcher-sse.js [22m[32m245.00 B[39m
|
|
47
|
-
[32mESM[39m [1mdist/chunk-ZTSKS42I.js [22m[32m3.65 KB[39m
|
|
48
|
-
[32mESM[39m [1mdist/adapters/mcp-catalog.js [22m[32m218.00 B[39m
|
|
49
|
-
[32mESM[39m [1mdist/chunk-24ZXP7FI.js [22m[32m2.47 KB[39m
|
|
50
|
-
[32mESM[39m [1mdist/adapters/prisma-rollout.js [22m[32m191.00 B[39m
|
|
51
|
-
[32mESM[39m [1mdist/chunk-57W3AR43.js [22m[32m1.55 KB[39m
|
|
52
|
-
[32mESM[39m [1mdist/commands.js [22m[32m217.00 B[39m
|
|
53
|
-
[32mESM[39m [1mdist/chunk-YYFPDBJG.js [22m[32m1.86 KB[39m
|
|
54
|
-
[32mESM[39m [1mdist/cli.js [22m[32m1.30 KB[39m
|
|
55
|
-
[32mESM[39m [1mdist/definitions.js [22m[32m322.00 B[39m
|
|
56
|
-
[32mESM[39m [1mdist/chunk-7BUOF367.js [22m[32m4.13 KB[39m
|
|
57
|
-
[32mESM[39m [1mdist/chunk-424PT5DM.js [22m[32m919.00 B[39m
|
|
58
|
-
[32mESM[39m [1mdist/protocol.js.map [22m[32m71.00 B[39m
|
|
59
|
-
[32mESM[39m [1mdist/adapters/index.js.map [22m[32m71.00 B[39m
|
|
60
|
-
[32mESM[39m [1mdist/pulsar.js.map [22m[32m71.00 B[39m
|
|
61
|
-
[32mESM[39m [1mdist/rollout.js.map [22m[32m71.00 B[39m
|
|
62
|
-
[32mESM[39m [1mdist/rollout-store-persistent.js.map [22m[32m71.00 B[39m
|
|
63
|
-
[32mESM[39m [1mdist/sandbox.js.map [22m[32m71.00 B[39m
|
|
64
|
-
[32mESM[39m [1mdist/skills.js.map [22m[32m71.00 B[39m
|
|
65
|
-
[32mESM[39m [1mdist/subagents.js.map [22m[32m71.00 B[39m
|
|
66
|
-
[32mESM[39m [1mdist/tools.js.map [22m[32m71.00 B[39m
|
|
67
|
-
[32mESM[39m [1mdist/dispatcher.js.map [22m[32m71.00 B[39m
|
|
68
|
-
[32mESM[39m [1mdist/durable-turn.js.map [22m[32m71.00 B[39m
|
|
69
|
-
[32mESM[39m [1mdist/hook-pipeline.js.map [22m[32m71.00 B[39m
|
|
70
|
-
[32mESM[39m [1mdist/loop.js.map [22m[32m71.00 B[39m
|
|
71
|
-
[32mESM[39m [1mdist/mcp-bridge.js.map [22m[32m71.00 B[39m
|
|
72
|
-
[32mESM[39m [1mdist/model.js.map [22m[32m71.00 B[39m
|
|
73
|
-
[32mESM[39m [1mdist/orchestration.js.map [22m[32m71.00 B[39m
|
|
74
|
-
[32mESM[39m [1mdist/policy.js.map [22m[32m71.00 B[39m
|
|
75
|
-
[32mESM[39m [1mdist/index.js.map [22m[32m246.22 KB[39m
|
|
76
|
-
[32mESM[39m [1mdist/chunk-KCNN4QUQ.js.map [22m[32m14.41 KB[39m
|
|
77
|
-
[32mESM[39m [1mdist/chunk-2DA6Q6TN.js.map [22m[32m8.01 KB[39m
|
|
78
|
-
[32mESM[39m [1mdist/chunk-MUF7ZZTO.js.map [22m[32m4.91 KB[39m
|
|
79
|
-
[32mESM[39m [1mdist/chunk-GQZKYWFT.js.map [22m[32m13.03 KB[39m
|
|
80
|
-
[32mESM[39m [1mdist/chunk-5YS7WAPS.js.map [22m[32m15.75 KB[39m
|
|
81
|
-
[32mESM[39m [1mdist/chunk-RDKYDMXT.js.map [22m[32m8.81 KB[39m
|
|
82
|
-
[32mESM[39m [1mdist/chunk-FUG5DT2C.js.map [22m[32m7.87 KB[39m
|
|
83
|
-
[32mESM[39m [1mdist/chunk-SD2ZJ7XG.js.map [22m[32m6.73 KB[39m
|
|
84
|
-
[32mESM[39m [1mdist/chunk-LO24VOA3.js.map [22m[32m17.32 KB[39m
|
|
85
|
-
[32mESM[39m [1mdist/chunk-D4YAPLOW.js.map [22m[32m10.82 KB[39m
|
|
86
|
-
[32mESM[39m [1mdist/chunk-37BBB2P2.js.map [22m[32m6.88 KB[39m
|
|
87
|
-
[32mESM[39m [1mdist/chunk-NI4EDT4T.js.map [22m[32m3.53 KB[39m
|
|
88
|
-
[32mESM[39m [1mdist/chunk-4Y25ZTKI.js.map [22m[32m5.46 KB[39m
|
|
89
|
-
[32mESM[39m [1mdist/chunk-6EGG2OZC.js.map [22m[32m5.96 KB[39m
|
|
90
|
-
[32mESM[39m [1mdist/chunk-MX2WL43P.js.map [22m[32m6.96 KB[39m
|
|
91
|
-
[32mESM[39m [1mdist/chunk-CGRCUKGT.js.map [22m[32m7.65 KB[39m
|
|
92
|
-
[32mESM[39m [1mdist/adapters/dispatcher-sse.js.map [22m[32m71.00 B[39m
|
|
93
|
-
[32mESM[39m [1mdist/chunk-ZTSKS42I.js.map [22m[32m10.83 KB[39m
|
|
94
|
-
[32mESM[39m [1mdist/adapters/mcp-catalog.js.map [22m[32m71.00 B[39m
|
|
95
|
-
[32mESM[39m [1mdist/chunk-24ZXP7FI.js.map [22m[32m8.26 KB[39m
|
|
96
|
-
[32mESM[39m [1mdist/adapters/prisma-rollout.js.map [22m[32m71.00 B[39m
|
|
97
|
-
[32mESM[39m [1mdist/chunk-57W3AR43.js.map [22m[32m4.88 KB[39m
|
|
98
|
-
[32mESM[39m [1mdist/commands.js.map [22m[32m71.00 B[39m
|
|
99
|
-
[32mESM[39m [1mdist/chunk-YYFPDBJG.js.map [22m[32m6.97 KB[39m
|
|
100
|
-
[32mESM[39m [1mdist/cli.js.map [22m[32m2.29 KB[39m
|
|
101
|
-
[32mESM[39m [1mdist/definitions.js.map [22m[32m71.00 B[39m
|
|
102
|
-
[32mESM[39m [1mdist/chunk-7BUOF367.js.map [22m[32m10.17 KB[39m
|
|
103
|
-
[32mESM[39m [1mdist/chunk-424PT5DM.js.map [22m[32m71.00 B[39m
|
|
104
|
-
[32mESM[39m ⚡️ Build success in 361ms
|
|
105
|
-
[34mDTS[39m Build start
|
|
106
|
-
[32mDTS[39m ⚡️ Build success in 13376ms
|
|
107
|
-
[32mDTS[39m [1mdist/adapters/index.d.ts [22m[32m581.00 B[39m
|
|
108
|
-
[32mDTS[39m [1mdist/cli.d.ts [22m[32m13.00 B[39m
|
|
109
|
-
[32mDTS[39m [1mdist/adapters/dispatcher-sse.d.ts [22m[32m3.18 KB[39m
|
|
110
|
-
[32mDTS[39m [1mdist/adapters/mcp-catalog.d.ts [22m[32m2.77 KB[39m
|
|
111
|
-
[32mDTS[39m [1mdist/adapters/prisma-rollout.d.ts [22m[32m2.10 KB[39m
|
|
112
|
-
[32mDTS[39m [1mdist/commands.d.ts [22m[32m3.64 KB[39m
|
|
113
|
-
[32mDTS[39m [1mdist/dispatcher.d.ts [22m[32m1.91 KB[39m
|
|
114
|
-
[32mDTS[39m [1mdist/durable-turn.d.ts [22m[32m2.55 KB[39m
|
|
115
|
-
[32mDTS[39m [1mdist/hook-pipeline.d.ts [22m[32m5.33 KB[39m
|
|
116
|
-
[32mDTS[39m [1mdist/mcp-bridge.d.ts [22m[32m1.91 KB[39m
|
|
117
|
-
[32mDTS[39m [1mdist/orchestration.d.ts [22m[32m1.64 KB[39m
|
|
118
|
-
[32mDTS[39m [1mdist/pulsar.d.ts [22m[32m2.71 KB[39m
|
|
119
|
-
[32mDTS[39m [1mdist/loop.d.ts [22m[32m3.16 KB[39m
|
|
120
|
-
[32mDTS[39m [1mdist/protocol.d.ts [22m[32m5.32 KB[39m
|
|
121
|
-
[32mDTS[39m [1mdist/rollout-store-persistent.d.ts [22m[32m1.77 KB[39m
|
|
122
|
-
[32mDTS[39m [1mdist/rollout.d.ts [22m[32m3.28 KB[39m
|
|
123
|
-
[32mDTS[39m [1mdist/sandbox.d.ts [22m[32m2.80 KB[39m
|
|
124
|
-
[32mDTS[39m [1mdist/policy.d.ts [22m[32m5.59 KB[39m
|
|
125
|
-
[32mDTS[39m [1mdist/skills.d.ts [22m[32m4.40 KB[39m
|
|
126
|
-
[32mDTS[39m [1mdist/subagents.d.ts [22m[32m5.74 KB[39m
|
|
127
|
-
[32mDTS[39m [1mdist/model.d.ts [22m[32m5.79 KB[39m
|
|
128
|
-
[32mDTS[39m [1mdist/definitions.d.ts [22m[32m3.96 KB[39m
|
|
129
|
-
[32mDTS[39m [1mdist/tools.d.ts [22m[32m3.01 KB[39m
|
|
130
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[32m83.11 KB[39m
|
package/.turbo/turbo-test.log
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
> @nebutra/agent-runtime@0.2.1 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime
|
|
3
|
-
> vitest run
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
[1m[30m[46m RUN [49m[39m[22m [36mv4.1.4 [39m[90m/home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/agent-runtime[39m
|
|
7
|
-
|
|
8
|
-
[32m✓[39m src/context-compaction.test.ts [2m([22m[2m38 tests[22m[2m)[22m[32m 131[2mms[22m[39m
|
|
9
|
-
[32m✓[39m src/channel-gateway.test.ts [2m([22m[2m32 tests[22m[2m)[22m[32m 237[2mms[22m[39m
|
|
10
|
-
[32m✓[39m src/code-review.test.ts [2m([22m[2m43 tests[22m[2m)[22m[32m 240[2mms[22m[39m
|
|
11
|
-
[32m✓[39m src/inbound-admission.test.ts [2m([22m[2m45 tests[22m[2m)[22m[32m 214[2mms[22m[39m
|
|
12
|
-
[32m✓[39m src/fuzzy-match.test.ts [2m([22m[2m36 tests[22m[2m)[22m[32m 138[2mms[22m[39m
|
|
13
|
-
[32m✓[39m src/permission-ruleset.test.ts [2m([22m[2m41 tests[22m[2m)[22m[32m 245[2mms[22m[39m
|
|
14
|
-
[32m✓[39m src/session-share.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 136[2mms[22m[39m
|
|
15
|
-
[32m✓[39m src/artifact-stream.test.ts [2m([22m[2m27 tests[22m[2m)[22m[32m 193[2mms[22m[39m
|
|
16
|
-
[32m✓[39m src/skills.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 198[2mms[22m[39m
|
|
17
|
-
[32m✓[39m src/command-suggestions.test.ts [2m([22m[2m25 tests[22m[2m)[22m[32m 157[2mms[22m[39m
|
|
18
|
-
[32m✓[39m src/commit-message.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 173[2mms[22m[39m
|
|
19
|
-
[32m✓[39m src/subagents.test.ts [2m([22m[2m20 tests[22m[2m)[22m[32m 74[2mms[22m[39m
|
|
20
|
-
[32m✓[39m src/hook-pipeline.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 289[2mms[22m[39m
|
|
21
|
-
[32m✓[39m src/memory-provider.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 139[2mms[22m[39m
|
|
22
|
-
[32m✓[39m src/project-repo.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 112[2mms[22m[39m
|
|
23
|
-
[32m✓[39m src/adapters/dispatcher-sse.test.ts [2m([22m[2m11 tests[22m[2m)[22m[32m 282[2mms[22m[39m
|
|
24
|
-
[32m✓[39m src/dispatcher.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 213[2mms[22m[39m
|
|
25
|
-
[32m✓[39m src/commands.test.ts [2m([22m[2m16 tests[22m[2m)[22m[32m 69[2mms[22m[39m
|
|
26
|
-
[32m✓[39m src/workbench.test.ts [2m([22m[2m19 tests[22m[2m)[22m[32m 113[2mms[22m[39m
|
|
27
|
-
[32m✓[39m src/adapters/mcp-catalog.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 126[2mms[22m[39m
|
|
28
|
-
[32m✓[39m src/rollout-store-persistent.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 148[2mms[22m[39m
|
|
29
|
-
[32m✓[39m src/edit-planner.test.ts [2m([22m[2m21 tests[22m[2m)[22m[32m 146[2mms[22m[39m
|
|
30
|
-
[32m✓[39m src/deployment-status.test.ts [2m([22m[2m20 tests[22m[2m)[22m[32m 69[2mms[22m[39m
|
|
31
|
-
[32m✓[39m src/durable-turn.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 54[2mms[22m[39m
|
|
32
|
-
[32m✓[39m src/skill-distillation.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 40[2mms[22m[39m
|
|
33
|
-
[32m✓[39m src/design-context.test.ts [2m([22m[2m17 tests[22m[2m)[22m[32m 49[2mms[22m[39m
|
|
34
|
-
[32m✓[39m src/mcp-bridge.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 49[2mms[22m[39m
|
|
35
|
-
[32m✓[39m src/agent-runtime.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 98[2mms[22m[39m
|
|
36
|
-
[32m✓[39m src/adapters/prisma-rollout.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 41[2mms[22m[39m
|
|
37
|
-
[32m✓[39m src/loop.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 40[2mms[22m[39m
|
|
38
|
-
[32m✓[39m src/pulsar.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 44[2mms[22m[39m
|
|
39
|
-
[32m✓[39m src/definitions.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 13[2mms[22m[39m
|
|
40
|
-
[32m✓[39m src/orchestration.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
|
|
41
|
-
[32m✓[39m src/tools.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 15[2mms[22m[39m
|
|
42
|
-
|
|
43
|
-
[2m Test Files [22m [1m[32m34 passed[39m[22m[90m (34)[39m
|
|
44
|
-
[2m Tests [22m [1m[32m641 passed[39m[22m[90m (641)[39m
|
|
45
|
-
[2m Start at [22m 08:15:22
|
|
46
|
-
[2m Duration [22m 15.08s[2m (transform 4.12s, setup 0ms, import 15.30s, tests 4.29s, environment 6ms)[22m
|
|
47
|
-
|
package/CHANGELOG.md
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
# @nebutra/agent-runtime
|
|
2
|
-
|
|
3
|
-
## 0.2.1
|
|
4
|
-
|
|
5
|
-
### Patch Changes
|
|
6
|
-
|
|
7
|
-
- Publish registry package metadata under the MIT license.
|
|
8
|
-
|
|
9
|
-
- Updated dependencies []:
|
|
10
|
-
- @nebutra/ai-primitives@0.1.1
|
|
11
|
-
- @nebutra/capability-kit@0.2.1
|
|
12
|
-
- @nebutra/execution-policy@0.1.1
|
|
13
|
-
- @nebutra/mcp@0.1.2
|
|
14
|
-
|
|
15
|
-
## 0.2.0
|
|
16
|
-
|
|
17
|
-
### Minor Changes
|
|
18
|
-
|
|
19
|
-
- [`fab751f`](https://github.com/Nebutra/Nebutra-Sailor/commit/fab751f39639251bfa006b1bfbcd8cd62f94626a) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - New adapter subpaths inside `@nebutra/agent-runtime`: concrete reusable port
|
|
20
|
-
adapters for the runtime package.
|
|
21
|
-
- `mcp-catalog`: adapts `@nebutra/mcp` `serverRegistry`/`mcpClient` into the
|
|
22
|
-
`McpServerCatalogPort` / `McpClientLike` ports — plan-gated, tenant
|
|
23
|
-
fail-closed, schema-less MCP tools still yield usable definitions,
|
|
24
|
-
composes with `activateMcpTools`.
|
|
25
|
-
- `dispatcher-sse`: runtime-agnostic transport for `ProtocolDispatcher` using
|
|
26
|
-
only Web-standard `Request`/`Response` — JSON-RPC handler (never throws),
|
|
27
|
-
incremental `text/event-stream` SSE with error-frame + `AbortSignal`
|
|
28
|
-
cancellation, listener→async-iterable notification bridge.
|
|
29
|
-
|
|
30
|
-
Dependency-injected (no hidden globals), tenant fail-closed, zero framework
|
|
31
|
-
lock-in. The durable rollout-store backend adapter is intentionally not
|
|
32
|
-
included (a correct system-of-record needs a fail-loud datastore; pending a
|
|
33
|
-
governance decision — documented in the README).
|
|
34
|
-
|
|
35
|
-
- [`4865ac9`](https://github.com/Nebutra/Nebutra-Sailor/commit/4865ac9bff6dd83635bc33e4aeb348b087dee7c7) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the IDE-coding-agent delta (over the already-absorbed CLI core).
|
|
36
|
-
- `code-review`: a pure unified-diff parser, branch-base resolution, a
|
|
37
|
-
confidence-banded review prompt (CRITICAL ≥95% / WARNING ≥85% /
|
|
38
|
-
SUGGESTION ≥75% / below → omit) with an untrusted-content injection guard
|
|
39
|
-
over diff + commit messages, an advisory/no-edit invariant, a fail-closed
|
|
40
|
-
finding parser (`ReviewParseError` rather than a fabricated empty result),
|
|
41
|
-
and a deterministic post-review mode handoff.
|
|
42
|
-
- `context-compaction`: in-session, mid-turn context-overflow recovery — a
|
|
43
|
-
1.3× token-correction estimator, a 60%-floored budget, greedy whole-message
|
|
44
|
-
packing with an oversized-message clipped-transcript fallback,
|
|
45
|
-
bounded-concurrency chunk summarization with a preserve-rubric prompt, a
|
|
46
|
-
recursive binary reduce capped at an output token limit, and a fail-closed
|
|
47
|
-
`"compact"` retry sentinel (never silently drops context).
|
|
48
|
-
- `commit-message` (WRAP): a Conventional-Commits prompt + git-context shape +
|
|
49
|
-
"regenerate materially different" negative constraint + fence/quote
|
|
50
|
-
stripping + bounded retry over the existing injected small-model seam.
|
|
51
|
-
|
|
52
|
-
Tenant-scoped / fail-closed where stateful; pure where stateless; the only
|
|
53
|
-
impurity is an injected model/summarize port. 632 package tests.
|
|
54
|
-
|
|
55
|
-
- [`67f9cd0`](https://github.com/Nebutra/Nebutra-Sailor/commit/67f9cd02c0ee908f0579efadc4292d535a758c16) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Durable rollout-store backend (the agent-runtime system-of-record).
|
|
56
|
-
- New Prisma model `AgentRolloutLine` → table `agent_rollout_lines`, additive
|
|
57
|
-
migration `20260519000000_add_agent_rollout_store` (one CREATE TABLE).
|
|
58
|
-
- `createPrismaRolloutPersistence` in `@nebutra/agent-runtime-adapters`:
|
|
59
|
-
fail-loud `RolloutPersistencePort` over a minimal injected
|
|
60
|
-
`PrismaRolloutDelegate` (no generated-client / `@nebutra/db` dependency;
|
|
61
|
-
per-tenant resolver for RLS). 6 TDD tests.
|
|
62
|
-
- Gateway route store is env-gated: `AGENT_ROLLOUT_DURABLE=1` selects the
|
|
63
|
-
durable Postgres store, default stays in-memory. Activation is a standard
|
|
64
|
-
migrate+generate deploy step (ADR 2026-05-19), not faked durability.
|
|
65
|
-
|
|
66
|
-
- [`bb1b126`](https://github.com/Nebutra/Nebutra-Sailor/commit/bb1b126e82379d88da10f43a86d9d07bccc3a224) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the git-backed-project delta (over the already-absorbed core).
|
|
67
|
-
- `project-repo`: durable project = git repo. Metadata + per-conversation
|
|
68
|
-
jsonl logs persisted as committed files (one commit per turn); history /
|
|
69
|
-
restore by commit SHA (commit graph IS the history — distinct from
|
|
70
|
-
workbench's in-memory snapshot ring); injected `GitHostPort` (no git
|
|
71
|
-
vendor lock-in); tenant ownership gate (`ownsRepo`, default-deny).
|
|
72
|
-
- `deployment-status`: commit-keyed lifecycle (`idle|deploying|live|
|
|
73
|
-
failed`), latest-status + timeline-from-commits derivations, explicit
|
|
74
|
-
`advanceState` machine; preview domain from an injected suffix (no
|
|
75
|
-
hardcoded host).
|
|
76
|
-
|
|
77
|
-
Tenant-scoped & fail-closed; pure data/logic; git + deploy hosts injected.
|
|
78
|
-
Resolved a `CommitRef` barrel collision (deployment-status structural type
|
|
79
|
-
renamed `DeploymentCommitRef`). 252 package tests.
|
|
80
|
-
|
|
81
|
-
- [`da6bfea`](https://github.com/Nebutra/Nebutra-Sailor/commit/da6bfeaf6c323a9aecefdd65c481a9852aee25b9) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Add `@nebutra/agent-runtime`: a multi-tenant agent-runtime grammar.
|
|
82
|
-
- New package re-expresses a coding-agent runtime _design_ in Sailor grammar —
|
|
83
|
-
thread/turn/item model + event lifecycle, two-axis approval/capability
|
|
84
|
-
policy, uniform tool/MCP abstraction, event-sourced rollout with compaction,
|
|
85
|
-
and an external-sandbox delegation seam.
|
|
86
|
-
- Every serialization scope, store key, and dispatch is tenant-scoped;
|
|
87
|
-
cross-tenant requests can never share a serial lane.
|
|
88
|
-
- No infra change and no in-process untrusted-code execution: the default
|
|
89
|
-
executor fails closed; real execution is delegated behind `ExternalSandbox`.
|
|
90
|
-
- Adds an off-by-default `agent-runtime-demo` feature flag gating a demo route
|
|
91
|
-
in `apps/web`.
|
|
92
|
-
|
|
93
|
-
- [`3c5c43e`](https://github.com/Nebutra/Nebutra-Sailor/commit/3c5c43e1c07c03da936d2948408f8abb4b113321) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the differentiated coding-agent-harness capabilities (the delta over
|
|
94
|
-
the already-absorbed core).
|
|
95
|
-
- `definitions`: shared layered-tier resolver (precedence + dual
|
|
96
|
-
availability/enabled gate) + frontmatter parser — backs commands, skills,
|
|
97
|
-
subagents from one kernel.
|
|
98
|
-
- `skills`: two-phase progressive disclosure (token-budget listing,
|
|
99
|
-
first-party never-truncated, path-activation), lazy body expansion,
|
|
100
|
-
per-skill model/tool override merge.
|
|
101
|
-
- `hook-pipeline`: 18-event taxonomy, config matcher/`if` resolver,
|
|
102
|
-
structured decision protocol, multi-transport (function/http/prompt),
|
|
103
|
-
parallel fan-out with deterministic precedence merge; wraps the bare
|
|
104
|
-
`ToolHooks` as the in-process transport.
|
|
105
|
-
- `commands`: unified command=skill model with dual user/model front-doors
|
|
106
|
-
and a pure arg-substitution + templating expander.
|
|
107
|
-
- `subagents`: definition resolver (tool allow−deny), fork-vs-spawn
|
|
108
|
-
context-boundary contract, typed terminal-envelope result contract, and a
|
|
109
|
-
tenant-scoped Task lifecycle registry.
|
|
110
|
-
|
|
111
|
-
All tenant-scoped & fail-closed; pure data/logic (no FS/shell/TUI — those
|
|
112
|
-
transports deliberately dropped for multi-tenant safety). 135 package tests.
|
|
113
|
-
|
|
114
|
-
- [`a29b2d9`](https://github.com/Nebutra/Nebutra-Sailor/commit/a29b2d997416edc4e421b31b777724ae70e4da54) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Add the agent loop runner — the turn engine.
|
|
115
|
-
- `runTurn()` drives a turn `loop { model_call → emit items → execute tools
|
|
116
|
-
→ feed results back }` until the model stops requesting tools or a bounded
|
|
117
|
-
step ceiling is hit. Single-threaded (shared context, no conflicting
|
|
118
|
-
sub-agent decisions).
|
|
119
|
-
- The model call is abstracted behind `ModelInvoker`, WRAPping an existing
|
|
120
|
-
model stack rather than re-porting provider/routing/fallback.
|
|
121
|
-
- Every terminal item and the turn outcome are appended to the tenant-scoped
|
|
122
|
-
rollout (resumable by replay); tool calls pass the approval gate
|
|
123
|
-
(`resolveRuleDecision` + server-initiated `ApprovalGate`); unapproved tools
|
|
124
|
-
are never dispatched. Internal failures surface as `turn.failed`, never
|
|
125
|
-
thrown to the caller.
|
|
126
|
-
|
|
127
|
-
- [`cd34724`](https://github.com/Nebutra/Nebutra-Sailor/commit/cd347242ab6874931a74aa72aa9a0d183f7dd5d3) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the multi-channel-gateway delta (over the already-absorbed core).
|
|
128
|
-
- `channel-gateway`: channel-agnostic `InboundMessage`/`OutboundMessage`
|
|
129
|
-
normalization, a `ChannelAdapter` port (parseInbound returns null for
|
|
130
|
-
non-message events, never throws on junk), tenant-scoped `ChannelRegistry`,
|
|
131
|
-
and outbound route-back through the originating channel.
|
|
132
|
-
- `inbound-admission`: deterministic tenant-prefixed `resolveSessionKey`
|
|
133
|
-
(group/DM/thread bindings, cross-tenant non-colliding), allowlist gating
|
|
134
|
-
(exact / `*` / `prefix:*`, closed-by-default), mention gating (group
|
|
135
|
-
requires @mention or reply-to-assistant; DM never), a time-injected
|
|
136
|
-
`InboundDebouncer`, composed by `admitInbound`.
|
|
137
|
-
|
|
138
|
-
Tenant-scoped & fail-closed; pure data/logic; transport + time injected.
|
|
139
|
-
Only the clean contracts were re-expressed (the messy source impl is not
|
|
140
|
-
ported). 365 package tests.
|
|
141
|
-
|
|
142
|
-
- [`447e948`](https://github.com/Nebutra/Nebutra-Sailor/commit/447e948a7153446e7bc3769395c1687c9f27c991) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Close the runtime gap — four capabilities, all tenant-scoped & fail-closed,
|
|
143
|
-
each behind an injectable port so the package keeps zero datastore/queue
|
|
144
|
-
dependency ("no infra change" stays honest):
|
|
145
|
-
- **Durable / resumable turn** (`durable-turn.ts`): `createDurableTurn` wraps
|
|
146
|
-
`runTurn` behind a `DurableTurnQueuePort`; `resume` replays the rollout and
|
|
147
|
-
re-drives an unfinished turn, idempotent and cross-tenant isolated.
|
|
148
|
-
- **Protocol dispatcher** (`dispatcher.ts`): transport-agnostic JSON-RPC
|
|
149
|
-
dispatcher serving the method registry — envelope validation fail-closed,
|
|
150
|
-
per-`scopeKey` serialization (cross-tenant never shares a lane), errors
|
|
151
|
-
mapped to JSON-RPC codes, validated notification stream.
|
|
152
|
-
- **MCP activation** (`mcp-bridge.ts`): `activateMcpTools` adapts tenant/plan
|
|
153
|
-
-visible MCP-server tools into the uniform `ToolRegistry` via an injectable
|
|
154
|
-
`McpServerCatalogPort`; duplicate names skipped, empty tenant fails closed.
|
|
155
|
-
- **Persistent rollout store** (`rollout-store-persistent.ts`):
|
|
156
|
-
`PersistentRolloutStore` over a `RolloutPersistencePort` (satisfiable by an
|
|
157
|
-
`@nebutra/audit`/`@nebutra/db` adapter) — monotonic per-(tenant,thread)
|
|
158
|
-
seq, faithful round-trip, cross-tenant isolation, typed round-trip errors.
|
|
159
|
-
|
|
160
|
-
- [`b1b9b72`](https://github.com/Nebutra/Nebutra-Sailor/commit/b1b9b7251ef6b1b84e5211dd9b4ae14a1be4b05a) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the self-improving-loop delta (over the already-absorbed core).
|
|
161
|
-
- `memory-provider`: pluggable cross-session `MemoryProvider` port (full
|
|
162
|
-
lifecycle: initialize/prefetch/syncTurn/onSessionEnd/onSessionSwitch/
|
|
163
|
-
onPreCompress/onDelegation/systemPromptBlock) + a `MemoryManager` that
|
|
164
|
-
degrades safely + memory-context injection defense (recalled text
|
|
165
|
-
banner-wrapped as reference-not-instructions; a split-safe streaming
|
|
166
|
-
scrubber strips model-forged memory banners). Vendor backends injected.
|
|
167
|
-
- `skill-distillation`: the learning loop — eligibility gate (only
|
|
168
|
-
non-trivial successful trajectories), `distillSkill` (deterministic
|
|
169
|
-
prompt → injected synthesize → skill record with `allowedTools` clamped
|
|
170
|
-
to tools the experience actually used = least privilege), `improveSkill`
|
|
171
|
-
(versioned, tenant-locked), pure `shouldNudgePersist` heuristic.
|
|
172
|
-
|
|
173
|
-
Tenant-scoped & fail-closed; pure data/logic; LLM synthesis + memory
|
|
174
|
-
backends are injected ports. 288 package tests.
|
|
175
|
-
|
|
176
|
-
- [`5ed8c38`](https://github.com/Nebutra/Nebutra-Sailor/commit/5ed8c38362e86bad51786383b81cc921b11d1b18) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the coding-agent share/permission delta (over the already-absorbed core).
|
|
177
|
-
- `permission-ruleset`: `Rule{permission,pattern,action:allow|deny|ask}` +
|
|
178
|
-
`evaluate(...rulesets)` first-match over both dimensions with fail-safe
|
|
179
|
-
`ask` default, a `wildcardMatch` with the faithful trailing `" *"`-optional
|
|
180
|
-
rule (no catastrophic backtracking), and a bash-command-prefix/arity
|
|
181
|
-
extractor (`commandPrefix`/`commandPermissionKey`).
|
|
182
|
-
- `session-share`: mint a read-only `ShareRecord{id,url,secret}` for a
|
|
183
|
-
session, revoke it, public secret-gated `verifyViewer` (no tenantId —
|
|
184
|
-
constant-time compare; documented threat model). Injected id-mint /
|
|
185
|
-
url-builder / sync-sink / store ports; kill-switch; persist-first
|
|
186
|
-
best-effort sync.
|
|
187
|
-
|
|
188
|
-
Owner plane tenant-scoped & fail-closed; viewer plane secret-gated; pure
|
|
189
|
-
where stateless; transport/crypto/store injected. 496 package tests.
|
|
190
|
-
|
|
191
|
-
- [`77c0105`](https://github.com/Nebutra/Nebutra-Sailor/commit/77c0105ce89a4ff0f5e86229cce9c2561c1b1c5f) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the site-clone / targeted-edit delta (over the already-absorbed core).
|
|
192
|
-
- `design-context`: website → structured generation seed
|
|
193
|
-
`{content, brand{colors,fonts}, screenshot, title}` — pure normalizer +
|
|
194
|
-
injected `ScrapeProvider` port (no network/provider lock-in),
|
|
195
|
-
`toGenerationSeed` bounded deterministic prompt block.
|
|
196
|
-
- `edit-planner`: pattern-driven `analyzeEditIntent` (7 EditTypes) +
|
|
197
|
-
`selectFilesForEdit` (primary/context split + deterministic system-prompt
|
|
198
|
-
builder) + generalised fast-apply (`parseEditBlocks` / `applyEditBlock`
|
|
199
|
-
with an injected merger). Targeted edit planning vs regenerate-all.
|
|
200
|
-
|
|
201
|
-
Tenant-scoped & fail-closed; pure data/logic; scrape + LLM-merge are
|
|
202
|
-
injected ports. 219 package tests.
|
|
203
|
-
|
|
204
|
-
- [`1e2d929`](https://github.com/Nebutra/Nebutra-Sailor/commit/1e2d9298f4f093cbe81199e7dcd3991116d01ea2) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the terminal-suggestion delta (over the already-absorbed core).
|
|
205
|
-
- `fuzzy-match`: smart-case subsequence fuzzy match returning
|
|
206
|
-
`{score, indices}` (lowercase query ⇒ case-insensitive; any uppercase ⇒
|
|
207
|
-
case-sensitive), case-insensitive + ignore-spaces variants (indices map to
|
|
208
|
-
original text), anchored glob-wildcard (`* ? [a-z] \`, no catastrophic
|
|
209
|
-
backtracking), stable `rankByFuzzy`. Pure, dependency-free.
|
|
210
|
-
- `command-suggestions`: `classifyMatch` with deterministic
|
|
211
|
-
exact > prefix > fuzzy score banding, `rankSuggestions` (history-boost +
|
|
212
|
-
shorter-text + stable tie-breaks), `dedupeByText` (history-wins,
|
|
213
|
-
case-insensitive), tenant-scoped `SuggestionHistoryStore` (recency ring,
|
|
214
|
-
cross-tenant isolation). Fuzzy matcher injected.
|
|
215
|
-
|
|
216
|
-
Tenant-scoped & fail-closed where stateful; pure data/logic. The source's
|
|
217
|
-
generated `command-signatures-v2` JS bundle was deliberately not ported.
|
|
218
|
-
426 package tests.
|
|
219
|
-
|
|
220
|
-
- [`509338e`](https://github.com/Nebutra/Nebutra-Sailor/commit/509338ee5ffc537c108f06cd1fc24a811a5e05b8) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Concrete Track-B coupling for the agent-runtime external-sandbox seam.
|
|
221
|
-
- Add `createHttpSandbox(baseUrl)`: an `ExternalSandbox` that delegates
|
|
222
|
-
execution over HTTP to the decoupled Rust isolator
|
|
223
|
-
(`backends/rust/sandbox`, `POST /api/v1/sandbox/exec`).
|
|
224
|
-
- Non-2xx isolator responses (e.g. a fail-closed 403 refusal) surface as
|
|
225
|
-
`SandboxDelegationError` and are never coerced into a fabricated result.
|
|
226
|
-
- The Rust isolator now mirrors the `SandboxExecRequest` /
|
|
227
|
-
`SandboxExecResult` / `CapabilityPolicy` wire shapes and is fail-closed
|
|
228
|
-
until a real isolation backend (Wasmtime/Firecracker) is wired.
|
|
229
|
-
|
|
230
|
-
- [`efe764d`](https://github.com/Nebutra/Nebutra-Sailor/commit/efe764d60085352eae304dc37dc22fda8920e587) Thanks [@TsekaLuk](https://github.com/TsekaLuk)! - Absorb the web-app-builder delta (the differentiated capabilities over the
|
|
231
|
-
already-absorbed harness core).
|
|
232
|
-
- `artifact-stream`: streaming artifact/action protocol — a chunk-fed
|
|
233
|
-
incremental parser for an `<artifact>` of ordered
|
|
234
|
-
`<action type=file|shell|start|build|data>` blocks (split-tag safe, no
|
|
235
|
-
duplicate emit), plus an action runner with a
|
|
236
|
-
`pending→running→complete|aborted|failed` state-machine, submission-order
|
|
237
|
-
queue, halt-on-failure, and execution delegated through injected ports
|
|
238
|
-
(no in-process exec / host FS). Distinct from tool-calling.
|
|
239
|
-
- `workbench`: tenant-scoped project-state model — immutable FileMap with
|
|
240
|
-
auto-derived folders, apply-file-mutation, snapshot/restore with
|
|
241
|
-
deep-copy isolation, bounded snapshot history, project diff; behind a
|
|
242
|
-
`ProjectPersistencePort` (in-memory ref impl mirroring the rollout-store
|
|
243
|
-
seam).
|
|
244
|
-
|
|
245
|
-
All tenant-scoped & fail-closed, pure data/logic. 181 package tests.
|
|
246
|
-
|
|
247
|
-
### Patch Changes
|
|
248
|
-
|
|
249
|
-
- Updated dependencies [[`5d3d7e6`](https://github.com/Nebutra/Nebutra-Sailor/commit/5d3d7e6c59cae5aa242bb988b75a9888cfd0db39)]:
|
|
250
|
-
- @nebutra/mcp@0.1.1
|
package/dist/chunk-MUF7ZZTO.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// src/sandbox.ts
|
|
2
|
-
var NoExecutorConfiguredError = class extends Error {
|
|
3
|
-
constructor() {
|
|
4
|
-
super(
|
|
5
|
-
"No ExternalSandbox configured. This runtime never executes untrusted code in-process; delegate to a decoupled isolator (Track B)."
|
|
6
|
-
);
|
|
7
|
-
this.name = "NoExecutorConfiguredError";
|
|
8
|
-
}
|
|
9
|
-
};
|
|
10
|
-
var REFUSING_SANDBOX = {
|
|
11
|
-
async exec() {
|
|
12
|
-
throw new NoExecutorConfiguredError();
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
var SandboxDelegationError = class extends Error {
|
|
16
|
-
constructor(message, status) {
|
|
17
|
-
super(message);
|
|
18
|
-
this.status = status;
|
|
19
|
-
this.name = "SandboxDelegationError";
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
function createHttpSandbox(baseUrl, fetchImpl = fetch) {
|
|
23
|
-
const endpoint = `${baseUrl.replace(/\/$/, "")}/api/v1/sandbox/exec`;
|
|
24
|
-
return {
|
|
25
|
-
async exec(request) {
|
|
26
|
-
const response = await fetchImpl(endpoint, {
|
|
27
|
-
method: "POST",
|
|
28
|
-
headers: { "content-type": "application/json" },
|
|
29
|
-
body: JSON.stringify(request)
|
|
30
|
-
});
|
|
31
|
-
if (!response.ok) {
|
|
32
|
-
const detail = await response.text().catch(() => "");
|
|
33
|
-
throw new SandboxDelegationError(
|
|
34
|
-
`Isolator refused execution (${response.status}): ${detail}`,
|
|
35
|
-
response.status
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
return await response.json();
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
function assertSafePosture(policy, allowDanger = false) {
|
|
43
|
-
if (policy.kind === "danger_full_access" && !allowDanger) {
|
|
44
|
-
throw new Error(
|
|
45
|
-
"danger_full_access capability policy refused: not permitted for multi-tenant delegation without explicit opt-in."
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export {
|
|
51
|
-
NoExecutorConfiguredError,
|
|
52
|
-
REFUSING_SANDBOX,
|
|
53
|
-
SandboxDelegationError,
|
|
54
|
-
createHttpSandbox,
|
|
55
|
-
assertSafePosture
|
|
56
|
-
};
|
|
57
|
-
//# sourceMappingURL=chunk-MUF7ZZTO.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sandbox.ts"],"sourcesContent":["/**\n * External-sandbox delegation seam (PORT — capability #11).\n *\n * Governance decision (dual-track, ExternalSandbox posture): this multi-tenant\n * web runtime NEVER executes untrusted code itself and introduces no isolation\n * infrastructure. It only:\n * 1. carries the capability policy (see ./policy),\n * 2. delegates execution to an external isolator behind this interface\n * (a self-hosted kernel sidecar — Track B — or any other executor),\n * 3. records the outcome as a `command_execution` item (see ./model).\n *\n * The upstream OS enforcers (Seatbelt / Landlock / bubblewrap / Windows\n * restricted token) are deliberately NOT ported — they are single-host and\n * out of scope for a multi-tenant web product.\n */\n\nimport type { CapabilityPolicy } from \"./policy\";\n\nexport interface SandboxExecRequest {\n /** Mandatory tenant scope — every delegated exec is tenant-bound. */\n readonly tenantId: string;\n readonly threadId: string;\n readonly command: string;\n /** The capabilities the external isolator must honor. */\n readonly capabilityPolicy: CapabilityPolicy;\n /** Optional inputs the executor should materialize before running. */\n readonly inputs?: Readonly<Record<string, string>>;\n}\n\nexport interface SandboxExecResult {\n readonly exitCode: number;\n readonly aggregatedOutput: string;\n /** Identifier of the isolator that actually ran the command. */\n readonly executedOn: string;\n}\n\n/**\n * The only thing Track A depends on for execution. Implemented by a decoupled\n * isolator over the ./protocol contract; never implemented in-process here.\n */\nexport interface ExternalSandbox {\n exec(request: SandboxExecRequest): Promise<SandboxExecResult>;\n}\n\n/**\n * Fail-closed default. Wiring this in production requires a real\n * {@link ExternalSandbox}; absent one, untrusted code never runs — by design.\n */\nexport class NoExecutorConfiguredError extends Error {\n constructor() {\n super(\n \"No ExternalSandbox configured. This runtime never executes untrusted \" +\n \"code in-process; delegate to a decoupled isolator (Track B).\",\n );\n this.name = \"NoExecutorConfiguredError\";\n }\n}\n\nexport const REFUSING_SANDBOX: ExternalSandbox = {\n async exec(): Promise<SandboxExecResult> {\n throw new NoExecutorConfiguredError();\n },\n};\n\nexport class SandboxDelegationError extends Error {\n constructor(\n message: string,\n readonly status: number,\n ) {\n super(message);\n this.name = \"SandboxDelegationError\";\n }\n}\n\n/**\n * The concrete Track-B coupling: delegate execution over HTTP to the decoupled\n * Rust isolator (`backends/rust/sandbox`, `POST /api/v1/sandbox/exec`). The\n * isolator is fail-closed; a non-2xx (e.g. 403 refusal) is surfaced as an\n * error and never coerced into a fabricated result.\n */\nexport function createHttpSandbox(\n baseUrl: string,\n fetchImpl: typeof fetch = fetch,\n): ExternalSandbox {\n const endpoint = `${baseUrl.replace(/\\/$/, \"\")}/api/v1/sandbox/exec`;\n return {\n async exec(request: SandboxExecRequest): Promise<SandboxExecResult> {\n const response = await fetchImpl(endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(request),\n });\n if (!response.ok) {\n const detail = await response.text().catch(() => \"\");\n throw new SandboxDelegationError(\n `Isolator refused execution (${response.status}): ${detail}`,\n response.status,\n );\n }\n return (await response.json()) as SandboxExecResult;\n },\n };\n}\n\n/** Guard: reject the most dangerous posture unless explicitly opted in. */\nexport function assertSafePosture(policy: CapabilityPolicy, allowDanger = false): void {\n if (policy.kind === \"danger_full_access\" && !allowDanger) {\n throw new Error(\n \"danger_full_access capability policy refused: not permitted for \" +\n \"multi-tenant delegation without explicit opt-in.\",\n );\n }\n}\n"],"mappings":";AAgDO,IAAM,4BAAN,cAAwC,MAAM;AAAA,EACnD,cAAc;AACZ;AAAA,MACE;AAAA,IAEF;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,mBAAoC;AAAA,EAC/C,MAAM,OAAmC;AACvC,UAAM,IAAI,0BAA0B;AAAA,EACtC;AACF;AAEO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EAChD,YACE,SACS,QACT;AACA,UAAM,OAAO;AAFJ;AAGT,SAAK,OAAO;AAAA,EACd;AACF;AAQO,SAAS,kBACd,SACA,YAA0B,OACT;AACjB,QAAM,WAAW,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC;AAC9C,SAAO;AAAA,IACL,MAAM,KAAK,SAAyD;AAClE,YAAM,WAAW,MAAM,UAAU,UAAU;AAAA,QACzC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,SAAS,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACnD,cAAM,IAAI;AAAA,UACR,+BAA+B,SAAS,MAAM,MAAM,MAAM;AAAA,UAC1D,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAQ,MAAM,SAAS,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;AAGO,SAAS,kBAAkB,QAA0B,cAAc,OAAa;AACrF,MAAI,OAAO,SAAS,wBAAwB,CAAC,aAAa;AACxD,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACF;","names":[]}
|
package/dist/chunk-MX2WL43P.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
// src/orchestration.ts
|
|
2
|
-
function fail(message, suggestion) {
|
|
3
|
-
throw new Error(`${message}. Suggestion: ${suggestion}`);
|
|
4
|
-
}
|
|
5
|
-
function validateBrief(brief) {
|
|
6
|
-
if (!brief.id.trim()) fail("brief.id is required", "Use a stable role or task id.");
|
|
7
|
-
if (!brief.objective.trim()) {
|
|
8
|
-
fail("brief.objective is required", "Write a concrete objective before dispatching.");
|
|
9
|
-
}
|
|
10
|
-
if (brief.allowedTools.length === 0) {
|
|
11
|
-
fail("brief.allowedTools is required", "Constrain each subagent to an explicit tool scope.");
|
|
12
|
-
}
|
|
13
|
-
if (brief.boundaries.length === 0) {
|
|
14
|
-
fail("brief.boundaries is required", "State at least one boundary for the worker.");
|
|
15
|
-
}
|
|
16
|
-
if (brief.budget.tokenLimit <= 0 || brief.budget.durationMs <= 0 || brief.budget.costUsd < 0) {
|
|
17
|
-
fail("brief.budget is invalid", "Set positive token/time caps and a non-negative cost cap.");
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
function dependencySet(briefs) {
|
|
21
|
-
const dependencies = /* @__PURE__ */ new Set();
|
|
22
|
-
for (const brief of briefs) {
|
|
23
|
-
for (const dep of brief.dependsOn ?? []) dependencies.add(dep);
|
|
24
|
-
}
|
|
25
|
-
return dependencies;
|
|
26
|
-
}
|
|
27
|
-
function topologicalOrder(briefs) {
|
|
28
|
-
const byId = new Map(briefs.map((brief) => [brief.id, brief]));
|
|
29
|
-
const visited = /* @__PURE__ */ new Set();
|
|
30
|
-
const visiting = /* @__PURE__ */ new Set();
|
|
31
|
-
const ordered = [];
|
|
32
|
-
const visit = (brief) => {
|
|
33
|
-
if (visited.has(brief.id)) return;
|
|
34
|
-
if (visiting.has(brief.id)) {
|
|
35
|
-
fail(
|
|
36
|
-
`subagent dependency cycle includes '${brief.id}'`,
|
|
37
|
-
"Remove the cycle or collapse the dependent work into one sequential brief."
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
visiting.add(brief.id);
|
|
41
|
-
for (const dep of brief.dependsOn ?? []) {
|
|
42
|
-
const dependency = byId.get(dep);
|
|
43
|
-
if (dependency) visit(dependency);
|
|
44
|
-
}
|
|
45
|
-
visiting.delete(brief.id);
|
|
46
|
-
visited.add(brief.id);
|
|
47
|
-
ordered.push(brief);
|
|
48
|
-
};
|
|
49
|
-
for (const brief of briefs) visit(brief);
|
|
50
|
-
return ordered;
|
|
51
|
-
}
|
|
52
|
-
function planSubagentDispatch(briefs, options = {}) {
|
|
53
|
-
if (briefs.length === 0) {
|
|
54
|
-
fail("at least one brief is required", "Create a concrete worker brief before dispatching.");
|
|
55
|
-
}
|
|
56
|
-
for (const brief of briefs) validateBrief(brief);
|
|
57
|
-
const dependencies = dependencySet(briefs);
|
|
58
|
-
if ((options.strategy ?? "auto") === "fanout" && dependencies.size > 0) {
|
|
59
|
-
fail(
|
|
60
|
-
"fan-out cannot run briefs that depend on each other",
|
|
61
|
-
"Use sequential dispatch for dependent work or split independent briefs only."
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
const order = topologicalOrder(briefs);
|
|
65
|
-
const strategy = options.strategy === "fanout" || options.strategy === "auto" && dependencies.size === 0 ? "fanout" : "sequential";
|
|
66
|
-
return { strategy, order };
|
|
67
|
-
}
|
|
68
|
-
async function fanOutSubagents(briefs, run) {
|
|
69
|
-
const plan = planSubagentDispatch(briefs, { strategy: "fanout" });
|
|
70
|
-
return Promise.all(plan.order.map((brief) => run(brief)));
|
|
71
|
-
}
|
|
72
|
-
function costReport(results) {
|
|
73
|
-
return {
|
|
74
|
-
totalInputTokens: results.reduce((sum, result) => sum + result.usage.inputTokens, 0),
|
|
75
|
-
totalOutputTokens: results.reduce((sum, result) => sum + result.usage.outputTokens, 0),
|
|
76
|
-
totalReasoningTokens: results.reduce(
|
|
77
|
-
(sum, result) => sum + result.usage.reasoningOutputTokens,
|
|
78
|
-
0
|
|
79
|
-
),
|
|
80
|
-
maxDurationMs: results.reduce((max, result) => Math.max(max, result.durationMs), 0),
|
|
81
|
-
subagents: results.length
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export {
|
|
86
|
-
planSubagentDispatch,
|
|
87
|
-
fanOutSubagents,
|
|
88
|
-
costReport
|
|
89
|
-
};
|
|
90
|
-
//# sourceMappingURL=chunk-MX2WL43P.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/orchestration.ts"],"sourcesContent":["import type { TurnUsage } from \"./model\";\n\nexport interface BudgetCap {\n readonly durationMs: number;\n readonly costUsd: number;\n readonly tokenLimit: number;\n}\n\nexport interface Brief {\n readonly id: string;\n readonly objective: string;\n readonly outputFormat: Record<string, unknown>;\n readonly allowedTools: readonly string[];\n readonly contextRefs: readonly string[];\n readonly boundaries: readonly string[];\n readonly budget: BudgetCap;\n readonly dependsOn?: readonly string[];\n}\n\nexport type DispatchStrategy = \"auto\" | \"sequential\" | \"fanout\";\n\nexport interface DispatchPlan {\n readonly strategy: Exclude<DispatchStrategy, \"auto\">;\n readonly order: readonly Brief[];\n}\n\nexport interface DispatchPlanOptions {\n readonly strategy?: DispatchStrategy;\n}\n\nexport interface SubagentResult {\n readonly briefId: string;\n readonly output: unknown;\n readonly usage: TurnUsage;\n readonly durationMs: number;\n}\n\nexport interface SubagentCostReport {\n readonly totalInputTokens: number;\n readonly totalOutputTokens: number;\n readonly totalReasoningTokens: number;\n readonly maxDurationMs: number;\n readonly subagents: number;\n}\n\nfunction fail(message: string, suggestion: string): never {\n throw new Error(`${message}. Suggestion: ${suggestion}`);\n}\n\nfunction validateBrief(brief: Brief): void {\n if (!brief.id.trim()) fail(\"brief.id is required\", \"Use a stable role or task id.\");\n if (!brief.objective.trim()) {\n fail(\"brief.objective is required\", \"Write a concrete objective before dispatching.\");\n }\n if (brief.allowedTools.length === 0) {\n fail(\"brief.allowedTools is required\", \"Constrain each subagent to an explicit tool scope.\");\n }\n if (brief.boundaries.length === 0) {\n fail(\"brief.boundaries is required\", \"State at least one boundary for the worker.\");\n }\n if (brief.budget.tokenLimit <= 0 || brief.budget.durationMs <= 0 || brief.budget.costUsd < 0) {\n fail(\"brief.budget is invalid\", \"Set positive token/time caps and a non-negative cost cap.\");\n }\n}\n\nfunction dependencySet(briefs: readonly Brief[]): Set<string> {\n const dependencies = new Set<string>();\n for (const brief of briefs) {\n for (const dep of brief.dependsOn ?? []) dependencies.add(dep);\n }\n return dependencies;\n}\n\nfunction topologicalOrder(briefs: readonly Brief[]): Brief[] {\n const byId = new Map(briefs.map((brief) => [brief.id, brief]));\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const ordered: Brief[] = [];\n\n const visit = (brief: Brief): void => {\n if (visited.has(brief.id)) return;\n if (visiting.has(brief.id)) {\n fail(\n `subagent dependency cycle includes '${brief.id}'`,\n \"Remove the cycle or collapse the dependent work into one sequential brief.\",\n );\n }\n visiting.add(brief.id);\n for (const dep of brief.dependsOn ?? []) {\n const dependency = byId.get(dep);\n if (dependency) visit(dependency);\n }\n visiting.delete(brief.id);\n visited.add(brief.id);\n ordered.push(brief);\n };\n\n for (const brief of briefs) visit(brief);\n return ordered;\n}\n\nexport function planSubagentDispatch(\n briefs: readonly Brief[],\n options: DispatchPlanOptions = {},\n): DispatchPlan {\n if (briefs.length === 0) {\n fail(\"at least one brief is required\", \"Create a concrete worker brief before dispatching.\");\n }\n for (const brief of briefs) validateBrief(brief);\n\n const dependencies = dependencySet(briefs);\n if ((options.strategy ?? \"auto\") === \"fanout\" && dependencies.size > 0) {\n fail(\n \"fan-out cannot run briefs that depend on each other\",\n \"Use sequential dispatch for dependent work or split independent briefs only.\",\n );\n }\n\n const order = topologicalOrder(briefs);\n const strategy =\n options.strategy === \"fanout\" || (options.strategy === \"auto\" && dependencies.size === 0)\n ? \"fanout\"\n : \"sequential\";\n return { strategy, order };\n}\n\nexport async function fanOutSubagents(\n briefs: readonly Brief[],\n run: (brief: Brief) => Promise<SubagentResult>,\n): Promise<readonly SubagentResult[]> {\n const plan = planSubagentDispatch(briefs, { strategy: \"fanout\" });\n return Promise.all(plan.order.map((brief) => run(brief)));\n}\n\nexport function costReport(results: readonly SubagentResult[]): SubagentCostReport {\n return {\n totalInputTokens: results.reduce((sum, result) => sum + result.usage.inputTokens, 0),\n totalOutputTokens: results.reduce((sum, result) => sum + result.usage.outputTokens, 0),\n totalReasoningTokens: results.reduce(\n (sum, result) => sum + result.usage.reasoningOutputTokens,\n 0,\n ),\n maxDurationMs: results.reduce((max, result) => Math.max(max, result.durationMs), 0),\n subagents: results.length,\n };\n}\n"],"mappings":";AA6CA,SAAS,KAAK,SAAiB,YAA2B;AACxD,QAAM,IAAI,MAAM,GAAG,OAAO,iBAAiB,UAAU,EAAE;AACzD;AAEA,SAAS,cAAc,OAAoB;AACzC,MAAI,CAAC,MAAM,GAAG,KAAK,EAAG,MAAK,wBAAwB,+BAA+B;AAClF,MAAI,CAAC,MAAM,UAAU,KAAK,GAAG;AAC3B,SAAK,+BAA+B,gDAAgD;AAAA,EACtF;AACA,MAAI,MAAM,aAAa,WAAW,GAAG;AACnC,SAAK,kCAAkC,oDAAoD;AAAA,EAC7F;AACA,MAAI,MAAM,WAAW,WAAW,GAAG;AACjC,SAAK,gCAAgC,6CAA6C;AAAA,EACpF;AACA,MAAI,MAAM,OAAO,cAAc,KAAK,MAAM,OAAO,cAAc,KAAK,MAAM,OAAO,UAAU,GAAG;AAC5F,SAAK,2BAA2B,2DAA2D;AAAA,EAC7F;AACF;AAEA,SAAS,cAAc,QAAuC;AAC5D,QAAM,eAAe,oBAAI,IAAY;AACrC,aAAW,SAAS,QAAQ;AAC1B,eAAW,OAAO,MAAM,aAAa,CAAC,EAAG,cAAa,IAAI,GAAG;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAmC;AAC3D,QAAM,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC;AAC7D,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,UAAmB,CAAC;AAE1B,QAAM,QAAQ,CAAC,UAAuB;AACpC,QAAI,QAAQ,IAAI,MAAM,EAAE,EAAG;AAC3B,QAAI,SAAS,IAAI,MAAM,EAAE,GAAG;AAC1B;AAAA,QACE,uCAAuC,MAAM,EAAE;AAAA,QAC/C;AAAA,MACF;AAAA,IACF;AACA,aAAS,IAAI,MAAM,EAAE;AACrB,eAAW,OAAO,MAAM,aAAa,CAAC,GAAG;AACvC,YAAM,aAAa,KAAK,IAAI,GAAG;AAC/B,UAAI,WAAY,OAAM,UAAU;AAAA,IAClC;AACA,aAAS,OAAO,MAAM,EAAE;AACxB,YAAQ,IAAI,MAAM,EAAE;AACpB,YAAQ,KAAK,KAAK;AAAA,EACpB;AAEA,aAAW,SAAS,OAAQ,OAAM,KAAK;AACvC,SAAO;AACT;AAEO,SAAS,qBACd,QACA,UAA+B,CAAC,GAClB;AACd,MAAI,OAAO,WAAW,GAAG;AACvB,SAAK,kCAAkC,oDAAoD;AAAA,EAC7F;AACA,aAAW,SAAS,OAAQ,eAAc,KAAK;AAE/C,QAAM,eAAe,cAAc,MAAM;AACzC,OAAK,QAAQ,YAAY,YAAY,YAAY,aAAa,OAAO,GAAG;AACtE;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,iBAAiB,MAAM;AACrC,QAAM,WACJ,QAAQ,aAAa,YAAa,QAAQ,aAAa,UAAU,aAAa,SAAS,IACnF,WACA;AACN,SAAO,EAAE,UAAU,MAAM;AAC3B;AAEA,eAAsB,gBACpB,QACA,KACoC;AACpC,QAAM,OAAO,qBAAqB,QAAQ,EAAE,UAAU,SAAS,CAAC;AAChE,SAAO,QAAQ,IAAI,KAAK,MAAM,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC;AAC1D;AAEO,SAAS,WAAW,SAAwD;AACjF,SAAO;AAAA,IACL,kBAAkB,QAAQ,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,MAAM,aAAa,CAAC;AAAA,IACnF,mBAAmB,QAAQ,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,MAAM,cAAc,CAAC;AAAA,IACrF,sBAAsB,QAAQ;AAAA,MAC5B,CAAC,KAAK,WAAW,MAAM,OAAO,MAAM;AAAA,MACpC;AAAA,IACF;AAAA,IACA,eAAe,QAAQ,OAAO,CAAC,KAAK,WAAW,KAAK,IAAI,KAAK,OAAO,UAAU,GAAG,CAAC;AAAA,IAClF,WAAW,QAAQ;AAAA,EACrB;AACF;","names":[]}
|