@astrale-os/cli 1.0.0-beta.3 → 1.0.0-beta.30
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 +80 -6
- package/dist/astrale.js +55471 -58674
- package/dist/public/connect-core.js +2158 -30706
- package/dist/public/keys/index.js +1016 -29541
- package/dist/public/paths/index.js +370 -28654
- package/dist/types/admin/contract.d.ts +26 -0
- package/dist/types/admin/instance/client.d.ts +20 -0
- package/dist/types/admin/instance/index.d.ts +2 -0
- package/dist/types/admin/instance/model.d.ts +6 -10
- 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 +13 -59
- package/dist/types/lib/failure-debug.d.ts +1 -0
- package/dist/types/lib/idp.d.ts +25 -173
- 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/output.d.ts +1 -1
- 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 +109 -0
- package/dist/types/lib/validation.d.ts +4 -1
- package/dist/types/state/exchange-credentials.d.ts +6 -2
- package/dist/types/state/files.d.ts +2 -0
- package/dist/types/state/index.d.ts +3 -2
- package/dist/types/state/paths.d.ts +2 -0
- package/dist/types/state/session-routes.d.ts +10 -0
- package/package.json +16 -19
- package/src/__tests__/fixtures/publication.ts +20 -0
- package/src/admin/.spec/architecture.md +12 -5
- package/src/admin/__tests__/fixture.ts +25 -0
- package/src/admin/catalog/.spec/api.d.ts +1 -3
- package/src/admin/catalog/.spec/architecture.md +5 -4
- package/src/admin/catalog/__tests__/client.test.ts +143 -69
- package/src/admin/catalog/client.ts +40 -54
- package/src/admin/catalog/model.ts +3 -4
- package/src/admin/contract.ts +47 -0
- 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 +5 -9
- package/src/admin/instance/.spec/architecture.md +7 -7
- package/src/admin/instance/__tests__/client.test.ts +157 -175
- package/src/admin/instance/client.ts +39 -128
- package/src/admin/instance/index.ts +1 -2
- package/src/admin/instance/model.ts +12 -18
- package/src/commands/__tests__/admin-instance.test.ts +11 -8
- package/src/commands/__tests__/call-describe.test.ts +46 -33
- package/src/commands/__tests__/call.test.ts +34 -0
- package/src/commands/__tests__/domain-install-operation.test.ts +30 -22
- package/src/commands/__tests__/domain-install-owned.test.ts +1 -1
- package/src/commands/__tests__/domain-list.test.ts +5 -25
- package/src/commands/__tests__/install-direct.test.ts +115 -8
- package/src/commands/__tests__/install-identity-override.test.ts +6 -17
- 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__/introspect-parse.test.ts +80 -1
- package/src/commands/__tests__/logs.test.ts +250 -2
- package/src/commands/__tests__/read-commands.test.ts +118 -10
- package/src/commands/__tests__/token-ttl.test.ts +49 -4
- package/src/commands/__tests__/update.test.ts +25 -3
- package/src/commands/__tests__/view.test.ts +50 -2
- package/src/commands/auth/logout.ts +2 -1
- package/src/commands/browser.ts +29 -0
- package/src/commands/call-describe.ts +60 -68
- package/src/commands/call.ts +71 -59
- package/src/commands/domain/install.ts +73 -46
- package/src/commands/domain/list.ts +1 -1
- package/src/commands/domain/publish.ts +14 -11
- package/src/commands/domain/uninstall.ts +2 -2
- package/src/commands/get.ts +15 -16
- package/src/commands/identity/__tests__/register.test.ts +3 -3
- package/src/commands/identity/register.ts +8 -8
- 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 +53 -41
- package/src/commands/logs.ts +123 -36
- package/src/commands/mutate.ts +6 -5
- package/src/commands/query.ts +35 -32
- package/src/commands/session/analyze.ts +26 -4
- package/src/commands/token.ts +42 -27
- package/src/commands/ui/__tests__/commands.test.ts +152 -0
- package/src/commands/ui/add.ts +51 -0
- package/src/commands/ui/doctor.ts +21 -0
- package/src/commands/ui/init.ts +38 -0
- package/src/commands/ui/list.ts +26 -0
- package/src/commands/ui/preset-apply.ts +19 -0
- package/src/commands/ui/preset-list.ts +12 -0
- package/src/commands/ui/shared.ts +25 -0
- package/src/commands/update.ts +89 -48
- package/src/commands/view.ts +82 -37
- package/src/connection/.spec/api.d.ts +7 -8
- package/src/connection/.spec/architecture.md +14 -5
- 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__/auth.test.ts +1 -0
- package/src/connection/__tests__/credential.test.ts +21 -1
- package/src/connection/__tests__/errors.test.ts +27 -20
- package/src/connection/__tests__/exchange.test.ts +64 -11
- 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 +8 -4
- package/src/connection/__tests__/target.test.ts +2 -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 +110 -61
- 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 +27 -9
- 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__/fixtures/registry-journey.ts +13 -1
- package/src/identity/__tests__/registration.test.ts +1 -1
- package/src/identity/__tests__/registry.test.ts +4 -0
- package/src/identity/registration.ts +3 -3
- package/src/identity/registry.ts +2 -0
- 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__/binary.test.ts +16 -1
- package/src/lib/__tests__/browser-retention.test.ts +212 -0
- package/src/lib/__tests__/command-dx.test.ts +1 -1
- package/src/lib/__tests__/config.test.ts +27 -0
- package/src/lib/__tests__/domain-publication.test.ts +10 -16
- package/src/lib/__tests__/idp.test.ts +34 -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__/log-errors.test.ts +64 -0
- package/src/lib/__tests__/skills.test.ts +809 -0
- package/src/lib/__tests__/studio-server-deps.test.ts +1 -1
- package/src/lib/__tests__/update.test.ts +264 -11
- package/src/lib/__tests__/view-assets.test.ts +25 -0
- package/src/lib/__tests__/view-external-open-intent.test.ts +150 -0
- package/src/lib/__tests__/view-external-open-origins.test.ts +27 -0
- package/src/lib/__tests__/view-open-intent.test.ts +0 -2
- package/src/lib/__tests__/view-server.test.ts +26 -3
- package/src/lib/__tests__/view-session.test.ts +2 -1
- package/src/lib/admin-instance.ts +14 -8
- package/src/lib/admin-target.ts +21 -2
- package/src/lib/binary.ts +22 -5
- package/src/lib/browser-retention.ts +210 -0
- package/src/lib/command-dx.ts +9 -9
- package/src/lib/config.ts +12 -1
- package/src/lib/domain-publication.ts +9 -7
- package/src/lib/failure-debug.ts +26 -0
- package/src/lib/idp.ts +34 -3
- package/src/lib/instance-candidates.ts +2 -2
- package/src/lib/instance-target.ts +3 -14
- package/src/lib/instance.ts +16 -11
- package/src/lib/log.ts +16 -9
- package/src/lib/output.ts +1 -1
- package/src/lib/proc.ts +7 -2
- package/src/lib/provision-instance.ts +34 -57
- package/src/lib/skills/lock.ts +117 -0
- package/src/lib/skills/sync.ts +814 -0
- package/src/lib/skills.ts +1 -52
- package/src/lib/update.ts +298 -45
- package/src/lib/validation.ts +2 -2
- package/src/lib/view/assets.ts +11 -2
- package/src/lib/view/external-open-intent.ts +41 -0
- package/src/lib/view/external-open-origins.ts +37 -0
- package/src/lib/view/host-capabilities.ts +17 -0
- package/src/lib/view/resolve.ts +1 -1
- package/src/lib/view/server.ts +18 -3
- package/src/lib/view/session.ts +2 -0
- package/src/program/.spec/api.d.ts +1 -0
- package/src/program/__tests__/program.test.ts +163 -6
- package/src/program/argv.ts +14 -0
- package/src/program/build.ts +26 -4
- package/src/program/command.ts +1 -0
- package/src/program/index.ts +1 -0
- package/src/program/registry.ts +2 -1
- package/src/setup/__tests__/instance-step.test.ts +27 -10
- package/src/setup/steps/instance.ts +22 -15
- package/src/setup/steps/skills.ts +40 -38
- package/src/state/.spec/api.d.ts +21 -2
- package/src/state/.spec/architecture.md +18 -4
- package/src/state/.spec/layout.ts +1 -0
- package/src/state/__tests__/exchange-credentials.test.ts +88 -42
- package/src/state/__tests__/files.test.ts +24 -1
- package/src/state/__tests__/fixtures/session-route-process.ts +93 -0
- package/src/state/__tests__/paths.test.ts +1 -0
- package/src/state/__tests__/session-routes.test.ts +138 -0
- package/src/state/exchange-credentials.ts +22 -9
- package/src/state/files.ts +41 -0
- package/src/state/index.ts +3 -1
- package/src/state/paths.ts +3 -0
- package/src/state/session-routes.ts +34 -0
- package/src/telemetry/__tests__/analyze-log.test.ts +38 -0
- package/src/telemetry/__tests__/recorder.test.ts +1 -0
- package/src/telemetry/__tests__/retention.test.ts +267 -0
- package/src/telemetry/__tests__/settings.test.ts +102 -0
- package/src/telemetry/__tests__/store-scan.test.ts +128 -0
- package/src/telemetry/__tests__/trigger.test.ts +33 -4
- package/src/telemetry/analyze.ts +24 -2
- package/src/telemetry/recorder.ts +15 -4
- package/src/telemetry/retention.ts +176 -0
- package/src/telemetry/session.ts +18 -12
- package/src/telemetry/settings.ts +64 -11
- package/src/telemetry/store.ts +92 -9
- package/src/telemetry/trigger.ts +16 -28
- package/src/ui/.spec/api.d.ts +14 -0
- package/src/ui/.spec/architecture.md +14 -0
- package/src/ui/.spec/laws.ts +50 -0
- package/src/ui/.spec/layout.ts +16 -0
- package/src/ui/__tests__/ui.test.ts +1742 -0
- package/src/ui/index.ts +13 -0
- package/src/ui/lock.ts +89 -0
- package/src/ui/model.ts +83 -0
- package/src/ui/operations.ts +1044 -0
- package/src/ui/project.ts +333 -0
- package/src/ui/release.ts +398 -0
- package/src/ui/runner.ts +18 -0
- package/studio/client/dist/assets/elk-api-DjmKsHXc.js +1 -0
- package/studio/client/dist/assets/index-BFVFs_8x.js +81 -0
- package/studio/client/dist/assets/index-DuB9iUdu.css +2 -0
- package/studio/client/dist/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
- package/studio/client/dist/assets/schema-studio--a0kX3QU.css +1 -0
- package/studio/client/dist/assets/schema-studio-DH6oEWME.js +8 -0
- package/studio/client/dist/index.html +4 -3
- package/studio/package.json +8 -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/harness/claude/adapter.test.ts +15 -5
- package/studio/server/agent/harness/gateway/token.test.ts +1 -1
- package/studio/server/agent/harness/gateway/token.ts +3 -3
- package/studio/server/agent/prompts/anchors.test.ts +41 -32
- package/studio/server/agent/prompts/anchors.ts +23 -51
- package/studio/server/agent/prompts/system.test.ts +4 -4
- package/studio/server/agent/prompts/system.ts +5 -5
- package/studio/server/agent/routes.test.ts +1 -1
- package/studio/server/agent/run/coordinator.test.ts +1 -1
- package/studio/server/agent/run/preparation.ts +1 -1
- package/studio/server/api/canvas.ts +0 -1
- package/studio/server/api/context.ts +1 -1
- package/studio/server/api/deployment.ts +1 -1
- package/studio/server/api/views.ts +2 -2
- package/studio/server/api/workspace.ts +1 -1
- package/studio/server/api-agent-loadout.test.ts +1 -1
- package/studio/server/api.test.ts +1 -1
- package/studio/server/cache.test.ts +24 -18
- package/studio/server/cache.ts +10 -54
- package/studio/server/cli-consumers.test.ts +31 -3
- package/studio/server/domain.test.ts +50 -68
- package/studio/server/domain.ts +82 -63
- package/studio/server/handoff/copy.ts +2 -2
- package/studio/server/index.ts +1 -1
- package/studio/server/instances/probe.test.ts +1 -1
- package/studio/server/introspect/anatomy/views/routes.ts +46 -37
- package/studio/server/introspect/anatomy/views.ts +10 -16
- package/studio/server/introspect/anatomy-extras.test.ts +29 -56
- package/studio/server/introspect/anatomy.test.ts +22 -14
- package/studio/server/introspect/anatomy.ts +6 -9
- package/studio/server/introspect/bundle.ts +0 -3
- package/studio/server/introspect/canonical-schema.test.ts +155 -424
- package/studio/server/introspect/canonical-schema.ts +248 -601
- package/studio/server/introspect/core.ts +14 -22
- package/studio/server/introspect/diff.test.ts +21 -9
- package/studio/server/introspect/diff.ts +19 -64
- package/studio/server/introspect/extractor.ts +23 -122
- package/studio/server/introspect/overlay-tsmorph.test.ts +116 -241
- package/studio/server/introspect/overlay-tsmorph.ts +0 -1
- package/studio/server/introspect/overlay.ts +3 -51
- package/studio/server/introspect/revision.test.ts +24 -28
- package/studio/server/introspect/revision.ts +11 -22
- package/studio/server/introspect/runtime.test.ts +77 -195
- package/studio/server/introspect/runtime.ts +5 -67
- package/studio/server/introspect/schema-ir-json.test.ts +81 -0
- package/studio/server/introspect/schema-ir-json.ts +39 -69
- 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/handlers.ts +116 -636
- package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -3
- package/studio/server/introspect/source-overlay/spans.ts +15 -45
- package/studio/server/lifecycle.ts +4 -1
- package/studio/server/state/baseline.test.ts +14 -9
- package/studio/server/state/baseline.ts +3 -5
- package/studio/server/state/documents.test.ts +69 -0
- package/studio/server/state/documents.ts +57 -10
- package/studio/server/state/visibility.ts +1 -5
- package/studio/server/views/model.ts +3 -3
- package/studio/server/views/target.test.ts +18 -76
- package/studio/server/views/target.ts +24 -50
- package/studio/server/watch.test.ts +11 -11
- package/studio/server/watch.ts +8 -4
- package/studio/server/workspace/updates.ts +23 -1
- package/studio/server/workspace-watch.ts +2 -2
- package/studio/shared/contracts/runtime.ts +4 -0
- package/studio/shared/contracts/schema.ts +44 -131
- package/studio/shared/contracts/surface.test.ts +15 -17
- package/studio/shared/contracts/workspace.ts +5 -11
- package/studio/shared/schema/identity.test.ts +20 -44
- package/studio/shared/schema/identity.ts +9 -24
- package/studio/tsconfig.json +2 -1
- package/tsconfig.json +1 -1
- package/viewer/dist/index.html +21 -0
- package/viewer/dist/main.js +41 -62
- package/.check-workspace.cjs +0 -40
- package/src/admin/binding.ts +0 -168
- package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
- package/studio/client/dist/assets/elk-api-lwhFo7vB.js +0 -1
- package/studio/client/dist/assets/index-B-c-smo9.js +0 -8
- package/studio/client/dist/assets/index-BckHuAWk.js +0 -81
- package/studio/client/dist/assets/index-C4aNQ6dz.css +0 -1
- package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
- package/studio/server/introspect/anatomy/views/legacy.ts +0 -232
- package/studio/server/introspect/core-extractor.ts +0 -139
- package/studio/server/introspect/overlay.test.ts +0 -72
- package/studio/server/introspect/source-overlay/annotations.ts +0 -14
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { ClientSession } from '@astrale-os/
|
|
1
|
+
import type { ClientSession } from '@astrale-os/sdk/client/session'
|
|
2
2
|
import type { Node } from '@astrale-os/sdk/graph/node'
|
|
3
3
|
|
|
4
4
|
import { Path } from '@astrale-os/sdk/graph/path'
|
|
5
5
|
import { Query } from '@astrale-os/sdk/query'
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { AdminContract, callAdminMethod } from '../contract'
|
|
8
8
|
import { readAllNodes, type AdminGraphApi } from '../graph'
|
|
9
9
|
import {
|
|
10
10
|
AdminDomainNotFoundError,
|
|
@@ -13,16 +13,9 @@ import {
|
|
|
13
13
|
type PublishDomainResult,
|
|
14
14
|
} from './model'
|
|
15
15
|
|
|
16
|
-
const ADMIN_ORIGIN = 'admin.astrale.ai'
|
|
17
16
|
const PAGE_SIZE = 256
|
|
18
17
|
const MAXIMUM_DOMAINS = 10_000
|
|
19
18
|
const MAXIMUM_PAGES = Math.ceil(MAXIMUM_DOMAINS / PAGE_SIZE) + 1
|
|
20
|
-
const DomainRef = Object.freeze({ origin: ADMIN_ORIGIN, kind: 'class' as const, name: 'Domain' })
|
|
21
|
-
const fleetInstallsByDefault = Object.freeze({
|
|
22
|
-
origin: ADMIN_ORIGIN,
|
|
23
|
-
kind: 'class' as const,
|
|
24
|
-
name: 'fleet_installs_domain_by_default',
|
|
25
|
-
})
|
|
26
19
|
|
|
27
20
|
export interface AdminCatalogContext {
|
|
28
21
|
readonly session: ClientSession
|
|
@@ -36,30 +29,21 @@ export interface AdminCatalogApi {
|
|
|
36
29
|
}
|
|
37
30
|
|
|
38
31
|
export interface AdminCatalogDependencies {
|
|
39
|
-
readonly bind?: (session: ClientSession) => Promise<AdminBinding>
|
|
40
32
|
readonly operationId?: (kind: 'publish' | 'configure-default') => string
|
|
41
33
|
}
|
|
42
34
|
|
|
43
|
-
/**
|
|
35
|
+
/** Connect the Domain catalog journey without schema discovery or reflection. */
|
|
44
36
|
export async function connectAdminCatalog(
|
|
45
37
|
context: AdminCatalogContext,
|
|
46
38
|
dependencies: AdminCatalogDependencies = {},
|
|
47
39
|
): Promise<AdminCatalogApi> {
|
|
48
|
-
const binding = await (dependencies.bind ?? bindAdmin)(context.session)
|
|
49
|
-
if (binding.$.publication?.origin !== ADMIN_ORIGIN || binding.$.origin !== ADMIN_ORIGIN) {
|
|
50
|
-
throw new TypeError('Configured Admin target does not serve the Admin Domain.')
|
|
51
|
-
}
|
|
52
|
-
const Domain = binding.$.class('Domain')
|
|
53
|
-
const Fleet = binding.$.class('Fleet')
|
|
54
|
-
const fleet = binding.$.core.nodes.fleet?.path
|
|
55
|
-
if (fleet === undefined) throw new TypeError('Admin Domain has no singleton Fleet receiver.')
|
|
56
40
|
const operationId = dependencies.operationId ?? defaultOperationId
|
|
57
41
|
|
|
58
42
|
const list = async (): Promise<DomainInfo[]> => {
|
|
59
43
|
const [nodes, defaultsPage] = await Promise.all([
|
|
60
44
|
readAllNodes(
|
|
61
45
|
context.graph,
|
|
62
|
-
Query.from({
|
|
46
|
+
Query.from({ nodes: [AdminContract.classes.Domain] }).select({
|
|
63
47
|
kind: 'nodes',
|
|
64
48
|
projection: { kind: 'value' },
|
|
65
49
|
}),
|
|
@@ -69,16 +53,20 @@ export async function connectAdminCatalog(
|
|
|
69
53
|
maximumPages: MAXIMUM_PAGES,
|
|
70
54
|
},
|
|
71
55
|
),
|
|
72
|
-
context.graph.neighbors(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
56
|
+
context.graph.neighbors(
|
|
57
|
+
AdminContract.fleet,
|
|
58
|
+
AdminContract.edges.fleetInstallsDomainByDefault,
|
|
59
|
+
{
|
|
60
|
+
direction: 'outgoing',
|
|
61
|
+
page: { size: PAGE_SIZE },
|
|
62
|
+
},
|
|
63
|
+
),
|
|
76
64
|
])
|
|
77
65
|
const defaults = await defaultsPage.collect({ maximumPages: MAXIMUM_PAGES })
|
|
78
66
|
if (defaults.cursor !== null)
|
|
79
67
|
throw new TypeError('Admin default Domain catalog exceeded its bound.')
|
|
80
68
|
const defaultIds = new Set(defaults.nodes.map((node) => String(node.id)))
|
|
81
|
-
return nodes.map((node) => domainFromNode(
|
|
69
|
+
return nodes.map((node) => domainFromNode(node, defaultIds.has(String(node.id))))
|
|
82
70
|
}
|
|
83
71
|
|
|
84
72
|
const requireDomain = async (identifier: string): Promise<DomainInfo> => {
|
|
@@ -107,13 +95,13 @@ export async function connectAdminCatalog(
|
|
|
107
95
|
let entry = existing
|
|
108
96
|
if (registryChanged) {
|
|
109
97
|
entry = domainFromSummary(
|
|
110
|
-
await
|
|
98
|
+
await callAdminMethod(context.session, AdminContract.fleet, 'publishDomain', {
|
|
111
99
|
operationId: operationId('publish'),
|
|
112
100
|
origin: input.origin,
|
|
113
101
|
name: input.name,
|
|
114
102
|
discoveryUrl: input.url,
|
|
115
103
|
...(description === undefined ? {} : { description }),
|
|
116
|
-
}
|
|
104
|
+
}),
|
|
117
105
|
existing?.installByDefault === true,
|
|
118
106
|
)
|
|
119
107
|
}
|
|
@@ -124,14 +112,10 @@ export async function connectAdminCatalog(
|
|
|
124
112
|
(entry.installByDefault ?? false) !== input.installByDefault
|
|
125
113
|
if (defaultChanged) {
|
|
126
114
|
entry = domainFromSummary(
|
|
127
|
-
await
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
operationId: operationId('configure-default'),
|
|
132
|
-
enabled: input.installByDefault,
|
|
133
|
-
} as never,
|
|
134
|
-
),
|
|
115
|
+
await callAdminMethod(context.session, Path.parse(entry.id), 'configureDefault', {
|
|
116
|
+
operationId: operationId('configure-default'),
|
|
117
|
+
enabled: input.installByDefault,
|
|
118
|
+
}),
|
|
135
119
|
input.installByDefault === true,
|
|
136
120
|
)
|
|
137
121
|
}
|
|
@@ -144,29 +128,23 @@ export async function connectAdminCatalog(
|
|
|
144
128
|
})
|
|
145
129
|
}
|
|
146
130
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
function domainFromNode(
|
|
150
|
-
definition: DynamicDefinition,
|
|
151
|
-
node: Node,
|
|
152
|
-
installByDefault: boolean,
|
|
153
|
-
): DomainInfo {
|
|
131
|
+
function domainFromNode(node: Node, installByDefault: boolean): DomainInfo {
|
|
154
132
|
return Object.freeze({
|
|
155
133
|
id: Path.id(node.id).raw,
|
|
156
|
-
origin: requiredProperty(
|
|
157
|
-
name: requiredProperty(
|
|
158
|
-
url: requiredProperty(
|
|
159
|
-
...optionalProperty(
|
|
134
|
+
origin: requiredProperty(node, 'origin'),
|
|
135
|
+
name: requiredProperty(node, 'name'),
|
|
136
|
+
url: requiredProperty(node, 'discoveryUrl'),
|
|
137
|
+
...optionalProperty(node, 'description'),
|
|
160
138
|
...(installByDefault ? { installByDefault: true } : {}),
|
|
161
|
-
createdAt: requiredProperty(
|
|
162
|
-
updatedAt: requiredProperty(
|
|
139
|
+
createdAt: requiredProperty(node, 'createdAt'),
|
|
140
|
+
updatedAt: requiredProperty(node, 'updatedAt'),
|
|
163
141
|
})
|
|
164
142
|
}
|
|
165
143
|
|
|
166
144
|
function domainFromSummary(input: unknown, installByDefault: boolean): DomainInfo {
|
|
167
145
|
const value = record(input, 'Admin Domain summary')
|
|
168
146
|
return Object.freeze({
|
|
169
|
-
id:
|
|
147
|
+
id: requiredNodePath(value.id, 'Admin Domain id'),
|
|
170
148
|
origin: requiredString(value.origin, 'Admin Domain origin'),
|
|
171
149
|
name: requiredString(value.name, 'Admin Domain name'),
|
|
172
150
|
url: requiredString(value.discoveryUrl, 'Admin Domain discovery URL'),
|
|
@@ -179,16 +157,15 @@ function domainFromSummary(input: unknown, installByDefault: boolean): DomainInf
|
|
|
179
157
|
})
|
|
180
158
|
}
|
|
181
159
|
|
|
182
|
-
function requiredProperty(
|
|
183
|
-
return requiredString(node.props[
|
|
160
|
+
function requiredProperty(node: Node, name: keyof typeof AdminContract.properties.domain): string {
|
|
161
|
+
return requiredString(node.props[AdminContract.properties.domain[name]], `Admin Domain.${name}`)
|
|
184
162
|
}
|
|
185
163
|
|
|
186
164
|
function optionalProperty(
|
|
187
|
-
definition: DynamicDefinition,
|
|
188
165
|
node: Node,
|
|
189
|
-
name:
|
|
166
|
+
name: keyof typeof AdminContract.properties.domain,
|
|
190
167
|
): Readonly<Record<string, string>> {
|
|
191
|
-
const value = node.props[
|
|
168
|
+
const value = node.props[AdminContract.properties.domain[name]]
|
|
192
169
|
return value === undefined ? {} : { [name]: requiredString(value, `Admin Domain.${name}`) }
|
|
193
170
|
}
|
|
194
171
|
|
|
@@ -197,6 +174,15 @@ function requiredString(input: unknown, label: string): string {
|
|
|
197
174
|
return input
|
|
198
175
|
}
|
|
199
176
|
|
|
177
|
+
function requiredNodePath(input: unknown, label: string): string {
|
|
178
|
+
const value = requiredString(input, label)
|
|
179
|
+
try {
|
|
180
|
+
return Path.parse(value).raw
|
|
181
|
+
} catch {
|
|
182
|
+
throw new TypeError(`${label} is invalid.`)
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
200
186
|
function record(input: unknown, label: string): Readonly<Record<string, unknown>> {
|
|
201
187
|
if (typeof input !== 'object' || input === null || Array.isArray(input)) {
|
|
202
188
|
throw new TypeError(`${label} is invalid.`)
|
|
@@ -33,10 +33,9 @@ export interface InstallDomainResult {
|
|
|
33
33
|
readonly error?: string | null
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
export class AdminDomainNotFoundError extends
|
|
37
|
-
readonly name = 'NotFoundError'
|
|
38
|
-
|
|
36
|
+
export class AdminDomainNotFoundError extends AstraleError {
|
|
39
37
|
constructor(readonly identifier: string) {
|
|
40
|
-
super(`No visible Admin Domain matches ${JSON.stringify(identifier)}.`)
|
|
38
|
+
super('DOMAIN_NOT_FOUND', `No visible Admin Domain matches ${JSON.stringify(identifier)}.`)
|
|
41
39
|
}
|
|
42
40
|
}
|
|
41
|
+
import { AstraleError } from '../../errors'
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Input } from '@astrale-os/sdk/client'
|
|
2
|
+
import type { ClientSession, SessionRequestOptions } from '@astrale-os/sdk/client/session'
|
|
3
|
+
import type { ClassRef } from '@astrale-os/sdk/schema'
|
|
4
|
+
|
|
5
|
+
import { call } from '@astrale-os/sdk/client'
|
|
6
|
+
import { Path } from '@astrale-os/sdk/graph/path'
|
|
7
|
+
import { K, PropertyKey } from '@astrale-os/sdk/schema'
|
|
8
|
+
|
|
9
|
+
const origin = 'admin.astrale.ai'
|
|
10
|
+
|
|
11
|
+
function classRef(name: string): ClassRef {
|
|
12
|
+
return Object.freeze({ origin, kind: 'class', name }) as ClassRef
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const Domain = classRef('Domain')
|
|
16
|
+
|
|
17
|
+
export const AdminContract = Object.freeze({
|
|
18
|
+
origin,
|
|
19
|
+
fleet: Path.parse('/:admin.astrale.ai:core.fleet'),
|
|
20
|
+
classes: Object.freeze({
|
|
21
|
+
Domain,
|
|
22
|
+
}),
|
|
23
|
+
edges: Object.freeze({
|
|
24
|
+
fleetInstallsDomainByDefault: classRef('fleet_installs_domain_by_default'),
|
|
25
|
+
}),
|
|
26
|
+
properties: Object.freeze({
|
|
27
|
+
domain: Object.freeze({
|
|
28
|
+
origin: PropertyKey.of(Domain, 'origin'),
|
|
29
|
+
name: K.classes.Named.properties.name.key,
|
|
30
|
+
discoveryUrl: PropertyKey.of(Domain, 'discoveryUrl'),
|
|
31
|
+
description: K.classes.Descriptable.properties.description.key,
|
|
32
|
+
createdAt: K.classes.Timestamped.properties.createdAt.key,
|
|
33
|
+
updatedAt: K.classes.Timestamped.properties.updatedAt.key,
|
|
34
|
+
}),
|
|
35
|
+
}),
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
/** Invoke one stable Admin instance Method without schema discovery or reflection. */
|
|
39
|
+
export function callAdminMethod(
|
|
40
|
+
session: ClientSession,
|
|
41
|
+
receiver: Path,
|
|
42
|
+
method: string,
|
|
43
|
+
input: Input,
|
|
44
|
+
options?: SessionRequestOptions,
|
|
45
|
+
): Promise<unknown> {
|
|
46
|
+
return session.call(call(Path.instanceMethod(receiver, method), input), options)
|
|
47
|
+
}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { ClassPath } from '@astrale-os/sdk/graph/class'
|
|
1
|
+
import type { GraphApi } from '@astrale-os/sdk/client'
|
|
3
2
|
import type { Node } from '@astrale-os/sdk/graph/node'
|
|
4
|
-
import type {
|
|
5
|
-
import type { QueryAST, QueryResult } from '@astrale-os/sdk/query'
|
|
3
|
+
import type { QueryAST } from '@astrale-os/sdk/query'
|
|
6
4
|
|
|
7
5
|
/** Smallest Kernel graph capability needed by bounded Admin graph reads. */
|
|
8
|
-
export
|
|
9
|
-
query(ast: QueryAST, options?: GraphQueryOptions): Promise<QueryResult>
|
|
10
|
-
}
|
|
6
|
+
export type AdminGraphQueryApi = Pick<GraphApi, 'query'>
|
|
11
7
|
|
|
12
8
|
/** Caller-scoped graph reads shared by the Admin catalog and Instance journeys. */
|
|
13
|
-
export
|
|
14
|
-
neighbors(source: PathLike, edge: ClassPath, options: NeighborsOptions): Promise<NodePage>
|
|
15
|
-
}
|
|
9
|
+
export type AdminGraphApi = Pick<GraphApi, 'query' | 'neighbors'>
|
|
16
10
|
|
|
17
11
|
export interface ReadAllNodesOptions {
|
|
18
12
|
readonly label: string
|
package/src/admin/graph/nodes.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { ClientSession } from '@astrale-os/kernel-client/session'
|
|
3
|
-
|
|
4
|
-
import type { AdminGraphApi } from '../../graph/.spec/api.js'
|
|
1
|
+
import type { ClientSession } from '@astrale-os/sdk/client/session'
|
|
5
2
|
|
|
6
3
|
export type InstanceState = 'provisioning' | 'ready' | 'deleting' | 'failed' | 'deleted'
|
|
7
4
|
|
|
@@ -11,10 +8,11 @@ export interface InstanceInfo {
|
|
|
11
8
|
readonly url: string
|
|
12
9
|
readonly hostId?: string
|
|
13
10
|
readonly region?: string
|
|
14
|
-
readonly state
|
|
11
|
+
readonly state: InstanceState
|
|
15
12
|
readonly phase?: string
|
|
16
13
|
readonly error?: string | null
|
|
17
14
|
readonly createdAt?: string
|
|
15
|
+
readonly updatedAt?: string
|
|
18
16
|
readonly organizationId?: string
|
|
19
17
|
}
|
|
20
18
|
|
|
@@ -33,12 +31,11 @@ export interface DomainInstallReceipt {
|
|
|
33
31
|
|
|
34
32
|
export interface AdminInstanceContext {
|
|
35
33
|
readonly session: ClientSession
|
|
36
|
-
readonly graph: AdminGraphApi
|
|
37
34
|
}
|
|
38
35
|
|
|
39
36
|
export interface AdminInstanceApi {
|
|
40
37
|
list(): Promise<OwnedInstanceInfo[]>
|
|
41
|
-
create(slug: string
|
|
38
|
+
create(slug: string): Promise<InstanceInfo>
|
|
42
39
|
status(identifier: string): Promise<InstanceInfo>
|
|
43
40
|
delete(identifier: string): Promise<InstanceInfo>
|
|
44
41
|
installDomain(identifier: string, domain: string): Promise<DomainInstallReceipt>
|
|
@@ -51,7 +48,6 @@ export class AdminInstanceNotFoundError extends Error {
|
|
|
51
48
|
}
|
|
52
49
|
|
|
53
50
|
export interface AdminInstanceDependencies {
|
|
54
|
-
readonly bind?: (session: ClientSession) => Promise<DomainBinding>
|
|
55
51
|
readonly operationId?: (kind: 'create' | 'status' | 'delete' | 'install-domain') => string
|
|
56
52
|
}
|
|
57
53
|
|
|
@@ -63,4 +59,4 @@ export function findOwnedInstance(
|
|
|
63
59
|
instances: readonly OwnedInstanceInfo[],
|
|
64
60
|
identifier: string,
|
|
65
61
|
): OwnedInstanceInfo | undefined
|
|
66
|
-
export function
|
|
62
|
+
export function formatInstanceState(info: InstanceInfo): string
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# CLI Admin Instance adapter
|
|
2
2
|
|
|
3
|
-
The adapter
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
The adapter calls the stable singleton Fleet receiver directly. Listing and automatic creation are
|
|
4
|
+
one Admin Method call each; connection performs no schema discovery, introspection, or graph read.
|
|
5
|
+
Every returned summary is decoded locally before it reaches a command.
|
|
6
6
|
|
|
7
|
-
Automatic creation invokes `Fleet.createInstance
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
Automatic creation invokes `Fleet.createInstance`. Status, deletion, and Domain installation first
|
|
8
|
+
resolve a caller-visible Instance through Fleet and then invoke that exact Instance receiver. The
|
|
9
|
+
adapter creates internal operation IDs but preserves the existing CLI projection and
|
|
10
|
+
selection-required experience.
|