@astrale-os/cli 1.0.0-beta.0 → 1.0.0-beta.10
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 +51494 -56307
- package/dist/public/connect-core.js +2028 -26846
- package/dist/public/keys/index.js +1755 -40694
- package/dist/public/paths/index.js +859 -39518
- 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 +6 -2
- package/dist/types/lib/failure-debug.d.ts +1 -0
- package/dist/types/lib/idp.d.ts +7 -0
- package/dist/types/lib/instance-target.d.ts +1 -1
- package/dist/types/lib/instance.d.ts +10 -2
- 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 +131 -0
- package/package.json +8 -10
- 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 +40 -163
- package/src/admin/instance/client.ts +35 -137
- 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 +95 -0
- 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 +68 -22
- 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 +1 -1
- 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/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-D2xgMJvi.js → elk-api-ByzoDZWH.js} +1 -1
- package/studio/client/dist/assets/index-B0RCgUOT.js +8 -0
- package/studio/client/dist/assets/index-BiGR8Oo9.css +1 -0
- package/studio/client/dist/assets/index-N8J8EKlB.js +81 -0
- package/studio/client/dist/index.html +2 -2
- package/studio/package.json +5 -10
- 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/index-BMdnsIJA.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
package/src/lib/update.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
chmod,
|
|
4
|
+
copyFile,
|
|
5
|
+
mkdir,
|
|
6
|
+
mkdtemp,
|
|
7
|
+
readFile,
|
|
8
|
+
realpath,
|
|
9
|
+
rename,
|
|
10
|
+
rm,
|
|
11
|
+
writeFile,
|
|
12
|
+
} from 'node:fs/promises'
|
|
3
13
|
import { tmpdir } from 'node:os'
|
|
4
14
|
import { dirname, join } from 'node:path'
|
|
5
15
|
import { z } from 'zod'
|
|
@@ -9,11 +19,11 @@ import { INSTALL_PATH } from '../state/index'
|
|
|
9
19
|
import { run } from './proc'
|
|
10
20
|
|
|
11
21
|
const DEFAULT_REPO = 'astrale-os/cli'
|
|
12
|
-
const
|
|
22
|
+
export const DEFAULT_UPDATE_CHANNEL = 'beta'
|
|
13
23
|
|
|
14
24
|
export const InstallMetadataSchema = z.object({
|
|
15
25
|
method: z.literal('script'),
|
|
16
|
-
channel: z.string().min(1).default(
|
|
26
|
+
channel: z.string().min(1).default(DEFAULT_UPDATE_CHANNEL),
|
|
17
27
|
version: z.string().min(1).optional(),
|
|
18
28
|
repo: z.string().min(1).default(DEFAULT_REPO),
|
|
19
29
|
bin: z.string().min(1),
|
|
@@ -61,9 +71,26 @@ export type UpdateRequest = {
|
|
|
61
71
|
currentVersion: string
|
|
62
72
|
platform?: Platform
|
|
63
73
|
installPath?: string
|
|
74
|
+
execution?: UpdateExecution
|
|
64
75
|
}
|
|
65
76
|
|
|
77
|
+
export type UpdateExecution =
|
|
78
|
+
| { kind: 'standalone'; executable: string }
|
|
79
|
+
| { kind: 'package-managed'; executable: string }
|
|
80
|
+
|
|
81
|
+
const admittedScriptInstall = Symbol('admittedScriptInstall')
|
|
82
|
+
export type AdmittedScriptInstall = Readonly<{
|
|
83
|
+
metadata: InstallMetadata
|
|
84
|
+
executable: string
|
|
85
|
+
[admittedScriptInstall]: true
|
|
86
|
+
}>
|
|
87
|
+
|
|
66
88
|
export type UpdateResult =
|
|
89
|
+
| {
|
|
90
|
+
status: 'managed'
|
|
91
|
+
currentVersion: string
|
|
92
|
+
executable: string
|
|
93
|
+
}
|
|
67
94
|
| {
|
|
68
95
|
status: 'up-to-date'
|
|
69
96
|
currentVersion: string
|
|
@@ -106,42 +133,99 @@ export function platformKey(platform: Platform): string {
|
|
|
106
133
|
return `${platform.os}-${platform.arch}`
|
|
107
134
|
}
|
|
108
135
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
136
|
+
export function classifyUpdateExecution(input: {
|
|
137
|
+
bunVersion?: string
|
|
138
|
+
executable: string
|
|
139
|
+
entry?: string
|
|
140
|
+
}): UpdateExecution {
|
|
141
|
+
return input.bunVersion && input.entry?.startsWith('/$bunfs/')
|
|
142
|
+
? { kind: 'standalone', executable: input.executable }
|
|
143
|
+
: { kind: 'package-managed', executable: input.executable }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function detectUpdateExecution(): UpdateExecution {
|
|
147
|
+
return classifyUpdateExecution({
|
|
148
|
+
bunVersion: (process.versions as { bun?: string }).bun,
|
|
149
|
+
executable: process.execPath,
|
|
150
|
+
entry: process.argv[1],
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function packageManagedUpdateError(executable: string): AstraleError {
|
|
155
|
+
return new AstraleError(
|
|
156
|
+
'UPDATE_PACKAGE_MANAGED',
|
|
157
|
+
'This Astrale build is managed by your package manager.',
|
|
158
|
+
`Active binary: ${executable}. Update it with npm, pnpm, or bun; or put the official script installation first on PATH.`,
|
|
159
|
+
)
|
|
116
160
|
}
|
|
117
161
|
|
|
118
162
|
export async function readInstallMetadata(path = INSTALL_PATH): Promise<InstallMetadata> {
|
|
119
163
|
let raw: string
|
|
120
164
|
try {
|
|
121
165
|
raw = await readFile(path, 'utf8')
|
|
122
|
-
} catch {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
: new AstraleError(
|
|
130
|
-
'UPDATE_PACKAGE_MANAGED',
|
|
131
|
-
'This Astrale build is managed by your package manager.',
|
|
132
|
-
'Update with: npm install -g @astrale-os/cli@latest (or pnpm/bun)',
|
|
133
|
-
)
|
|
166
|
+
} catch (error) {
|
|
167
|
+
if (!isMissingFile(error)) throw error
|
|
168
|
+
throw new AstraleError(
|
|
169
|
+
'UPDATE_NOT_SCRIPT_INSTALLED',
|
|
170
|
+
'Astrale was not installed by the official install script.',
|
|
171
|
+
'Reinstall with: curl -fsSL https://raw.githubusercontent.com/astrale-os/cli/main/install.sh | sh',
|
|
172
|
+
)
|
|
134
173
|
}
|
|
135
174
|
|
|
136
|
-
|
|
175
|
+
let decoded: unknown
|
|
176
|
+
try {
|
|
177
|
+
decoded = JSON.parse(raw)
|
|
178
|
+
} catch {
|
|
179
|
+
throw badInstallMetadata(path)
|
|
180
|
+
}
|
|
181
|
+
const parsed = InstallMetadataSchema.safeParse(decoded)
|
|
137
182
|
if (!parsed.success) {
|
|
183
|
+
throw badInstallMetadata(path)
|
|
184
|
+
}
|
|
185
|
+
return parsed.data
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function isMissingFile(error: unknown): error is NodeJS.ErrnoException {
|
|
189
|
+
return error instanceof Error && 'code' in error && error.code === 'ENOENT'
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function badInstallMetadata(path: string): AstraleError {
|
|
193
|
+
return new AstraleError(
|
|
194
|
+
'UPDATE_BAD_INSTALL_METADATA',
|
|
195
|
+
`Invalid install metadata at ${path}.`,
|
|
196
|
+
'Reinstall with: curl -fsSL https://raw.githubusercontent.com/astrale-os/cli/main/install.sh | sh',
|
|
197
|
+
)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export async function admitScriptInstall(
|
|
201
|
+
meta: InstallMetadata,
|
|
202
|
+
execution: Extract<UpdateExecution, { kind: 'standalone' }>,
|
|
203
|
+
): Promise<AdmittedScriptInstall> {
|
|
204
|
+
const [running, recorded] = await Promise.all([
|
|
205
|
+
realpathIfExists(execution.executable),
|
|
206
|
+
realpathIfExists(meta.bin),
|
|
207
|
+
])
|
|
208
|
+
if (running === undefined || recorded === undefined || running !== recorded) {
|
|
138
209
|
throw new AstraleError(
|
|
139
|
-
'
|
|
140
|
-
|
|
141
|
-
|
|
210
|
+
'UPDATE_INSTALL_MISMATCH',
|
|
211
|
+
'The running Astrale binary does not own the recorded script installation.',
|
|
212
|
+
`Running binary: ${execution.executable}; recorded binary: ${meta.bin}. Refusing to replace a different installation.`,
|
|
142
213
|
)
|
|
143
214
|
}
|
|
144
|
-
return
|
|
215
|
+
return Object.freeze({
|
|
216
|
+
metadata: meta,
|
|
217
|
+
executable: running,
|
|
218
|
+
[admittedScriptInstall]: true as const,
|
|
219
|
+
})
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
async function realpathIfExists(path: string): Promise<string | undefined> {
|
|
223
|
+
try {
|
|
224
|
+
return await realpath(path)
|
|
225
|
+
} catch (error) {
|
|
226
|
+
if (isMissingFile(error)) return undefined
|
|
227
|
+
throw error
|
|
228
|
+
}
|
|
145
229
|
}
|
|
146
230
|
|
|
147
231
|
export async function writeInstallMetadata(
|
|
@@ -162,7 +246,7 @@ export function releaseBase(
|
|
|
162
246
|
const version = req.version.replace(/^cli\/v/, '').replace(/^v/, '')
|
|
163
247
|
return `https://github.com/${repo}/releases/download/cli/v${version}`
|
|
164
248
|
}
|
|
165
|
-
return `https://github.com/${repo}/releases/download/${req.channel ?? meta.channel ??
|
|
249
|
+
return `https://github.com/${repo}/releases/download/${req.channel ?? meta.channel ?? DEFAULT_UPDATE_CHANNEL}`
|
|
166
250
|
}
|
|
167
251
|
|
|
168
252
|
export async function fetchManifest(base: string): Promise<UpdateManifest> {
|
|
@@ -175,9 +259,19 @@ export function shouldUpdate(currentVersion: string, manifestVersion: string): b
|
|
|
175
259
|
}
|
|
176
260
|
|
|
177
261
|
export async function updateAstrale(req: UpdateRequest): Promise<UpdateResult> {
|
|
178
|
-
const
|
|
262
|
+
const execution = req.execution ?? detectUpdateExecution()
|
|
263
|
+
if (execution.kind === 'package-managed') {
|
|
264
|
+
return {
|
|
265
|
+
status: 'managed',
|
|
266
|
+
currentVersion: req.currentVersion,
|
|
267
|
+
executable: execution.executable,
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const install = await admitScriptInstall(await readInstallMetadata(req.installPath), execution)
|
|
272
|
+
const meta = install.metadata
|
|
179
273
|
const currentVersion = meta.version ?? req.currentVersion
|
|
180
|
-
const channel = req.channel ?? meta.channel ??
|
|
274
|
+
const channel = req.channel ?? meta.channel ?? DEFAULT_UPDATE_CHANNEL
|
|
181
275
|
const platform = req.platform ?? detectPlatform()
|
|
182
276
|
const key = platformKey(platform)
|
|
183
277
|
const base = releaseBase(meta, { channel, version: req.version })
|
package/src/lib/validation.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isDnsLabel } from '@astrale-os/sdk/
|
|
1
|
+
import { isDnsLabel } from '@astrale-os/sdk/value'
|
|
2
2
|
import { z } from 'zod'
|
|
3
3
|
|
|
4
4
|
import { ReservedSlugError } from '../errors'
|
|
@@ -21,7 +21,7 @@ export function validateName(name: string, entity: string): void {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
export function validateSlug(slug: string): void {
|
|
24
|
-
// Canonical DNS-label rule
|
|
24
|
+
// Canonical Core DNS-label rule: a slug becomes a
|
|
25
25
|
// hostname label, so reject anything not DNS-safe (§4.7).
|
|
26
26
|
if (!slug || !isDnsLabel(slug)) {
|
|
27
27
|
throw new Error(
|
package/src/lib/view/resolve.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ResolvedView as SessionResolvedView } from '@astrale-os/
|
|
1
|
+
import type { ResolvedView as SessionResolvedView } from '@astrale-os/sdk/client/session'
|
|
2
2
|
import type { ResolvedView } from '@astrale-os/shell'
|
|
3
3
|
|
|
4
4
|
import { Path } from '@astrale-os/sdk/graph/path'
|
|
@@ -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
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as L}from"./index-
|
|
1
|
+
import{m as L}from"./index-N8J8EKlB.js";function S(y,b){for(var u=0;u<b.length;u++){const a=b[u];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in y)){const n=Object.getOwnPropertyDescriptor(a,i);n&&Object.defineProperty(y,i,n.get?n:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(y,Symbol.toStringTag,{value:"Module"}))}function w(y){throw new Error('Could not dynamically require "'+y+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var O={exports:{}},j;function C(){return j||(j=1,(function(y,b){(function(u){y.exports=u()})(function(){return(function(){function u(a,i,n){function d(f,_){if(!i[f]){if(!a[f]){var h=typeof w=="function"&&w;if(!_&&h)return h(f,!0);if(g)return g(f,!0);var o=new Error("Cannot find module '"+f+"'");throw o.code="MODULE_NOT_FOUND",o}var e=i[f]={exports:{}};a[f][0].call(e.exports,function(r){var t=a[f][1][r];return d(t||r)},e,e.exports,u,a,i,n)}return i[f].exports}for(var g=typeof w=="function"&&w,m=0;m<n.length;m++)d(n[m]);return d}return u})()({1:[function(u,a,i){Object.defineProperty(i,"__esModule",{value:!0}),i.default=void 0;function n(o){"@babel/helpers - typeof";return n=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},n(o)}function d(o,e){if(!(o instanceof e))throw new TypeError("Cannot call a class as a function")}function g(o,e){for(var r=0;r<e.length;r++){var t=e[r];t.enumerable=t.enumerable||!1,t.configurable=!0,"value"in t&&(t.writable=!0),Object.defineProperty(o,f(t.key),t)}}function m(o,e,r){return e&&g(o.prototype,e),Object.defineProperty(o,"prototype",{writable:!1}),o}function f(o){var e=_(o,"string");return n(e)=="symbol"?e:e+""}function _(o,e){if(n(o)!="object"||!o)return o;var r=o[Symbol.toPrimitive];if(r!==void 0){var t=r.call(o,e);if(n(t)!="object")return t;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(o)}i.default=(function(){function o(){var e=this,r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=r.defaultLayoutOptions,s=t===void 0?{}:t,l=r.algorithms,v=l===void 0?["layered","stress","mrtree","radial","force","disco","sporeOverlap","sporeCompaction","rectpacking"]:l,c=r.workerFactory,p=r.workerUrl;if(d(this,o),this.defaultLayoutOptions=s,this.initialized=!1,typeof p>"u"&&typeof c>"u")throw new Error("Cannot construct an ELK without both 'workerUrl' and 'workerFactory'.");var k=c;typeof p<"u"&&typeof c>"u"&&(k=function(M){return new Worker(M)});var E=k(p);if(typeof E.postMessage!="function")throw new TypeError("Created worker does not provide the required 'postMessage' function.");this.worker=new h(E),this.worker.postMessage({cmd:"register",algorithms:v}).then(function(P){return e.initialized=!0}).catch(console.err)}return m(o,[{key:"layout",value:function(r){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},s=t.layoutOptions,l=s===void 0?this.defaultLayoutOptions:s,v=t.logging,c=v===void 0?!1:v,p=t.measureExecutionTime,k=p===void 0?!1:p;return r?this.worker.postMessage({cmd:"layout",graph:r,layoutOptions:l,options:{logging:c,measureExecutionTime:k}}):Promise.reject(new 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 h=(function(){function o(e){var r=this;if(d(this,o),e===void 0)throw new Error("Missing mandatory parameter 'worker'.");this.resolvers={},this.worker=e,this.worker.onmessage=function(t){setTimeout(function(){r.receive(r,t)},0)}}return m(o,[{key:"postMessage",value:function(r){var t=this.id||0;this.id=t+1,r.id=t;var s=this;return new Promise(function(l,v){s.resolvers[t]=function(c,p){c?(s.convertGwtStyleError(c),v(c)):l(p)},s.worker.postMessage(r)})}},{key:"receive",value:function(r,t){var s=t.data,l=r.resolvers[s.id];l&&(delete r.resolvers[s.id],s.error?l(s.error):l(null,s.data))}},{key:"terminate",value:function(){this.worker&&this.worker.terminate()}},{key:"convertGwtStyleError",value:function(r){if(r){var t=r.__java$exception;t&&(t.cause&&t.cause.backingJsObject&&(r.cause=t.cause.backingJsObject,this.convertGwtStyleError(r.cause)),delete r.__java$exception)}}}])})()},{}],2:[function(u,a,i){var n=u("./elk-api.js").default;Object.defineProperty(a.exports,"__esModule",{value:!0}),a.exports=n,n.default=n},{"./elk-api.js":1}]},{},[2])(2)})})(O)),O.exports}var x=C();const A=L(x),q=S({__proto__:null,default:A},[x]);export{q as e};
|