@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
|
@@ -5,9 +5,9 @@ import type { CommandDefinition } from '../program/index'
|
|
|
5
5
|
|
|
6
6
|
import { runKernelCommand } from '../connection'
|
|
7
7
|
import { AstraleError } from '../errors'
|
|
8
|
-
import {
|
|
8
|
+
import { failInput } from '../lib/log'
|
|
9
9
|
import { output } from '../lib/output'
|
|
10
|
-
import {
|
|
10
|
+
import { describeCallableFromBundle, missingCallableDescription } from './call-describe'
|
|
11
11
|
|
|
12
12
|
type IntrospectOpts = KernelCommandOpts & { bundle?: boolean }
|
|
13
13
|
|
|
@@ -17,7 +17,7 @@ export async function introspectCommand(target: string, opts: IntrospectOpts): P
|
|
|
17
17
|
try {
|
|
18
18
|
;({ origin, path } = parseIntrospectTarget(target))
|
|
19
19
|
} catch (error) {
|
|
20
|
-
|
|
20
|
+
failInput(error, opts)
|
|
21
21
|
}
|
|
22
22
|
const wantsCallable = isCallablePath(path)
|
|
23
23
|
|
|
@@ -44,7 +44,7 @@ export async function introspectCommand(target: string, opts: IntrospectOpts): P
|
|
|
44
44
|
)
|
|
45
45
|
}
|
|
46
46
|
if (wantsCallable) {
|
|
47
|
-
const described =
|
|
47
|
+
const described = describeCallableFromBundle(path, result.bundle)
|
|
48
48
|
if (described === undefined) throw missingCallableDescription(path.raw)
|
|
49
49
|
return described
|
|
50
50
|
}
|
|
@@ -59,7 +59,7 @@ export function parseIntrospectTarget(target: string): { origin: string; path: P
|
|
|
59
59
|
throw new AstraleError(
|
|
60
60
|
'NOT_A_DOMAIN',
|
|
61
61
|
'introspect requires a Domain origin or Path, not an @id.',
|
|
62
|
-
'Example: astrale introspect
|
|
62
|
+
'Example: astrale introspect kernel.astrale.ai or /:kernel.astrale.ai:class.Identity:whois',
|
|
63
63
|
)
|
|
64
64
|
}
|
|
65
65
|
const raw = target.startsWith('/') ? target : `/:${target}`
|
|
@@ -85,28 +85,21 @@ function isCallablePath(path: Path): boolean {
|
|
|
85
85
|
return last.kind === 'projection' && last.projection.kind === 'function'
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
function bundleRoot(bundle: unknown): unknown {
|
|
89
|
-
if (bundle !== null && typeof bundle === 'object' && 'root' in bundle) {
|
|
90
|
-
return (bundle as { root: unknown }).root
|
|
91
|
-
}
|
|
92
|
-
return bundle
|
|
93
|
-
}
|
|
94
|
-
|
|
95
88
|
export default {
|
|
96
89
|
name: 'introspect',
|
|
97
90
|
description: 'Read installed Domain schema from the Kernel Schema syscall',
|
|
98
91
|
afterHelpText: `
|
|
99
92
|
Behavior:
|
|
100
93
|
Calls the public Kernel introspect syscall for one installed Domain.
|
|
101
|
-
A bare origin (
|
|
94
|
+
A bare origin (kernel.astrale.ai or /:kernel.astrale.ai) prints installation
|
|
102
95
|
state, target, source, readiness, and capabilities. --bundle includes the
|
|
103
96
|
schema bundle. A method or Function Path projects that callable's
|
|
104
97
|
input/output from the installed bundle.
|
|
105
98
|
|
|
106
99
|
Examples:
|
|
107
|
-
$ astrale introspect
|
|
108
|
-
$ astrale introspect /:
|
|
109
|
-
$ astrale introspect /:
|
|
100
|
+
$ astrale introspect kernel.astrale.ai
|
|
101
|
+
$ astrale introspect /:kernel.astrale.ai --bundle
|
|
102
|
+
$ astrale introspect /:kernel.astrale.ai:class.Identity:whois
|
|
110
103
|
$ astrale introspect /:kernel.astrale.ai:function.journal
|
|
111
104
|
`,
|
|
112
105
|
arguments: [{ name: 'target', description: 'Domain origin or canonical Path' }],
|
package/src/commands/logs.ts
CHANGED
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
import { Path } from '@astrale-os/sdk/graph/path'
|
|
2
|
-
import {
|
|
2
|
+
import { K } from '@astrale-os/sdk/schema'
|
|
3
3
|
import chalk from 'chalk'
|
|
4
4
|
|
|
5
5
|
import type { ConnectionContext, KernelCommandOpts } from '../connection'
|
|
6
6
|
import type { Column, ListProjection } from '../lib/output'
|
|
7
7
|
import type { CommandDefinition } from '../program/index'
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
expandSelfInPath,
|
|
12
|
-
runKernelCommand,
|
|
13
|
-
withClientSession,
|
|
14
|
-
} from '../connection'
|
|
15
|
-
import { failClosed } from '../lib/log'
|
|
9
|
+
import { createPathCall, expandSelfInPath, runKernelCommand } from '../connection'
|
|
10
|
+
import { failInput } from '../lib/log'
|
|
16
11
|
import { isMachine, output, presentList } from '../lib/output'
|
|
17
12
|
|
|
18
|
-
const JOURNAL_PATH = Path.project(
|
|
13
|
+
const JOURNAL_PATH = Path.project(K.functions.journal.ref).raw
|
|
19
14
|
const DEFAULT_LIMIT = 200
|
|
20
15
|
const FOLLOW_INTERVAL_MS = 2_000
|
|
21
16
|
|
|
@@ -127,7 +122,7 @@ async function runOnce(opts: LogsOpts): Promise<void> {
|
|
|
127
122
|
await runKernelCommand({
|
|
128
123
|
opts,
|
|
129
124
|
label: 'Kernel journal',
|
|
130
|
-
fn: (context) => fetchPage(context, opts),
|
|
125
|
+
fn: async (context) => fetchPage(context, await resolveLogsOpts(opts, context)),
|
|
131
126
|
format: (page, format) => {
|
|
132
127
|
if (isMachine(format) || format.format !== undefined) output(page, format)
|
|
133
128
|
else {
|
|
@@ -139,14 +134,19 @@ async function runOnce(opts: LogsOpts): Promise<void> {
|
|
|
139
134
|
}
|
|
140
135
|
|
|
141
136
|
async function follow(opts: LogsOpts): Promise<void> {
|
|
142
|
-
await
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
cursor =
|
|
148
|
-
|
|
149
|
-
|
|
137
|
+
await runKernelCommand({
|
|
138
|
+
opts,
|
|
139
|
+
label: 'Kernel journal',
|
|
140
|
+
fn: async (context): Promise<never> => {
|
|
141
|
+
const resolved = await resolveLogsOpts(opts, context)
|
|
142
|
+
let cursor = resolved.cursor
|
|
143
|
+
for (;;) {
|
|
144
|
+
const page = await fetchPage(context, { ...resolved, cursor })
|
|
145
|
+
for (const record of page.records) printRecord(record)
|
|
146
|
+
cursor = page.cursor ?? cursor
|
|
147
|
+
await new Promise((resolve) => setTimeout(resolve, FOLLOW_INTERVAL_MS))
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
150
|
})
|
|
151
151
|
}
|
|
152
152
|
|
|
@@ -227,11 +227,10 @@ function positiveInteger(flag: string, raw: string): number {
|
|
|
227
227
|
return value
|
|
228
228
|
}
|
|
229
229
|
|
|
230
|
-
async function
|
|
231
|
-
buildJournalInput(opts)
|
|
230
|
+
async function resolveLogsOpts(opts: LogsOpts, context: ConnectionContext): Promise<LogsOpts> {
|
|
232
231
|
const principal = nonEmpty(opts.principal)
|
|
233
232
|
if (principal !== '@self') return opts
|
|
234
|
-
const { path } = await expandSelfInPath('@self',
|
|
233
|
+
const { path } = await expandSelfInPath('@self', context)
|
|
235
234
|
return { ...opts, principal: path.startsWith('@') ? path.slice(1) : path }
|
|
236
235
|
}
|
|
237
236
|
|
|
@@ -274,11 +273,11 @@ Examples:
|
|
|
274
273
|
],
|
|
275
274
|
action: async (opts: LogsOpts) => {
|
|
276
275
|
try {
|
|
277
|
-
|
|
278
|
-
if (prepared.follow) await follow(prepared)
|
|
279
|
-
else await runOnce(prepared)
|
|
276
|
+
buildJournalInput(opts)
|
|
280
277
|
} catch (error) {
|
|
281
|
-
|
|
278
|
+
failInput(error, opts)
|
|
282
279
|
}
|
|
280
|
+
if (opts.follow) await follow(opts)
|
|
281
|
+
else await runOnce(opts)
|
|
283
282
|
},
|
|
284
283
|
} satisfies CommandDefinition
|
package/src/commands/mutate.ts
CHANGED
|
@@ -7,8 +7,9 @@ import type { KernelCommandOpts } from '../connection'
|
|
|
7
7
|
import type { CommandDefinition } from '../program/index'
|
|
8
8
|
|
|
9
9
|
import { runKernelCommand } from '../connection'
|
|
10
|
+
import { AstraleError } from '../errors'
|
|
10
11
|
import { prepareMutation } from '../graph/index'
|
|
11
|
-
import {
|
|
12
|
+
import { failInput } from '../lib/log'
|
|
12
13
|
import { output } from '../lib/output'
|
|
13
14
|
import { renderTable } from '../lib/table'
|
|
14
15
|
|
|
@@ -23,7 +24,7 @@ export async function mutateCommand(opts: MutateOpts): Promise<void> {
|
|
|
23
24
|
try {
|
|
24
25
|
mutation = prepareMutation(await readDocument(opts))
|
|
25
26
|
} catch (error) {
|
|
26
|
-
|
|
27
|
+
failInput(error, opts)
|
|
27
28
|
}
|
|
28
29
|
|
|
29
30
|
if (opts.dry) {
|
|
@@ -51,9 +52,9 @@ async function readDocument(opts: MutateOpts): Promise<unknown> {
|
|
|
51
52
|
try {
|
|
52
53
|
raw = await readFile(opts.file, 'utf8')
|
|
53
54
|
} catch (error) {
|
|
54
|
-
throw new
|
|
55
|
-
|
|
56
|
-
)
|
|
55
|
+
throw new AstraleError('FILE_READ_FAILED', `Cannot read --file ${opts.file}.`, undefined, {
|
|
56
|
+
cause: error,
|
|
57
|
+
})
|
|
57
58
|
}
|
|
58
59
|
return parseJson(raw, opts.file)
|
|
59
60
|
}
|
package/src/commands/query.ts
CHANGED
|
@@ -6,8 +6,9 @@ import type { KernelCommandOpts, SelfExpansionMeta } from '../connection'
|
|
|
6
6
|
import type { CommandDefinition } from '../program/index'
|
|
7
7
|
|
|
8
8
|
import { expandSelfInPath, runKernelCommand, withSelfHint } from '../connection'
|
|
9
|
+
import { AstraleError } from '../errors'
|
|
9
10
|
import { prepareQuery, type QueryCommandInput } from '../graph/index'
|
|
10
|
-
import {
|
|
11
|
+
import { failInput } from '../lib/log'
|
|
11
12
|
import { isMachine, output } from '../lib/output'
|
|
12
13
|
|
|
13
14
|
type QueryOpts = KernelCommandOpts & {
|
|
@@ -22,46 +23,42 @@ type QueryOpts = KernelCommandOpts & {
|
|
|
22
23
|
|
|
23
24
|
export async function queryCommand(sources: string[], opts: QueryOpts): Promise<void> {
|
|
24
25
|
let input: QueryCommandInput
|
|
25
|
-
let meta: SelfExpansionMeta | undefined
|
|
26
26
|
try {
|
|
27
27
|
const ast = await readAst(opts)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
cursor: opts.cursor,
|
|
37
|
-
}
|
|
38
|
-
meta = expanded.find((entry) => entry.meta !== undefined)?.meta
|
|
39
|
-
} else {
|
|
40
|
-
input = {
|
|
41
|
-
sources,
|
|
42
|
-
ast,
|
|
43
|
-
definition: opts.definition,
|
|
44
|
-
edge: opts.edge,
|
|
45
|
-
direction: opts.direction,
|
|
46
|
-
limit: opts.limit,
|
|
47
|
-
cursor: opts.cursor,
|
|
48
|
-
}
|
|
28
|
+
input = {
|
|
29
|
+
sources,
|
|
30
|
+
...(ast === undefined ? {} : { ast }),
|
|
31
|
+
definition: opts.definition,
|
|
32
|
+
edge: opts.edge,
|
|
33
|
+
direction: opts.direction,
|
|
34
|
+
limit: opts.limit,
|
|
35
|
+
cursor: opts.cursor,
|
|
49
36
|
}
|
|
50
37
|
} catch (error) {
|
|
51
|
-
|
|
38
|
+
failInput(error, opts)
|
|
52
39
|
}
|
|
53
40
|
|
|
54
41
|
let prepared
|
|
55
42
|
try {
|
|
56
43
|
prepared = prepareQuery(input)
|
|
57
44
|
} catch (error) {
|
|
58
|
-
|
|
45
|
+
failInput(error, opts)
|
|
59
46
|
}
|
|
60
47
|
|
|
61
48
|
await runKernelCommand({
|
|
62
49
|
opts,
|
|
63
50
|
label: 'Query',
|
|
64
|
-
fn:
|
|
51
|
+
fn: async (context) => {
|
|
52
|
+
const expanded = await Promise.all(sources.map((source) => expandSelfInPath(source, context)))
|
|
53
|
+
const meta: SelfExpansionMeta | undefined = expanded.find(
|
|
54
|
+
(entry) => entry.meta !== undefined,
|
|
55
|
+
)?.meta
|
|
56
|
+
const resolved =
|
|
57
|
+
meta === undefined
|
|
58
|
+
? prepared
|
|
59
|
+
: prepareQuery({ ...input, sources: expanded.map(({ path }) => path) })
|
|
60
|
+
return withSelfHint(() => context.graph.query(resolved.ast, { page: resolved.page }), meta)
|
|
61
|
+
},
|
|
65
62
|
format: (response, format) => {
|
|
66
63
|
output(response.result, format)
|
|
67
64
|
if (response.page.next && !isMachine(format)) {
|
|
@@ -81,9 +78,9 @@ async function readAst(opts: QueryOpts): Promise<unknown | undefined> {
|
|
|
81
78
|
try {
|
|
82
79
|
raw = await readFile(opts.file, 'utf8')
|
|
83
80
|
} catch (error) {
|
|
84
|
-
throw new
|
|
85
|
-
|
|
86
|
-
)
|
|
81
|
+
throw new AstraleError('FILE_READ_FAILED', `Cannot read --file ${opts.file}.`, undefined, {
|
|
82
|
+
cause: error,
|
|
83
|
+
})
|
|
87
84
|
}
|
|
88
85
|
return parseJson(raw, opts.file)
|
|
89
86
|
}
|
|
@@ -122,7 +119,7 @@ Examples:
|
|
|
122
119
|
{ flags: '-f, --file <path>', description: 'Read a canonical Query V6 document from a file' },
|
|
123
120
|
{
|
|
124
121
|
flags: '--definition <path>',
|
|
125
|
-
description: 'Select Nodes
|
|
122
|
+
description: 'Select Nodes satisfying one exact Class',
|
|
126
123
|
},
|
|
127
124
|
{ flags: '--edge <class>', description: 'Expand one exact Edge Class' },
|
|
128
125
|
{
|
package/src/commands/studio.ts
CHANGED
|
@@ -25,6 +25,23 @@ type StudioOpts = RawOutputOpts & {
|
|
|
25
25
|
const STUDIO_PORT_BASE = 4319
|
|
26
26
|
const VITE_PORT_BASE = 5273
|
|
27
27
|
const PORT_SPAN = 20
|
|
28
|
+
const STUDIO_CLI_DESCRIPTOR_ENV = 'DOMAIN_STUDIO_CLI_DESCRIPTOR'
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Describe this exact CLI invocation for the Studio server. A source/published
|
|
32
|
+
* script needs its entrypoint after node/bun; a Bun-compiled executable is
|
|
33
|
+
* self-contained and therefore has no prefix argument.
|
|
34
|
+
*/
|
|
35
|
+
export function encodeStudioCliDescriptor(
|
|
36
|
+
executable = process.execPath,
|
|
37
|
+
entry = process.argv[1],
|
|
38
|
+
): string {
|
|
39
|
+
const args =
|
|
40
|
+
entry && entry !== executable && !entry.startsWith('/$bunfs') && existsSync(entry)
|
|
41
|
+
? [realpathSync(entry)]
|
|
42
|
+
: []
|
|
43
|
+
return JSON.stringify({ version: 1, executable, args })
|
|
44
|
+
}
|
|
28
45
|
|
|
29
46
|
/**
|
|
30
47
|
* Locate the studio package shipped with / alongside the CLI. Anchored to the
|
|
@@ -217,6 +234,7 @@ Examples:
|
|
|
217
234
|
log.dim(` using ASTRALE_STUDIO_DIR=${studioDir}`)
|
|
218
235
|
}
|
|
219
236
|
await ensureBun()
|
|
237
|
+
const cliDescriptor = encodeStudioCliDescriptor()
|
|
220
238
|
|
|
221
239
|
// Default to PROD — serve the prebuilt client. It always renders, is what a
|
|
222
240
|
// published/global install runs, and avoids dev's heavy source-module graph.
|
|
@@ -342,6 +360,7 @@ Examples:
|
|
|
342
360
|
VITE_URL: `http://127.0.0.1:${vitePort}`,
|
|
343
361
|
PORT: String(studioPort),
|
|
344
362
|
DOMAIN_STUDIO_HOST: '127.0.0.1',
|
|
363
|
+
[STUDIO_CLI_DESCRIPTOR_ENV]: cliDescriptor,
|
|
345
364
|
...(opts.harness ? { DOMAIN_STUDIO_HARNESS: opts.harness } : {}),
|
|
346
365
|
},
|
|
347
366
|
},
|
|
@@ -367,6 +386,7 @@ Examples:
|
|
|
367
386
|
DOMAIN_STUDIO_DIST: dist,
|
|
368
387
|
PORT: String(studioPort),
|
|
369
388
|
DOMAIN_STUDIO_HOST: '127.0.0.1',
|
|
389
|
+
[STUDIO_CLI_DESCRIPTOR_ENV]: cliDescriptor,
|
|
370
390
|
...(opts.harness ? { DOMAIN_STUDIO_HARNESS: opts.harness } : {}),
|
|
371
391
|
},
|
|
372
392
|
},
|
package/src/commands/token.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { CommandDefinition } from '../program/index'
|
|
|
6
6
|
import { runKernelCommand } from '../connection'
|
|
7
7
|
import { AstraleError } from '../errors'
|
|
8
8
|
import { decodeJwtExpiration } from '../lib/local-status'
|
|
9
|
-
import {
|
|
9
|
+
import { failInput, log } from '../lib/log'
|
|
10
10
|
import { output } from '../lib/output'
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -23,7 +23,12 @@ export type TokenOpts = KernelCommandOpts & {
|
|
|
23
23
|
|
|
24
24
|
export async function tokenCommand(opts: TokenOpts): Promise<void> {
|
|
25
25
|
const commandOpts: TokenOpts = opts.for && !opts.as ? { ...opts, as: opts.for } : opts
|
|
26
|
-
|
|
26
|
+
let ttl: number
|
|
27
|
+
try {
|
|
28
|
+
ttl = parseTtl(commandOpts.ttl)
|
|
29
|
+
} catch (error) {
|
|
30
|
+
failInput(error, opts)
|
|
31
|
+
}
|
|
27
32
|
await runKernelCommand<string>({
|
|
28
33
|
opts: commandOpts,
|
|
29
34
|
label: 'Minting delegation token',
|
|
@@ -97,10 +102,6 @@ Examples:
|
|
|
97
102
|
{ flags: '--for <identity>', description: 'Mint the token for this identity (alias of --as)' },
|
|
98
103
|
],
|
|
99
104
|
action: async (opts) => {
|
|
100
|
-
|
|
101
|
-
await tokenCommand(opts as Parameters<typeof tokenCommand>[0])
|
|
102
|
-
} catch (error) {
|
|
103
|
-
failClosed(error, opts as TokenOpts)
|
|
104
|
-
}
|
|
105
|
+
await tokenCommand(opts as Parameters<typeof tokenCommand>[0])
|
|
105
106
|
},
|
|
106
107
|
} satisfies CommandDefinition
|
package/src/commands/update.ts
CHANGED
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
type SdkOutdated,
|
|
13
13
|
} from '../lib/sdk-deps'
|
|
14
14
|
import { ASTRALE_CLI_SKILL, detectSkill, installSkills, SKILL_INSTALL_HINT } from '../lib/skills'
|
|
15
|
-
import { updateAstrale } from '../lib/update'
|
|
15
|
+
import { DEFAULT_UPDATE_CHANNEL, packageManagedUpdateError, updateAstrale } from '../lib/update'
|
|
16
16
|
|
|
17
17
|
type UpdateOpts = RawOutputOpts & {
|
|
18
18
|
check?: boolean
|
|
@@ -104,14 +104,22 @@ async function refreshSdkDeps(check: boolean, assumeYes = false): Promise<boolea
|
|
|
104
104
|
/**
|
|
105
105
|
* Read-only staleness report for tooling — `astrale update --check --json`.
|
|
106
106
|
* domain-studio polls this on load to drive its "update available" badge. It is
|
|
107
|
-
* unified and NON-THROWING:
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
* update`, so a stale CLI or
|
|
107
|
+
* unified and NON-THROWING: an explicit package-managed result uses npm release
|
|
108
|
+
* identity, while script-install failures remain script failures in `error`
|
|
109
|
+
* instead of being recategorized. The SDK axis is already best-effort. Skills are
|
|
110
|
+
* intentionally absent — they ride along with `astrale update`, so a stale CLI or
|
|
111
|
+
* SDK is the only signal worth surfacing.
|
|
111
112
|
*/
|
|
112
113
|
export type StaleReport = {
|
|
113
114
|
stale: boolean
|
|
114
|
-
cli: {
|
|
115
|
+
cli: {
|
|
116
|
+
stale: boolean
|
|
117
|
+
managed: boolean
|
|
118
|
+
current?: string
|
|
119
|
+
latest?: string
|
|
120
|
+
channel?: string
|
|
121
|
+
error?: string
|
|
122
|
+
}
|
|
115
123
|
sdk: { stale: boolean; inProject: boolean; outdated: SdkOutdated[] }
|
|
116
124
|
}
|
|
117
125
|
|
|
@@ -130,13 +138,23 @@ export async function cliStale(
|
|
|
130
138
|
dependencies: CliStaleDependencies = CLI_STALE_DEPENDENCIES,
|
|
131
139
|
): Promise<StaleReport['cli']> {
|
|
132
140
|
const running = pkg.version
|
|
141
|
+
const target = { ...opts, channel: opts.channel ?? DEFAULT_UPDATE_CHANNEL }
|
|
133
142
|
try {
|
|
134
143
|
const r = await dependencies.update({
|
|
135
144
|
check: true,
|
|
136
|
-
channel:
|
|
137
|
-
version:
|
|
145
|
+
channel: target.channel,
|
|
146
|
+
version: target.version,
|
|
138
147
|
currentVersion: running,
|
|
139
148
|
})
|
|
149
|
+
if (r.status === 'managed') {
|
|
150
|
+
const latest = await dependencies.fetchPackageVersion(target).catch(() => undefined)
|
|
151
|
+
return {
|
|
152
|
+
stale: latest !== undefined && latest !== running,
|
|
153
|
+
managed: true,
|
|
154
|
+
current: running,
|
|
155
|
+
...(latest === undefined ? {} : { latest, channel: 'npm' }),
|
|
156
|
+
}
|
|
157
|
+
}
|
|
140
158
|
if (r.status === 'updated') {
|
|
141
159
|
return {
|
|
142
160
|
stale: false,
|
|
@@ -153,13 +171,12 @@ export async function cliStale(
|
|
|
153
171
|
latest: r.latestVersion,
|
|
154
172
|
channel: r.channel,
|
|
155
173
|
}
|
|
156
|
-
} catch {
|
|
157
|
-
const latest = await dependencies.fetchPackageVersion(opts).catch(() => undefined)
|
|
174
|
+
} catch (error) {
|
|
158
175
|
return {
|
|
159
|
-
stale:
|
|
160
|
-
managed:
|
|
176
|
+
stale: false,
|
|
177
|
+
managed: false,
|
|
161
178
|
current: running,
|
|
162
|
-
|
|
179
|
+
error: error instanceof Error ? error.message : String(error),
|
|
163
180
|
}
|
|
164
181
|
}
|
|
165
182
|
}
|
|
@@ -167,7 +184,8 @@ export async function cliStale(
|
|
|
167
184
|
export async function fetchNpmTargetVersion(
|
|
168
185
|
opts: Pick<UpdateOpts, 'channel' | 'version'>,
|
|
169
186
|
): Promise<string> {
|
|
170
|
-
const
|
|
187
|
+
const channel = opts.channel ?? DEFAULT_UPDATE_CHANNEL
|
|
188
|
+
const target = opts.version ?? (channel === 'stable' ? 'latest' : channel)
|
|
171
189
|
const response = await fetch(`https://registry.npmjs.org/@astrale-os/cli/${target}`)
|
|
172
190
|
if (!response.ok) throw new Error(`npm registry HTTP ${response.status}`)
|
|
173
191
|
const body: unknown = await response.json()
|
|
@@ -197,6 +215,7 @@ export default {
|
|
|
197
215
|
{
|
|
198
216
|
flags: '--channel <name>',
|
|
199
217
|
description: 'Update from a release channel (alpha, beta, rc, canary, stable)',
|
|
218
|
+
default: DEFAULT_UPDATE_CHANNEL,
|
|
200
219
|
},
|
|
201
220
|
{ flags: '--version <version>', description: 'Update to an exact version tag' },
|
|
202
221
|
{ flags: '--no-skills', description: 'Skip refreshing the astrale agent skills' },
|
|
@@ -221,6 +240,7 @@ Behavior:
|
|
|
221
240
|
the lockfile, honoring your registry + supply-chain age policy; run "pnpm
|
|
222
241
|
install" to materialize).
|
|
223
242
|
|
|
243
|
+
The default release channel is beta; --channel overrides it for one run.
|
|
224
244
|
--check is a dry run (binary + SDK deps; exit 10 if anything is available) and
|
|
225
245
|
never writes. With --json it emits a unified staleness report
|
|
226
246
|
({ stale, cli, sdk }) for tooling — non-throwing, skills omitted (they ride
|
|
@@ -290,6 +310,10 @@ Examples:
|
|
|
290
310
|
log.success(`Updated astrale ${result.previousVersion} -> ${result.currentVersion}`)
|
|
291
311
|
log.dim(` channel: ${result.channel}`)
|
|
292
312
|
log.dim(` binary: ${result.bin}`)
|
|
313
|
+
} else if (result?.status === 'managed') {
|
|
314
|
+
const error = packageManagedUpdateError(result.executable)
|
|
315
|
+
if (!opts.yes) throw error
|
|
316
|
+
log.warn(`CLI self-update skipped: ${error.message}`)
|
|
293
317
|
}
|
|
294
318
|
|
|
295
319
|
// Axis B — agent skills. Keep an existing install current with the CLI.
|
package/src/commands/view.ts
CHANGED
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
import { snapshotText, waitForSettledSnapshot } from '../lib/view/snapshot'
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
|
-
* `astrale view` — open ONE view in
|
|
45
|
+
* `astrale view` — open ONE view in a local browser shell, authenticated as
|
|
46
46
|
* the CLI identity, driveable by agent-browser (default) or a real browser.
|
|
47
47
|
* Design + protocol details: VIEW_CLI_SPEC.md at the workspace root.
|
|
48
48
|
*/
|
|
@@ -89,9 +89,10 @@ export async function resolveSession(
|
|
|
89
89
|
}
|
|
90
90
|
const targetInput =
|
|
91
91
|
parsed.kind === 'target' ? parsed.path : (opts.target ?? viewOwnerTarget(parsed.path))
|
|
92
|
-
const {
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
const { target, candidates } = await withClientSession(opts, async (context) => {
|
|
93
|
+
const { path: target } = await expandSelfInPath(targetInput, context)
|
|
94
|
+
return { target, candidates: await resolveViewCandidates(context, target) }
|
|
95
|
+
})
|
|
95
96
|
|
|
96
97
|
if (opts.list) {
|
|
97
98
|
return { candidates }
|
|
@@ -484,7 +485,7 @@ async function sessionsCommand(opts: ViewOpts): Promise<void> {
|
|
|
484
485
|
|
|
485
486
|
export default {
|
|
486
487
|
name: 'view',
|
|
487
|
-
description: 'Open one view in
|
|
488
|
+
description: 'Open one view in a local browser shell your agent can drive',
|
|
488
489
|
arguments: [
|
|
489
490
|
{
|
|
490
491
|
name: 'spec',
|
|
@@ -524,7 +525,7 @@ export default {
|
|
|
524
525
|
afterHelpText: `
|
|
525
526
|
What it does:
|
|
526
527
|
Renders ONE view — no GUI, no cookies, no WorkOS. It resolves the view on the
|
|
527
|
-
kernel, starts a loopback session server that
|
|
528
|
+
kernel, starts a loopback session server that supplies the shell handshake (real
|
|
528
529
|
handshake via @astrale-os/shell, token minted from YOUR CLI identity, kernel
|
|
529
530
|
calls proxied), and opens the page headless in agent-browser. Driving stays
|
|
530
531
|
agent-browser's job; auth follows --as/--creds/-i like any kernel command.
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import type { Call } from '@astrale-os/kernel-client'
|
|
2
|
-
import type { AuthApi } from '@astrale-os/kernel-client/auth'
|
|
3
|
-
import type { GraphApi } from '@astrale-os/kernel-client/graph'
|
|
4
|
-
import type { ClientSession } from '@astrale-os/kernel-client/session'
|
|
5
1
|
import type { IssuerId } from '@astrale-os/sdk/auth'
|
|
2
|
+
import type { AuthApi } from '@astrale-os/sdk/auth'
|
|
3
|
+
import type { Call, GraphApi } from '@astrale-os/sdk/client'
|
|
4
|
+
import type { ClientSession } from '@astrale-os/sdk/client/session'
|
|
6
5
|
|
|
7
6
|
/** Existing CLI connection flags accepted by Kernel-touching commands. */
|
|
8
7
|
export interface ConnectionOptions {
|
|
@@ -78,17 +77,17 @@ export function withAdminClientSession<Value>(
|
|
|
78
77
|
/** Expand @self through the effective principal returned by authenticated Identity.whoami. */
|
|
79
78
|
export function expandSelfInPath(
|
|
80
79
|
path: string,
|
|
81
|
-
|
|
80
|
+
context: ConnectionContext,
|
|
82
81
|
): Promise<{ readonly path: string; readonly meta?: SelfExpansionMeta }>
|
|
83
82
|
|
|
84
83
|
/** Expand @self once across one Call path and its CLI-authored string parameters. */
|
|
85
84
|
export function expandSelfInCall(
|
|
86
85
|
path: string,
|
|
87
|
-
parameters:
|
|
88
|
-
|
|
86
|
+
parameters: Readonly<Record<string, unknown>>,
|
|
87
|
+
context: ConnectionContext,
|
|
89
88
|
): Promise<{
|
|
90
89
|
readonly path: string
|
|
91
|
-
readonly parameters:
|
|
90
|
+
readonly parameters: Readonly<Record<string, unknown>>
|
|
92
91
|
readonly meta?: SelfExpansionMeta
|
|
93
92
|
}>
|
|
94
93
|
|
|
@@ -40,7 +40,8 @@ customizes only the Fetch capability passed to Client. `withClientSession` and
|
|
|
40
40
|
`withAdminClientSession` are terminal lifecycle boundaries: success, failure, and cancellation all
|
|
41
41
|
close both the Client Session and its direct source-Auth client.
|
|
42
42
|
|
|
43
|
-
The command boundary
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
43
|
+
The command boundary projects typed Client failure identity, transport context, phase, and
|
|
44
|
+
invocation-only delivery evidence without inspecting a private cause message. Unknown native
|
|
45
|
+
failures become one honest unexpected diagnostic; their bounded cause graph is visible only under
|
|
46
|
+
explicit debug output. Every admitted Kernel reason remains available in machine output, while
|
|
47
|
+
human repair details require a bounded public Function issue or exact Query reason variant.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { Call } from '@astrale-os/sdk/client'
|
|
2
|
+
import type { SessionAuth } from '@astrale-os/sdk/client/session'
|
|
3
3
|
|
|
4
4
|
import type { ConnectionContext, ConnectionOptions, ConnectionTarget } from '../api.js'
|
|
5
5
|
|
|
@@ -111,7 +111,7 @@ export const CLI_AUTH_REGISTRATION_TARGET = defineLaw({
|
|
|
111
111
|
export const CLI_SELF_AUTHENTICATED_PRINCIPAL = defineLaw({
|
|
112
112
|
id: 'CLI-SELF-AUTHENTICATED-PRINCIPAL',
|
|
113
113
|
statement:
|
|
114
|
-
'@self resolves
|
|
114
|
+
'@self resolves inside the command-owned Client Session from authenticated Identity.whoami on the selected target, so resolution and dispatch share one lifecycle and delegated carriers never use an unverified JWT subject or stale local registration.',
|
|
115
115
|
tests: [
|
|
116
116
|
{
|
|
117
117
|
file: '__tests__/self.test.ts',
|
|
@@ -183,7 +183,7 @@ export const CLI_CONNECTION_PUBLIC_SEMANTIC_REASON = defineLaw({
|
|
|
183
183
|
export const CLI_CONNECTION_TYPED_ERROR_PRESENTATION = defineLaw({
|
|
184
184
|
id: 'CLI-CONNECTION-TYPED-ERROR-PRESENTATION',
|
|
185
185
|
statement:
|
|
186
|
-
'The command boundary maps typed Client transport phase and delivery evidence without parsing a private cause
|
|
186
|
+
'The command boundary maps typed Client failure identity, transport context, phase, and invocation-only delivery evidence without parsing a private cause; acquisition never receives retry advice, unknown native failures have one non-blank unexpected diagnostic, and raw causes appear only under explicit debug output.',
|
|
187
187
|
tests: [
|
|
188
188
|
{
|
|
189
189
|
file: '__tests__/errors.test.ts',
|
|
@@ -197,5 +197,9 @@ export const CLI_CONNECTION_TYPED_ERROR_PRESENTATION = defineLaw({
|
|
|
197
197
|
file: '__tests__/reasons.test.ts',
|
|
198
198
|
id: 'TEST-CLI-CONNECTION-ADMITS-BOUNDED-REASONS',
|
|
199
199
|
},
|
|
200
|
+
{
|
|
201
|
+
file: '__tests__/failure-safety.test.ts',
|
|
202
|
+
id: 'TEST-CLI-CONNECTION-FAILURE-SAFETY',
|
|
203
|
+
},
|
|
200
204
|
],
|
|
201
205
|
})
|