@astrale-os/cli 1.0.0-beta.1 → 1.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -12
- package/dist/astrale.js +48048 -56798
- package/dist/public/connect-core.js +2011 -30765
- package/dist/public/keys/index.js +884 -29483
- package/dist/public/paths/index.js +13101 -41459
- package/dist/types/admin/binding.d.ts +19 -0
- package/dist/types/admin/instance/client.d.ts +22 -0
- package/dist/types/admin/instance/index.d.ts +2 -0
- package/dist/types/admin/instance/model.d.ts +5 -12
- package/dist/types/connection/auth.d.ts +3 -0
- package/dist/types/connection/call.d.ts +3 -0
- package/dist/types/connection/command.d.ts +27 -0
- package/dist/types/connection/credential.d.ts +14 -0
- package/dist/types/connection/errors.d.ts +1 -0
- package/dist/types/connection/exchange.d.ts +9 -0
- package/dist/types/connection/failure/classify.d.ts +2 -0
- package/dist/types/connection/failure/index.d.ts +5 -0
- package/dist/types/connection/failure/model.d.ts +25 -0
- package/dist/types/connection/failure/render.d.ts +3 -0
- package/dist/types/connection/index.d.ts +8 -0
- package/dist/types/connection/reasons.d.ts +37 -0
- package/dist/types/connection/self.d.ts +37 -0
- package/dist/types/connection/session.d.ts +31 -0
- package/dist/types/connection/target.d.ts +38 -0
- package/dist/types/errors.d.ts +1 -1
- package/dist/types/lib/admin-instance.d.ts +17 -0
- package/dist/types/lib/admin-target.d.ts +11 -36
- package/dist/types/lib/config.d.ts +7 -59
- package/dist/types/lib/failure-debug.d.ts +1 -0
- package/dist/types/lib/idp.d.ts +26 -168
- package/dist/types/lib/instance-target.d.ts +1 -1
- package/dist/types/lib/instance.d.ts +30 -88
- package/dist/types/lib/log.d.ts +5 -3
- package/dist/types/lib/meta.d.ts +2 -2
- package/dist/types/lib/proc.d.ts +43 -0
- package/dist/types/lib/self.d.ts +9 -0
- package/dist/types/lib/update.d.ts +91 -0
- package/dist/types/lib/validation.d.ts +4 -1
- package/package.json +16 -19
- package/src/__tests__/fixtures/publication.ts +20 -0
- package/src/admin/__tests__/binding.test.ts +31 -0
- package/src/admin/__tests__/fixture.ts +101 -0
- package/src/admin/binding.ts +98 -0
- package/src/admin/catalog/.spec/api.d.ts +2 -2
- package/src/admin/catalog/__tests__/client.test.ts +20 -49
- package/src/admin/catalog/client.ts +36 -32
- package/src/admin/catalog/model.ts +3 -4
- package/src/admin/graph/.spec/api.d.ts +4 -10
- package/src/admin/graph/nodes.ts +1 -1
- package/src/admin/instance/.spec/api.d.ts +2 -2
- package/src/admin/instance/__tests__/client.test.ts +39 -164
- package/src/admin/instance/client.ts +35 -124
- package/src/admin/instance/index.ts +1 -2
- package/src/admin/instance/model.ts +11 -20
- package/src/commands/__tests__/admin-instance.test.ts +11 -8
- package/src/commands/__tests__/auth-login.test.ts +54 -1
- package/src/commands/__tests__/call-describe.test.ts +46 -33
- package/src/commands/__tests__/call.test.ts +5 -1
- package/src/commands/__tests__/domain-install-operation.test.ts +12 -7
- package/src/commands/__tests__/domain-install-owned.test.ts +6 -2
- package/src/commands/__tests__/domain-list.test.ts +63 -4
- package/src/commands/__tests__/install-identity-override.test.ts +19 -19
- package/src/commands/__tests__/instance-list-rows.test.ts +1 -1
- package/src/commands/__tests__/instance-status.test.ts +139 -0
- package/src/commands/__tests__/read-commands.test.ts +35 -10
- package/src/commands/__tests__/studio-descriptor.test.ts +22 -0
- package/src/commands/__tests__/update.test.ts +48 -19
- package/src/commands/call-describe.ts +60 -68
- package/src/commands/call.ts +43 -56
- package/src/commands/domain/install.ts +13 -17
- package/src/commands/domain/list.ts +18 -13
- package/src/commands/domain/publish.ts +14 -11
- package/src/commands/domain/uninstall.ts +2 -2
- package/src/commands/get.ts +14 -15
- package/src/commands/identity/__tests__/register.test.ts +3 -3
- package/src/commands/identity/register.ts +5 -4
- package/src/commands/instance/create.ts +8 -16
- package/src/commands/instance/delete.ts +12 -9
- package/src/commands/instance/list.ts +2 -2
- package/src/commands/instance/status.ts +66 -20
- package/src/commands/instance/use.ts +16 -12
- package/src/commands/introspect.ts +9 -16
- package/src/commands/logs.ts +24 -25
- package/src/commands/mutate.ts +6 -5
- package/src/commands/query.ts +27 -30
- package/src/commands/studio.ts +20 -0
- package/src/commands/token.ts +8 -7
- package/src/commands/update.ts +38 -14
- package/src/commands/view.ts +7 -6
- package/src/connection/.spec/api.d.ts +7 -8
- package/src/connection/.spec/architecture.md +5 -4
- package/src/connection/.spec/flows/session.ts +2 -2
- package/src/connection/.spec/laws/connection.ts +6 -2
- package/src/connection/.spec/layout.ts +1 -0
- package/src/connection/__tests__/credential.test.ts +20 -1
- package/src/connection/__tests__/errors.test.ts +43 -32
- package/src/connection/__tests__/exchange.test.ts +36 -6
- package/src/connection/__tests__/failure-fixtures.ts +39 -0
- package/src/connection/__tests__/failure-safety.test.ts +75 -0
- package/src/connection/__tests__/self.test.ts +31 -11
- package/src/connection/__tests__/session.test.ts +3 -3
- package/src/connection/__tests__/target.test.ts +1 -0
- package/src/connection/auth.ts +13 -0
- package/src/connection/call.ts +1 -1
- package/src/connection/credential.ts +2 -2
- package/src/connection/errors.ts +1 -355
- package/src/connection/exchange.ts +52 -27
- package/src/connection/failure/classify.ts +110 -0
- package/src/connection/failure/index.ts +18 -0
- package/src/connection/failure/model.ts +28 -0
- package/src/connection/failure/render.ts +116 -0
- package/src/connection/reasons.ts +16 -0
- package/src/connection/self.ts +39 -21
- package/src/connection/session.ts +19 -8
- package/src/errors.ts +3 -2
- package/src/graph/.spec/api.d.ts +12 -5
- package/src/graph/.spec/layout.ts +9 -1
- package/src/graph/__tests__/mutation.test.ts +2 -2
- package/src/graph/__tests__/query.test.ts +25 -6
- package/src/graph/class.ts +30 -0
- package/src/graph/index.ts +1 -0
- package/src/graph/query.ts +21 -32
- package/src/identity/.spec/api.d.ts +2 -2
- package/src/identity/__tests__/registration.test.ts +1 -1
- package/src/identity/registration.ts +3 -3
- package/src/keys/__tests__/keys.test.ts +4 -0
- package/src/keys/credential.ts +1 -0
- package/src/lib/__tests__/admin-target.test.ts +12 -0
- package/src/lib/__tests__/command-dx.test.ts +1 -1
- package/src/lib/__tests__/domain-publication.test.ts +138 -0
- package/src/lib/__tests__/idp-session.test.ts +22 -0
- package/src/lib/__tests__/idp.test.ts +36 -4
- package/src/lib/__tests__/instance-candidates.test.ts +1 -3
- package/src/lib/__tests__/instance-target.test.ts +7 -39
- package/src/lib/__tests__/instance.test.ts +6 -0
- package/src/lib/__tests__/log-errors.test.ts +64 -0
- package/src/lib/__tests__/studio-server-deps.test.ts +53 -16
- package/src/lib/__tests__/update.test.ts +113 -8
- package/src/lib/__tests__/view-open-intent.test.ts +0 -2
- package/src/lib/__tests__/view-server.test.ts +18 -3
- package/src/lib/__tests__/view-session.test.ts +1 -1
- package/src/lib/admin-instance.ts +14 -8
- package/src/lib/admin-target.ts +21 -2
- package/src/lib/command-dx.ts +9 -9
- package/src/lib/domain-publication.ts +104 -0
- package/src/lib/failure-debug.ts +26 -0
- package/src/lib/idp.ts +39 -4
- package/src/lib/instance-candidates.ts +2 -2
- package/src/lib/instance-target.ts +3 -14
- package/src/lib/instance.ts +22 -12
- package/src/lib/log.ts +16 -9
- package/src/lib/login-flow.ts +13 -3
- package/src/lib/meta.ts +2 -2
- package/src/lib/provision-instance.ts +34 -57
- package/src/lib/update.ts +124 -30
- package/src/lib/validation.ts +2 -2
- package/src/lib/view/resolve.ts +1 -1
- package/src/lib/view/server.ts +17 -3
- package/src/program/__tests__/program.test.ts +20 -4
- package/src/program/build.ts +2 -2
- package/src/setup/__tests__/instance-step.test.ts +27 -10
- package/src/setup/steps/instance.ts +22 -15
- package/studio/client/dist/assets/elk-api-DjmKsHXc.js +1 -0
- package/studio/client/dist/assets/index-7YHdeCxp.js +81 -0
- package/studio/client/dist/assets/index-C0FAnwNw.css +2 -0
- package/studio/client/dist/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
- package/studio/client/dist/assets/schema-studio-BilUNb6Z.css +1 -0
- package/studio/client/dist/assets/schema-studio-CABpTfvH.js +8 -0
- package/studio/client/dist/index.html +3 -2
- package/studio/package.json +10 -14
- package/studio/server/agent/ask.test.ts +1 -1
- package/studio/server/agent/bridge/grant.test.ts +1 -1
- package/studio/server/agent/bridge/routes.test.ts +1 -1
- package/studio/server/agent/bridge/stdio.ts +8 -1
- package/studio/server/agent/conversation.test.ts +10 -5
- package/studio/server/agent/conversation.ts +56 -8
- package/studio/server/agent/harness/claude/adapter.test.ts +15 -5
- package/studio/server/agent/harness/codex/loadout.ts +18 -21
- package/studio/server/agent/harness/gateway/config.ts +20 -18
- package/studio/server/agent/harness/selection.ts +9 -1
- package/studio/server/agent/prompts/anchors.test.ts +32 -36
- package/studio/server/agent/prompts/anchors.ts +20 -49
- package/studio/server/agent/prompts/system.test.ts +3 -2
- package/studio/server/agent/prompts/system.ts +6 -5
- package/studio/server/agent/prompts/turn.ts +13 -4
- package/studio/server/agent/routes.test.ts +1 -1
- package/studio/server/agent/run/completion.ts +2 -2
- package/studio/server/agent/run/coordinator.test.ts +1 -1
- package/studio/server/agent/run/preparation.ts +6 -5
- package/studio/server/agent/run/transcript.test.ts +35 -1
- package/studio/server/agent/run/transcript.ts +169 -3
- package/studio/server/agent/run/usage.test.ts +24 -0
- package/studio/server/agent/run/usage.ts +26 -1
- package/studio/server/api/canvas.ts +43 -0
- package/studio/server/api/comments.ts +85 -0
- package/studio/server/api/context.ts +61 -0
- package/studio/server/api/deployment.ts +39 -0
- package/studio/server/api/documents.ts +55 -0
- package/studio/server/api/domain.ts +59 -0
- package/studio/server/api/http.ts +45 -0
- package/studio/server/api/project.ts +57 -0
- package/studio/server/api/schema.ts +12 -0
- package/studio/server/api/views.ts +57 -0
- package/studio/server/api/workspace.ts +60 -0
- package/studio/server/api-agent-loadout.test.ts +1 -1
- package/studio/server/api.test.ts +147 -0
- package/studio/server/api.ts +20 -422
- package/studio/server/cache.test.ts +122 -0
- package/studio/server/cache.ts +162 -11
- package/studio/server/cli-consumers.test.ts +494 -0
- package/studio/server/cli.test.ts +88 -0
- package/studio/server/cli.ts +240 -0
- package/studio/server/client-package.ts +25 -1
- package/studio/server/domain.test.ts +50 -40
- package/studio/server/domain.ts +83 -52
- package/studio/server/environment/dotenv-preview.test.ts +39 -0
- package/studio/server/environment/dotenv-preview.ts +27 -0
- package/studio/server/environment/files.test.ts +53 -0
- package/studio/server/{state/env.ts → environment/files.ts} +7 -48
- package/studio/server/{state → handoff}/copy.ts +21 -6
- package/studio/server/handoff/service.test.ts +22 -0
- package/studio/server/{state/handoff.ts → handoff/service.ts} +21 -14
- package/studio/server/index.ts +1 -1
- package/studio/server/instances/active.ts +72 -0
- package/studio/server/instances/deploy-record.test.ts +31 -0
- package/studio/server/instances/deploy-record.ts +37 -0
- package/studio/server/instances/deploy.ts +56 -0
- package/studio/server/{state/instance.test.ts → instances/probe.test.ts} +25 -21
- package/studio/server/instances/probe.ts +67 -0
- package/studio/server/instances/status.test.ts +12 -0
- package/studio/server/instances/status.ts +49 -0
- package/studio/server/introspect/anatomy/client-tree.ts +57 -0
- package/studio/server/introspect/anatomy/env-fields.ts +66 -0
- package/studio/server/introspect/anatomy/schema-definition.ts +53 -0
- package/studio/server/introspect/anatomy/source.ts +181 -0
- package/studio/server/introspect/anatomy/views/routes.ts +114 -0
- package/studio/server/introspect/anatomy/views.ts +53 -0
- package/studio/server/introspect/anatomy-extras.test.ts +106 -35
- package/studio/server/introspect/anatomy-extras.ts +7 -726
- package/studio/server/introspect/anatomy.test.ts +22 -14
- package/studio/server/introspect/anatomy.ts +52 -28
- package/studio/server/introspect/bundle.ts +15 -9
- package/studio/server/introspect/canonical-schema.test.ts +93 -309
- package/studio/server/introspect/canonical-schema.ts +257 -425
- package/studio/server/introspect/config-preview.test.ts +32 -0
- package/studio/server/introspect/config-preview.ts +119 -0
- package/studio/server/introspect/core-extractor.ts +18 -127
- package/studio/server/introspect/core.ts +1 -2
- package/studio/server/introspect/diff.test.ts +18 -18
- package/studio/server/introspect/diff.ts +44 -90
- package/studio/server/introspect/extractor.ts +23 -116
- package/studio/server/introspect/hash.ts +5 -2
- package/studio/server/introspect/overlay-tsmorph.test.ts +119 -240
- package/studio/server/introspect/overlay-tsmorph.ts +7 -1305
- package/studio/server/introspect/overlay.test.ts +26 -54
- package/studio/server/introspect/overlay.ts +10 -37
- package/studio/server/introspect/revision.test.ts +54 -0
- package/studio/server/introspect/revision.ts +49 -0
- package/studio/server/introspect/runtime.test.ts +83 -143
- package/studio/server/introspect/runtime.ts +40 -11
- package/studio/server/introspect/schema-ir-json.test.ts +70 -0
- package/studio/server/introspect/schema-ir-json.ts +151 -0
- package/studio/server/introspect/schema-refs.test.ts +43 -88
- package/studio/server/introspect/schema-refs.ts +14 -49
- package/studio/server/introspect/source-overlay/annotations.ts +14 -0
- package/studio/server/introspect/source-overlay/handlers.ts +161 -0
- package/studio/server/introspect/source-overlay/kernel-calls.ts +46 -0
- package/studio/server/introspect/source-overlay/project.ts +248 -0
- package/studio/server/introspect/source-overlay/spans.ts +330 -0
- package/studio/server/json.ts +46 -0
- package/studio/server/lifecycle.ts +5 -1
- package/studio/server/sse.test.ts +26 -0
- package/studio/server/sse.ts +4 -1
- package/studio/server/state/baseline.test.ts +223 -7
- package/studio/server/state/baseline.ts +148 -34
- package/studio/server/state/comments.test.ts +66 -1
- package/studio/server/state/comments.ts +173 -10
- package/studio/server/state/context.ts +34 -2
- package/studio/server/state/documents.ts +42 -1
- package/studio/server/state/integrations.ts +27 -1
- package/studio/server/state/layout.test.ts +34 -0
- package/studio/server/state/layout.ts +44 -17
- package/studio/server/state/settings.ts +29 -22
- package/studio/server/state/store.test.ts +122 -0
- package/studio/server/state/store.ts +66 -17
- package/studio/server/state/visibility.ts +22 -11
- package/studio/server/views/model.test.ts +57 -0
- package/studio/server/views/model.ts +66 -0
- package/studio/server/views/runtime.ts +40 -0
- package/studio/server/views/selection-repository.test.ts +31 -0
- package/studio/server/views/selection-repository.ts +60 -0
- package/studio/server/views/session.test.ts +73 -0
- package/studio/server/views/session.ts +166 -0
- package/studio/server/views/target.test.ts +78 -0
- package/studio/server/views/target.ts +222 -0
- package/studio/server/watch.test.ts +11 -11
- package/studio/server/watch.ts +9 -5
- package/studio/server/workspace/catalog.test.ts +17 -0
- package/studio/server/workspace/catalog.ts +43 -0
- package/studio/server/{state → workspace}/create.test.ts +1 -1
- package/studio/server/{state → workspace}/create.ts +1 -1
- package/studio/server/{state → workspace}/git.ts +1 -1
- package/studio/server/workspace/updates.ts +83 -0
- package/studio/server/workspace-state.ts +1 -1
- package/studio/server/workspace-watch.ts +2 -2
- package/studio/shared/contracts/README.md +16 -0
- package/studio/shared/contracts/agent.ts +270 -0
- package/studio/shared/contracts/runtime.ts +50 -0
- package/studio/shared/contracts/schema.ts +393 -0
- package/studio/shared/contracts/surface.test.ts +317 -0
- package/studio/shared/contracts/workspace.ts +265 -0
- package/studio/shared/layout.test.ts +116 -0
- package/studio/shared/schema/identity.test.ts +34 -0
- package/studio/shared/schema/identity.ts +68 -0
- package/studio/shared/types.ts +11 -1099
- package/studio/tsconfig.json +1 -1
- package/viewer/dist/main.js +40 -61
- package/.check-workspace.cjs +0 -40
- package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
- package/studio/client/dist/assets/elk-api-D2xgMJvi.js +0 -1
- package/studio/client/dist/assets/index-BMdnsIJA.css +0 -1
- package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
- package/studio/client/dist/assets/index-D-vRV8w7.js +0 -8
- package/studio/client/dist/assets/index-LGSWRrk8.js +0 -81
- package/studio/server/state/catalog.ts +0 -117
- package/studio/server/state/instance.ts +0 -280
- package/studio/server/state/updates.ts +0 -63
- package/studio/server/state/views.test.ts +0 -286
- package/studio/server/state/views.ts +0 -535
|
@@ -187,7 +187,7 @@ describe('program composition', () => {
|
|
|
187
187
|
'whoami',
|
|
188
188
|
])
|
|
189
189
|
expect(createHash('sha256').update(JSON.stringify(surface)).digest('hex')).toBe(
|
|
190
|
-
'
|
|
190
|
+
'56d2049ff4f7ddd24abdd9df39d4a827757f1b39a92dc7fb55933105d722f97f',
|
|
191
191
|
)
|
|
192
192
|
})
|
|
193
193
|
|
|
@@ -213,6 +213,19 @@ describe('help contract — no internal SPEC anchors leak to users', () => {
|
|
|
213
213
|
|
|
214
214
|
expect(offenders).toEqual([])
|
|
215
215
|
})
|
|
216
|
+
|
|
217
|
+
test('Kernel and Instance vocabulary does not expose retired Host or Interface concepts', async () => {
|
|
218
|
+
const program = await buildProgram()
|
|
219
|
+
const help = allCommands(program)
|
|
220
|
+
.map((command) => command.helpInformation())
|
|
221
|
+
.join('\n')
|
|
222
|
+
|
|
223
|
+
expect(help).not.toContain('host.astrale.ai')
|
|
224
|
+
expect(help).not.toContain(':interface.')
|
|
225
|
+
expect(help).not.toContain('Class or Interface')
|
|
226
|
+
expect(help).not.toContain('emulated host')
|
|
227
|
+
expect(help).not.toContain('Host shell')
|
|
228
|
+
})
|
|
216
229
|
})
|
|
217
230
|
|
|
218
231
|
describe('help contract — IdP/auth surface is registered', () => {
|
|
@@ -251,14 +264,17 @@ describe('help contract — admin target surface is registered', () => {
|
|
|
251
264
|
expect(adminUse?.helpInformation()).not.toContain('--issuer <url>')
|
|
252
265
|
})
|
|
253
266
|
|
|
254
|
-
test('instance create
|
|
267
|
+
test('instance create delegates infrastructure placement to Admin', async () => {
|
|
255
268
|
const program = await buildProgram()
|
|
256
269
|
const instanceCreate = allCommands(program).find((command) => command.name() === 'create')
|
|
257
270
|
const help = instanceCreate?.helpInformation() ?? ''
|
|
258
271
|
|
|
259
|
-
expect(help).toContain('
|
|
272
|
+
expect(help).toContain('Provision an instance through the Admin control plane')
|
|
273
|
+
expect(help).not.toContain('Host')
|
|
274
|
+
expect(help).not.toContain('Fleet')
|
|
275
|
+
expect(help).not.toContain('--host-id')
|
|
260
276
|
expect(help).not.toContain('--no-use')
|
|
261
|
-
expect(help).not.toContain('Instance.init
|
|
277
|
+
expect(help).not.toContain('Instance.init')
|
|
262
278
|
})
|
|
263
279
|
})
|
|
264
280
|
|
package/src/program/build.ts
CHANGED
|
@@ -159,7 +159,7 @@ Command groups:
|
|
|
159
159
|
|
|
160
160
|
Path syntax:
|
|
161
161
|
/:origin Domain root
|
|
162
|
-
/:origin:class.Name Class node
|
|
162
|
+
/:origin:class.Name Class node
|
|
163
163
|
/:origin:class.Name:method Static callable
|
|
164
164
|
<nodePath>::method Instance method dispatch — double colon ::
|
|
165
165
|
@nodeId Reference a node by its UID
|
|
@@ -174,7 +174,7 @@ Examples:
|
|
|
174
174
|
$ astrale instance status staging
|
|
175
175
|
$ astrale token --audience shell.astrale.ai --ttl 3600
|
|
176
176
|
$ astrale query /:notes.example.dev:class.Note --limit 50
|
|
177
|
-
$ astrale introspect /:
|
|
177
|
+
$ astrale introspect /:kernel.astrale.ai:class.Identity:whois
|
|
178
178
|
$ astrale query --file query.v6.json --cursor "$CURSOR"
|
|
179
179
|
`,
|
|
180
180
|
)
|
|
@@ -27,11 +27,15 @@ function instance(slug: string, state: OwnedInstanceInfo['state'] = 'ready'): Ow
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
function inventory(instances: OwnedInstanceInfo[], identity?: string) {
|
|
31
|
+
return { instances, ...(identity ? { identity } : {}) }
|
|
32
|
+
}
|
|
33
|
+
|
|
30
34
|
function dependencies(
|
|
31
35
|
overrides: Partial<InstanceSetupDependencies> = {},
|
|
32
36
|
): InstanceSetupDependencies {
|
|
33
37
|
return {
|
|
34
|
-
fetchOwned: mock(async () => []),
|
|
38
|
+
fetchOwned: mock(async () => inventory([])),
|
|
35
39
|
adopt: mock(async () => {}),
|
|
36
40
|
selectReady: mock(async (instances) => instances[0] ?? null),
|
|
37
41
|
confirmCreate: mock(async () => true),
|
|
@@ -48,12 +52,14 @@ describe('setup owned-instance reconciliation', () => {
|
|
|
48
52
|
test('silently adopts the sole owned ready instance', async () => {
|
|
49
53
|
const ready = instance('only')
|
|
50
54
|
const failed = instance('old-attempt', 'failed')
|
|
51
|
-
const deps = dependencies({
|
|
55
|
+
const deps = dependencies({
|
|
56
|
+
fetchOwned: mock(async () => inventory([failed, ready], 'manager')),
|
|
57
|
+
})
|
|
52
58
|
|
|
53
59
|
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('fixed')
|
|
54
60
|
|
|
55
61
|
expect(deps.adopt).toHaveBeenCalledTimes(1)
|
|
56
|
-
expect(deps.adopt).toHaveBeenCalledWith(ready)
|
|
62
|
+
expect(deps.adopt).toHaveBeenCalledWith(ready, 'manager')
|
|
57
63
|
expect(deps.selectReady).not.toHaveBeenCalled()
|
|
58
64
|
expect(deps.confirmCreate).not.toHaveBeenCalled()
|
|
59
65
|
expect(deps.provision).not.toHaveBeenCalled()
|
|
@@ -64,14 +70,14 @@ describe('setup owned-instance reconciliation', () => {
|
|
|
64
70
|
const second = instance('second')
|
|
65
71
|
const pending = instance('pending', 'provisioning')
|
|
66
72
|
const deps = dependencies({
|
|
67
|
-
fetchOwned: mock(async () => [first, pending, second]),
|
|
73
|
+
fetchOwned: mock(async () => inventory([first, pending, second], 'manager')),
|
|
68
74
|
selectReady: mock(async (instances) => instances[1] ?? null),
|
|
69
75
|
})
|
|
70
76
|
|
|
71
77
|
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('fixed')
|
|
72
78
|
|
|
73
79
|
expect(deps.selectReady).toHaveBeenCalledWith([first, second])
|
|
74
|
-
expect(deps.adopt).toHaveBeenCalledWith(second)
|
|
80
|
+
expect(deps.adopt).toHaveBeenCalledWith(second, 'manager')
|
|
75
81
|
expect(deps.confirmCreate).not.toHaveBeenCalled()
|
|
76
82
|
expect(deps.provision).not.toHaveBeenCalled()
|
|
77
83
|
})
|
|
@@ -80,7 +86,7 @@ describe('setup owned-instance reconciliation', () => {
|
|
|
80
86
|
const first = instance('first')
|
|
81
87
|
const second = instance('second')
|
|
82
88
|
const deps = dependencies({
|
|
83
|
-
fetchOwned: mock(async () => [first, second]),
|
|
89
|
+
fetchOwned: mock(async () => inventory([first, second])),
|
|
84
90
|
selectReady: mock(async () => null),
|
|
85
91
|
})
|
|
86
92
|
|
|
@@ -165,7 +171,9 @@ describe('setup owned-instance reconciliation', () => {
|
|
|
165
171
|
phase: 'installing:default-domains',
|
|
166
172
|
}
|
|
167
173
|
const failed = { ...instance('broken', 'failed'), error: 'postInstall failed' }
|
|
168
|
-
const deps = dependencies({
|
|
174
|
+
const deps = dependencies({
|
|
175
|
+
fetchOwned: mock(async () => inventory([provisioning, failed])),
|
|
176
|
+
})
|
|
169
177
|
const logged: string[] = []
|
|
170
178
|
const original = console.log
|
|
171
179
|
console.log = mock((...args: unknown[]) => {
|
|
@@ -218,10 +226,10 @@ describe('owned-instance adoption', () => {
|
|
|
218
226
|
console.log = mock(() => {})
|
|
219
227
|
|
|
220
228
|
try {
|
|
221
|
-
await adoptOwnedInstance(owned, {
|
|
229
|
+
await adoptOwnedInstance(owned, 'manager', {
|
|
222
230
|
upsert: mock(async (...args) => {
|
|
223
231
|
calls.push(['upsert', ...args])
|
|
224
|
-
return {}
|
|
232
|
+
return { entry: {} }
|
|
225
233
|
}),
|
|
226
234
|
activate: mock(async (...args) => {
|
|
227
235
|
calls.push(['activate', ...args])
|
|
@@ -232,7 +240,16 @@ describe('owned-instance adoption', () => {
|
|
|
232
240
|
}
|
|
233
241
|
|
|
234
242
|
expect(calls).toEqual([
|
|
235
|
-
[
|
|
243
|
+
[
|
|
244
|
+
'upsert',
|
|
245
|
+
{
|
|
246
|
+
key: 'existing',
|
|
247
|
+
slug: 'existing',
|
|
248
|
+
url: 'https://existing.eu.astrale.ai',
|
|
249
|
+
organizationId: 'org_existing',
|
|
250
|
+
defaultIdentity: 'manager',
|
|
251
|
+
},
|
|
252
|
+
],
|
|
236
253
|
['activate', 'existing'],
|
|
237
254
|
])
|
|
238
255
|
})
|
|
@@ -4,7 +4,7 @@ import type { OwnedInstanceInfo } from '../../lib/admin-instance'
|
|
|
4
4
|
import type { SetupContext, SetupStep } from '../types'
|
|
5
5
|
|
|
6
6
|
import { AstraleError } from '../../errors'
|
|
7
|
-
import {
|
|
7
|
+
import { listOwnedInstancesWithIdentity } from '../../lib/admin-instance'
|
|
8
8
|
import { normalizeInstanceKernelUrl, setActive, upsertManagedBookmark } from '../../lib/instance'
|
|
9
9
|
import { readLocalStatus } from '../../lib/local-status'
|
|
10
10
|
import { log, withSpinner } from '../../lib/log'
|
|
@@ -14,8 +14,11 @@ import { provisionInstance, type ProvisionResult } from '../../lib/provision-ins
|
|
|
14
14
|
import { guiOrigin, slugError } from '../util'
|
|
15
15
|
|
|
16
16
|
export type InstanceSetupDependencies = {
|
|
17
|
-
fetchOwned: (ctx: SetupContext) => Promise<
|
|
18
|
-
|
|
17
|
+
fetchOwned: (ctx: SetupContext) => Promise<{
|
|
18
|
+
readonly instances: OwnedInstanceInfo[]
|
|
19
|
+
readonly identity?: string
|
|
20
|
+
}>
|
|
21
|
+
adopt: (info: OwnedInstanceInfo, identity?: string) => Promise<void>
|
|
19
22
|
selectReady: (instances: OwnedInstanceInfo[]) => Promise<OwnedInstanceInfo | null>
|
|
20
23
|
confirmCreate: () => Promise<boolean>
|
|
21
24
|
promptSlug: () => Promise<string | undefined>
|
|
@@ -23,12 +26,7 @@ export type InstanceSetupDependencies = {
|
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
export type OwnedInstanceAdoptionDependencies = {
|
|
26
|
-
upsert:
|
|
27
|
-
key: string,
|
|
28
|
-
slug: string,
|
|
29
|
-
url: string,
|
|
30
|
-
organizationId?: string,
|
|
31
|
-
) => Promise<{ repointedFrom?: string }>
|
|
29
|
+
upsert: typeof upsertManagedBookmark
|
|
32
30
|
activate: (slug: string) => Promise<unknown>
|
|
33
31
|
}
|
|
34
32
|
|
|
@@ -41,12 +39,19 @@ function hero(slug: string, kernelUrl: string): void {
|
|
|
41
39
|
|
|
42
40
|
export async function adoptOwnedInstance(
|
|
43
41
|
info: OwnedInstanceInfo,
|
|
42
|
+
defaultIdentity?: string,
|
|
44
43
|
deps: OwnedInstanceAdoptionDependencies = {
|
|
45
44
|
upsert: upsertManagedBookmark,
|
|
46
45
|
activate: setActive,
|
|
47
46
|
},
|
|
48
47
|
): Promise<void> {
|
|
49
|
-
const { repointedFrom } = await deps.upsert(
|
|
48
|
+
const { repointedFrom } = await deps.upsert({
|
|
49
|
+
key: info.slug,
|
|
50
|
+
slug: info.slug,
|
|
51
|
+
url: info.url,
|
|
52
|
+
...(info.organizationId ? { organizationId: info.organizationId } : {}),
|
|
53
|
+
...(defaultIdentity ? { defaultIdentity } : {}),
|
|
54
|
+
})
|
|
50
55
|
await deps.activate(info.slug)
|
|
51
56
|
if (repointedFrom) {
|
|
52
57
|
log.warn(
|
|
@@ -61,7 +66,7 @@ function defaultDependencies(ctx: SetupContext): InstanceSetupDependencies {
|
|
|
61
66
|
return {
|
|
62
67
|
fetchOwned: (setupCtx) =>
|
|
63
68
|
withSpinner('Checking for existing instances', !setupCtx.machine, () =>
|
|
64
|
-
|
|
69
|
+
listOwnedInstancesWithIdentity(setupCtx.opts),
|
|
65
70
|
),
|
|
66
71
|
adopt: adoptOwnedInstance,
|
|
67
72
|
selectReady: (instances) =>
|
|
@@ -90,9 +95,9 @@ export async function ensureOwnedInstance(
|
|
|
90
95
|
ctx: SetupContext,
|
|
91
96
|
deps: InstanceSetupDependencies = defaultDependencies(ctx),
|
|
92
97
|
): Promise<'fixed' | 'skipped'> {
|
|
93
|
-
let
|
|
98
|
+
let inventory: Awaited<ReturnType<InstanceSetupDependencies['fetchOwned']>>
|
|
94
99
|
try {
|
|
95
|
-
|
|
100
|
+
inventory = await deps.fetchOwned(ctx)
|
|
96
101
|
} catch (cause) {
|
|
97
102
|
const detail = cause instanceof Error ? cause.message : String(cause)
|
|
98
103
|
throw new AstraleError(
|
|
@@ -102,9 +107,11 @@ export async function ensureOwnedInstance(
|
|
|
102
107
|
)
|
|
103
108
|
}
|
|
104
109
|
|
|
110
|
+
const owned = inventory.instances
|
|
111
|
+
|
|
105
112
|
const ready = owned.filter((info) => info.state === 'ready')
|
|
106
113
|
if (ready.length === 1) {
|
|
107
|
-
await deps.adopt(ready[0]
|
|
114
|
+
await deps.adopt(ready[0]!, inventory.identity)
|
|
108
115
|
return 'fixed'
|
|
109
116
|
}
|
|
110
117
|
|
|
@@ -114,7 +121,7 @@ export async function ensureOwnedInstance(
|
|
|
114
121
|
log.dim(' Skipped — no active instance set.')
|
|
115
122
|
return 'skipped'
|
|
116
123
|
}
|
|
117
|
-
await deps.adopt(choice)
|
|
124
|
+
await deps.adopt(choice, inventory.identity)
|
|
118
125
|
return 'fixed'
|
|
119
126
|
}
|
|
120
127
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as e,t}from"./rolldown-runtime-Dd_uD5pT.js";var n=t(((t,n)=>{(function(e){if(typeof t==`object`&&n!==void 0)n.exports=e();else if(typeof define==`function`&&define.amd)define([],e);else{var r=typeof window<`u`?window:typeof global<`u`?global:typeof self<`u`?self:this;r.ELK=e()}})(function(){return(function(){function t(n,r,i){function a(s,c){if(!r[s]){if(!n[s]){var l=typeof e==`function`&&e;if(!c&&l)return l(s,!0);if(o)return o(s,!0);var u=Error(`Cannot find module '`+s+`'`);throw u.code=`MODULE_NOT_FOUND`,u}var d=r[s]={exports:{}};n[s][0].call(d.exports,function(e){var t=n[s][1][e];return a(t||e)},d,d.exports,t,n,r,i)}return r[s].exports}for(var o=typeof e==`function`&&e,s=0;s<i.length;s++)a(i[s]);return a}return t})()({1:[function(e,t,n){Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;function r(e){"@babel/helpers - typeof";return r=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},r(e)}function i(e,t){if(!(e instanceof t))throw TypeError(`Cannot call a class as a function`)}function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,`value`in r&&(r.writable=!0),Object.defineProperty(e,s(r.key),r)}}function o(e,t,n){return t&&a(e.prototype,t),n&&a(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function s(e){var t=c(e,`string`);return r(t)==`symbol`?t:t+``}function c(e,t){if(r(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var i=n.call(e,t||`default`);if(r(i)!=`object`)return i;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}n.default=function(){function e(){var t=this,n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},r=n.defaultLayoutOptions,a=r===void 0?{}:r,o=n.algorithms,s=o===void 0?[`layered`,`stress`,`mrtree`,`radial`,`force`,`disco`,`sporeOverlap`,`sporeCompaction`,`rectpacking`]:o,c=n.workerFactory,u=n.workerUrl;if(i(this,e),this.defaultLayoutOptions=a,this.initialized=!1,u===void 0&&c===void 0)throw Error(`Cannot construct an ELK without both 'workerUrl' and 'workerFactory'.`);var d=c;u!==void 0&&c===void 0&&(d=function(e){return new Worker(e)});var f=d(u);if(typeof f.postMessage!=`function`)throw TypeError(`Created worker does not provide the required 'postMessage' function.`);this.worker=new l(f),this.worker.postMessage({cmd:`register`,algorithms:s}).then(function(e){return t.initialized=!0}).catch(console.err)}return o(e,[{key:`layout`,value:function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=t.layoutOptions,r=n===void 0?this.defaultLayoutOptions:n,i=t.logging,a=i!==void 0&&i,o=t.measureExecutionTime,s=o!==void 0&&o;return e?this.worker.postMessage({cmd:`layout`,graph:e,layoutOptions:r,options:{logging:a,measureExecutionTime:s}}):Promise.reject(Error(`Missing mandatory parameter 'graph'.`))}},{key:`knownLayoutAlgorithms`,value:function(){return this.worker.postMessage({cmd:`algorithms`})}},{key:`knownLayoutOptions`,value:function(){return this.worker.postMessage({cmd:`options`})}},{key:`knownLayoutCategories`,value:function(){return this.worker.postMessage({cmd:`categories`})}},{key:`terminateWorker`,value:function(){this.worker&&this.worker.terminate()}}])}();var l=function(){function e(t){var n=this;if(i(this,e),t===void 0)throw Error(`Missing mandatory parameter 'worker'.`);this.resolvers={},this.worker=t,this.worker.onmessage=function(e){setTimeout(function(){n.receive(n,e)},0)}}return o(e,[{key:`postMessage`,value:function(e){var t=this.id||0;this.id=t+1,e.id=t;var n=this;return new Promise(function(r,i){n.resolvers[t]=function(e,t){e?(n.convertGwtStyleError(e),i(e)):r(t)},n.worker.postMessage(e)})}},{key:`receive`,value:function(e,t){var n=t.data,r=e.resolvers[n.id];r&&(delete e.resolvers[n.id],n.error?r(n.error):r(null,n.data))}},{key:`terminate`,value:function(){this.worker&&this.worker.terminate()}},{key:`convertGwtStyleError`,value:function(e){if(e){var t=e.__java$exception;t&&(t.cause&&t.cause.backingJsObject&&(e.cause=t.cause.backingJsObject,this.convertGwtStyleError(e.cause)),delete e.__java$exception)}}}])}()},{}],2:[function(e,t,n){var r=e("./elk-api.js").default;Object.defineProperty(t.exports,"__esModule",{value:!0}),t.exports=r,r.default=r},{"./elk-api.js":1}]},{},[2])(2)})}));export default n();
|