@b00dea/cockpit 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +375 -0
- package/LICENSE +21 -0
- package/README.md +22 -2
- package/bin/cockpit.mjs +33 -0
- package/cockpit.schema.json +2574 -0
- package/dist/autonomy.d.ts +44 -0
- package/dist/autonomy.js +156 -0
- package/dist/bounded-read.d.ts +14 -0
- package/dist/bounded-read.js +42 -0
- package/dist/browser/commands.d.ts +62 -0
- package/dist/browser/commands.js +349 -0
- package/dist/browser/package-paths.d.ts +1 -0
- package/dist/browser/package-paths.js +6 -0
- package/dist/browser/proxy.d.ts +22 -0
- package/dist/browser/proxy.js +37 -0
- package/dist/browser/runtime.d.ts +117 -0
- package/dist/browser/runtime.js +183 -0
- package/dist/browser/surfaces.d.ts +141 -0
- package/dist/browser/surfaces.js +556 -0
- package/dist/browser/ui-gate.d.ts +15 -0
- package/dist/browser/ui-gate.js +18 -0
- package/dist/cli-guard.d.ts +5 -0
- package/dist/cli-guard.js +71 -0
- package/dist/cli-main.d.ts +139 -0
- package/dist/cli-main.js +1405 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +16 -0
- package/dist/command-table.d.ts +113 -0
- package/dist/command-table.js +512 -0
- package/dist/config/load.d.ts +171 -0
- package/dist/config/load.js +345 -0
- package/dist/config/sibling-toml.d.ts +48 -0
- package/dist/config/sibling-toml.js +160 -0
- package/dist/config/surface-tools-toml.d.ts +9 -0
- package/dist/config/surface-tools-toml.js +37 -0
- package/dist/config/verified-write.d.ts +43 -0
- package/dist/config/verified-write.js +89 -0
- package/dist/diagnostics.d.ts +26 -0
- package/dist/diagnostics.js +335 -0
- package/dist/emit.d.ts +22 -0
- package/dist/emit.js +43 -0
- package/dist/entrypoint-kinds.d.ts +3 -0
- package/dist/entrypoint-kinds.js +11 -0
- package/dist/environment/application/destructive.d.ts +6 -0
- package/dist/environment/application/destructive.js +425 -0
- package/dist/environment/application/doctor.d.ts +89 -0
- package/dist/environment/application/doctor.js +235 -0
- package/dist/environment/application/guard.d.ts +43 -0
- package/dist/environment/application/guard.js +622 -0
- package/dist/environment/application/health.d.ts +134 -0
- package/dist/environment/application/health.js +379 -0
- package/dist/environment/application/lifecycle-context.d.ts +228 -0
- package/dist/environment/application/lifecycle-context.js +154 -0
- package/dist/environment/application/lifecycle-state.d.ts +25 -0
- package/dist/environment/application/lifecycle-state.js +201 -0
- package/dist/environment/application/lifecycle.d.ts +17 -0
- package/dist/environment/application/lifecycle.js +729 -0
- package/dist/environment/application/logs.d.ts +45 -0
- package/dist/environment/application/logs.js +127 -0
- package/dist/environment/application/setup.d.ts +129 -0
- package/dist/environment/application/setup.js +741 -0
- package/dist/environment/application/shared.d.ts +11 -0
- package/dist/environment/application/shared.js +61 -0
- package/dist/environment/claims.d.ts +389 -0
- package/dist/environment/claims.js +1709 -0
- package/dist/environment/codex-hook-trust.d.ts +11 -0
- package/dist/environment/codex-hook-trust.js +185 -0
- package/dist/environment/compose-environment.d.ts +1 -0
- package/dist/environment/compose-environment.js +6 -0
- package/dist/environment/compose-ownership.d.ts +21 -0
- package/dist/environment/compose-ownership.js +117 -0
- package/dist/environment/compose-topology.d.ts +117 -0
- package/dist/environment/compose-topology.js +413 -0
- package/dist/environment/contract.d.ts +489 -0
- package/dist/environment/contract.js +761 -0
- package/dist/environment/declaration.d.ts +14 -0
- package/dist/environment/declaration.js +39 -0
- package/dist/environment/destructive-composition.d.ts +29 -0
- package/dist/environment/destructive-composition.js +333 -0
- package/dist/environment/docker-daemon.d.ts +30 -0
- package/dist/environment/docker-daemon.js +78 -0
- package/dist/environment/docker-endpoint.d.ts +10 -0
- package/dist/environment/docker-endpoint.js +19 -0
- package/dist/environment/env-schema-observation.d.ts +46 -0
- package/dist/environment/env-schema-observation.js +241 -0
- package/dist/environment/evidence.d.ts +136 -0
- package/dist/environment/evidence.js +437 -0
- package/dist/environment/executable.d.ts +26 -0
- package/dist/environment/executable.js +167 -0
- package/dist/environment/generated-application/authorities.d.ts +5 -0
- package/dist/environment/generated-application/authorities.js +61 -0
- package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
- package/dist/environment/generated-application/bootstrap-skill.js +328 -0
- package/dist/environment/generated-application/check.d.ts +13 -0
- package/dist/environment/generated-application/check.js +189 -0
- package/dist/environment/generated-application/custom-surface.d.ts +26 -0
- package/dist/environment/generated-application/custom-surface.js +289 -0
- package/dist/environment/generated-application/prepare.d.ts +29 -0
- package/dist/environment/generated-application/prepare.js +276 -0
- package/dist/environment/generated-application/publication.d.ts +33 -0
- package/dist/environment/generated-application/publication.js +547 -0
- package/dist/environment/generated-application/shared.d.ts +484 -0
- package/dist/environment/generated-application/shared.js +349 -0
- package/dist/environment/generated-application/surface-observation.d.ts +4 -0
- package/dist/environment/generated-application/surface-observation.js +69 -0
- package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
- package/dist/environment/generated-application/surface-outputs.js +389 -0
- package/dist/environment/generated-application/surfaces.d.ts +3 -0
- package/dist/environment/generated-application/surfaces.js +699 -0
- package/dist/environment/generated-application/sync.d.ts +6 -0
- package/dist/environment/generated-application/sync.js +109 -0
- package/dist/environment/git-observation.d.ts +183 -0
- package/dist/environment/git-observation.js +544 -0
- package/dist/environment/health-composition.d.ts +11 -0
- package/dist/environment/health-composition.js +628 -0
- package/dist/environment/host-observation.d.ts +56 -0
- package/dist/environment/host-observation.js +52 -0
- package/dist/environment/identity.d.ts +48 -0
- package/dist/environment/identity.js +85 -0
- package/dist/environment/init-application.d.ts +308 -0
- package/dist/environment/init-application.js +697 -0
- package/dist/environment/install-policy-observation.d.ts +71 -0
- package/dist/environment/install-policy-observation.js +284 -0
- package/dist/environment/install-policy.d.ts +48 -0
- package/dist/environment/install-policy.js +96 -0
- package/dist/environment/instance.d.ts +33 -0
- package/dist/environment/instance.js +122 -0
- package/dist/environment/instruction-pointer.d.ts +19 -0
- package/dist/environment/instruction-pointer.js +144 -0
- package/dist/environment/lifecycle-composition.d.ts +29 -0
- package/dist/environment/lifecycle-composition.js +675 -0
- package/dist/environment/lifecycle-stage.d.ts +115 -0
- package/dist/environment/lifecycle-stage.js +398 -0
- package/dist/environment/lifecycle.d.ts +75 -0
- package/dist/environment/lifecycle.js +354 -0
- package/dist/environment/logs.d.ts +132 -0
- package/dist/environment/logs.js +519 -0
- package/dist/environment/observations.d.ts +46 -0
- package/dist/environment/observations.js +344 -0
- package/dist/environment/operator-application.d.ts +50 -0
- package/dist/environment/operator-application.js +155 -0
- package/dist/environment/ports.d.ts +182 -0
- package/dist/environment/ports.js +1205 -0
- package/dist/environment/posture-observation.d.ts +68 -0
- package/dist/environment/posture-observation.js +253 -0
- package/dist/environment/read-composition.d.ts +27 -0
- package/dist/environment/read-composition.js +352 -0
- package/dist/environment/readiness-composition.d.ts +38 -0
- package/dist/environment/readiness-composition.js +130 -0
- package/dist/environment/reclaim.d.ts +333 -0
- package/dist/environment/reclaim.js +1835 -0
- package/dist/environment/repository-identity.d.ts +13 -0
- package/dist/environment/repository-identity.js +108 -0
- package/dist/environment/runtime-measurement-record.d.ts +38 -0
- package/dist/environment/runtime-measurement-record.js +111 -0
- package/dist/environment/runtime-measurement.d.ts +27 -0
- package/dist/environment/runtime-measurement.js +224 -0
- package/dist/environment/runtime-probe-residue.d.ts +43 -0
- package/dist/environment/runtime-probe-residue.js +148 -0
- package/dist/environment/runtime-probe.d.ts +72 -0
- package/dist/environment/runtime-probe.js +725 -0
- package/dist/environment/runtime.d.ts +505 -0
- package/dist/environment/runtime.js +2335 -0
- package/dist/environment/seed.d.ts +16 -0
- package/dist/environment/seed.js +43 -0
- package/dist/environment/selftest-application.d.ts +86 -0
- package/dist/environment/selftest-application.js +713 -0
- package/dist/environment/sensitive.d.ts +3 -0
- package/dist/environment/sensitive.js +48 -0
- package/dist/environment/setup-observation.d.ts +62 -0
- package/dist/environment/setup-observation.js +1473 -0
- package/dist/environment/setup.d.ts +43 -0
- package/dist/environment/setup.js +176 -0
- package/dist/environment/sibling-instructions.d.ts +33 -0
- package/dist/environment/sibling-instructions.js +224 -0
- package/dist/environment/sibling-registration.d.ts +45 -0
- package/dist/environment/sibling-registration.js +538 -0
- package/dist/environment/state.d.ts +371 -0
- package/dist/environment/state.js +2013 -0
- package/dist/environment/templates.d.ts +140 -0
- package/dist/environment/templates.js +685 -0
- package/dist/environment/tool-registration.d.ts +9 -0
- package/dist/environment/tool-registration.js +96 -0
- package/dist/environment/upgrade-application.d.ts +19 -0
- package/dist/environment/upgrade-application.js +175 -0
- package/dist/environment-exec/execute.d.ts +102 -0
- package/dist/environment-exec/execute.js +1175 -0
- package/dist/environment-exec/libexec-program.d.ts +6 -0
- package/dist/environment-exec/libexec-program.js +22 -0
- package/dist/environment-exec/verified-digest.d.ts +4 -0
- package/dist/environment-exec/verified-digest.js +16 -0
- package/dist/exact-keys.d.ts +7 -0
- package/dist/exact-keys.js +15 -0
- package/dist/fix-catalogue.d.ts +32 -0
- package/dist/fix-catalogue.js +60 -0
- package/dist/freshness.d.ts +29 -0
- package/dist/freshness.js +75 -0
- package/dist/generated-environment/adopt.d.ts +16 -0
- package/dist/generated-environment/adopt.js +275 -0
- package/dist/generated-environment/command.d.ts +47 -0
- package/dist/generated-environment/command.js +75 -0
- package/dist/generated-environment/transaction.d.ts +186 -0
- package/dist/generated-environment/transaction.js +1770 -0
- package/dist/grading/evaluate.d.ts +71 -0
- package/dist/grading/evaluate.js +403 -0
- package/dist/grading/grade.d.ts +33 -0
- package/dist/grading/grade.js +57 -0
- package/dist/guards/evaluator.d.ts +113 -0
- package/dist/guards/evaluator.js +1226 -0
- package/dist/guards/harness-adapter.d.ts +17 -0
- package/dist/guards/harness-adapter.js +57 -0
- package/dist/guards/host.d.ts +8 -0
- package/dist/guards/host.js +10 -0
- package/dist/guards/invocation-parser.d.ts +66 -0
- package/dist/guards/invocation-parser.js +595 -0
- package/dist/guards/local-identity.d.ts +40 -0
- package/dist/guards/local-identity.js +123 -0
- package/dist/guards/policy-pin.d.ts +13 -0
- package/dist/guards/policy-pin.js +175 -0
- package/dist/guards/protected-locations.d.ts +62 -0
- package/dist/guards/protected-locations.js +461 -0
- package/dist/guards/read-only.d.ts +37 -0
- package/dist/guards/read-only.js +315 -0
- package/dist/init/command.d.ts +40 -0
- package/dist/init/command.js +310 -0
- package/dist/init/derive.d.ts +51 -0
- package/dist/init/derive.js +715 -0
- package/dist/init/draft.d.ts +138 -0
- package/dist/init/draft.js +1205 -0
- package/dist/init/render.d.ts +35 -0
- package/dist/init/render.js +82 -0
- package/dist/init/scaffold.d.ts +53 -0
- package/dist/init/scaffold.js +121 -0
- package/dist/invocation.d.ts +13 -0
- package/dist/invocation.js +20 -0
- package/dist/package-metadata.d.ts +9 -0
- package/dist/package-metadata.js +19 -0
- package/dist/readiness.d.ts +53 -0
- package/dist/readiness.js +88 -0
- package/dist/references/named.d.ts +24 -0
- package/dist/references/named.js +27 -0
- package/dist/refusal.d.ts +15 -0
- package/dist/refusal.js +7 -0
- package/dist/registry-derivation.d.ts +31 -0
- package/dist/registry-derivation.js +32 -0
- package/dist/registry-resolve/command.d.ts +47 -0
- package/dist/registry-resolve/command.js +226 -0
- package/dist/registry-resolve/registry.d.ts +68 -0
- package/dist/registry-resolve/registry.js +292 -0
- package/dist/registry-resolve/render-shell.d.ts +18 -0
- package/dist/registry-resolve/render-shell.js +36 -0
- package/dist/repair.d.ts +29 -0
- package/dist/repair.js +8 -0
- package/dist/schema-json.d.ts +1 -0
- package/dist/schema-json.js +177 -0
- package/dist/schema.d.ts +1322 -0
- package/dist/schema.js +934 -0
- package/dist/setup/command.d.ts +4 -0
- package/dist/setup/command.js +4 -0
- package/dist/sha256.d.ts +1 -0
- package/dist/sha256.js +4 -0
- package/dist/surfaces/adoption.d.ts +41 -0
- package/dist/surfaces/adoption.js +217 -0
- package/dist/surfaces/consumer-instructions.d.ts +20 -0
- package/dist/surfaces/consumer-instructions.js +43 -0
- package/dist/surfaces/contract.d.ts +42 -0
- package/dist/surfaces/contract.js +169 -0
- package/dist/surfaces/core-declarations.d.ts +24 -0
- package/dist/surfaces/core-declarations.js +79 -0
- package/dist/surfaces/development-markers.d.ts +1 -0
- package/dist/surfaces/development-markers.js +18 -0
- package/dist/surfaces/generator-adapter.d.ts +71 -0
- package/dist/surfaces/generator-adapter.js +809 -0
- package/dist/surfaces/harness-registry.d.ts +180 -0
- package/dist/surfaces/harness-registry.js +117 -0
- package/dist/surfaces/mcp.d.ts +95 -0
- package/dist/surfaces/mcp.js +186 -0
- package/dist/surfaces/merge.d.ts +30 -0
- package/dist/surfaces/merge.js +105 -0
- package/dist/surfaces/ownership.d.ts +190 -0
- package/dist/surfaces/ownership.js +795 -0
- package/dist/surfaces/projection.d.ts +136 -0
- package/dist/surfaces/projection.js +681 -0
- package/dist/surfaces/render.d.ts +118 -0
- package/dist/surfaces/render.js +633 -0
- package/dist/surfaces/restrictions.d.ts +130 -0
- package/dist/surfaces/restrictions.js +447 -0
- package/dist/surfaces/selftest.d.ts +162 -0
- package/dist/surfaces/selftest.js +393 -0
- package/dist/surfaces/skill-contract.d.ts +85 -0
- package/dist/surfaces/skill-contract.js +449 -0
- package/dist/surfaces/sync.d.ts +57 -0
- package/dist/surfaces/sync.js +164 -0
- package/dist/team-metadata.d.ts +41 -0
- package/dist/team-metadata.js +512 -0
- package/dist/testing/gates.d.ts +91 -0
- package/dist/testing/gates.js +182 -0
- package/dist/testing/hooks.d.ts +59 -0
- package/dist/testing/hooks.js +139 -0
- package/dist/testing/verdict.d.ts +29 -0
- package/dist/testing/verdict.js +62 -0
- package/dist/work-orders/application.d.ts +99 -0
- package/dist/work-orders/application.js +383 -0
- package/dist/work-orders/composition.d.ts +124 -0
- package/dist/work-orders/composition.js +1010 -0
- package/dist/work-orders/contract.d.ts +61 -0
- package/dist/work-orders/contract.js +122 -0
- package/dist/work-orders/store.d.ts +158 -0
- package/dist/work-orders/store.js +197 -0
- package/docs/README.md +65 -0
- package/docs/architecture.md +136 -0
- package/docs/capability-matrix.md +50 -0
- package/docs/cli-reference.md +599 -0
- package/docs/command-list.md +51 -0
- package/docs/compose-patterns.md +99 -0
- package/docs/concepts.md +171 -0
- package/docs/configuration-essentials.md +172 -0
- package/docs/configuration-reference.md +621 -0
- package/docs/environment.md +760 -0
- package/docs/extending.md +43 -0
- package/docs/faq.md +111 -0
- package/docs/getting-started.md +608 -0
- package/docs/harness-surfaces.md +433 -0
- package/docs/joining-a-team.md +76 -0
- package/docs/release-policy.md +49 -0
- package/docs/safety-and-autonomy.md +419 -0
- package/docs/troubleshooting.md +361 -0
- package/docs/tutorial.md +170 -0
- package/docs/work-and-browser.md +254 -0
- package/libexec/browser-operation.cjs +186 -0
- package/libexec/fence-marker.cjs +101 -0
- package/libexec/fence-marker.d.cts +24 -0
- package/libexec/fenced-group-runner.cjs +77 -0
- package/libexec/fenced-supervisor.cjs +137 -0
- package/libexec/generated-filesystem.cjs +731 -0
- package/libexec/install-filesystem.cjs +225 -0
- package/libexec/rulesync-generator.NOTICE.md +1112 -0
- package/libexec/rulesync-generator.cjs +743 -0
- package/libexec/surface-generator-worker.cjs +266 -0
- package/libexec/surface-output-reader.cjs +99 -0
- package/libexec/surface-scratch-cleanup.cjs +14 -0
- package/libexec/validate-harness-evidence.d.mts +183 -0
- package/libexec/validate-harness-evidence.mjs +1312 -0
- package/package.json +74 -4
- package/surfaces/README.md +33 -0
- package/surfaces/agents/evaluator.agent.md +76 -0
- package/surfaces/guards/bash-guard.sh +48 -0
- package/surfaces/guards/claude.adapter.json +25 -0
- package/surfaces/guards/codex.adapter.json +24 -0
- package/surfaces/guards/opencode.adapter.json +25 -0
- package/surfaces/references/browser.md +63 -0
- package/surfaces/references/test-data-and-personas.md +84 -0
- package/surfaces/references/testing-tiers.md +11 -0
- package/surfaces/skills/cockpit-browser.skill.md +54 -0
- package/surfaces/skills/cockpit-explain.skill.md +32 -0
- package/surfaces/skills/cockpit-fix.skill.md +37 -0
- package/surfaces/skills/cockpit-setup.skill.md +39 -0
- package/surfaces/skills/cockpit-work.skill.md +34 -0
- package/surfaces/skills/collection.json +5 -0
- package/surfaces/skills/procedures/explain.md +61 -0
- package/surfaces/skills/procedures/fix.md +81 -0
- package/surfaces/skills/procedures/setup.md +379 -0
- package/surfaces/skills/procedures/work.md +105 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ExecuteProbeOutcome } from '../../environment-exec/execute.js';
|
|
2
|
+
import { type EnvironmentCommandOutcome, type EnvironmentDiagnostic, type ExecutionStep } from '../contract.js';
|
|
3
|
+
import type { RuntimeAdapterAuthority } from '../runtime.js';
|
|
4
|
+
import { type LogRecord, type LogRequest, type RestartWindow } from '../logs.js';
|
|
5
|
+
export interface LogsCommandInput {
|
|
6
|
+
readonly configPath: string;
|
|
7
|
+
readonly service: string;
|
|
8
|
+
readonly since: string;
|
|
9
|
+
readonly tail: number;
|
|
10
|
+
readonly follow: boolean;
|
|
11
|
+
readonly json: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type LogRequestBase = Omit<LogRequest, 'since' | 'tail' | 'follow'>;
|
|
14
|
+
export interface LogObservation {
|
|
15
|
+
readonly ownComposeAuthority?: Extract<RuntimeAdapterAuthority, {
|
|
16
|
+
ownComposeFiles: true;
|
|
17
|
+
}>;
|
|
18
|
+
readonly request: LogRequestBase;
|
|
19
|
+
readonly restart?: RestartWindow;
|
|
20
|
+
}
|
|
21
|
+
export interface LogsCommandAdapters {
|
|
22
|
+
readonly observe: (input: {
|
|
23
|
+
readonly configPath: string;
|
|
24
|
+
readonly service: string;
|
|
25
|
+
}) => Promise<LogObservation>;
|
|
26
|
+
readonly execute: (step: ExecutionStep, options: {
|
|
27
|
+
readonly signal?: AbortSignal;
|
|
28
|
+
}) => Promise<ExecuteProbeOutcome>;
|
|
29
|
+
readonly signal?: AbortSignal;
|
|
30
|
+
}
|
|
31
|
+
export type LogsCommandResult = EnvironmentCommandOutcome<Readonly<{
|
|
32
|
+
readonly json: boolean;
|
|
33
|
+
readonly records: readonly LogRecord[];
|
|
34
|
+
readonly truncated: boolean;
|
|
35
|
+
}>> | Readonly<{
|
|
36
|
+
kind: 'cancelled';
|
|
37
|
+
status: 130;
|
|
38
|
+
diagnostics: readonly EnvironmentDiagnostic[];
|
|
39
|
+
result: Readonly<{
|
|
40
|
+
json: boolean;
|
|
41
|
+
records: readonly LogRecord[];
|
|
42
|
+
truncated: boolean;
|
|
43
|
+
}>;
|
|
44
|
+
}>;
|
|
45
|
+
export declare function runLogs(input: LogsCommandInput, adapters: LogsCommandAdapters): Promise<LogsCommandResult>;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { ENVIRONMENT_CODES, errorCause } from '../contract.js';
|
|
2
|
+
import { DeclarationRefusalError } from '../declaration.js';
|
|
3
|
+
import { collectLogs, planLogs } from '../logs.js';
|
|
4
|
+
import { applicationDiagnostic } from './health.js';
|
|
5
|
+
import { ownDataValues } from './shared.js';
|
|
6
|
+
function logsRefusal(code, message) {
|
|
7
|
+
return {
|
|
8
|
+
kind: 'refusal', status: 2, result: null,
|
|
9
|
+
diagnostics: [applicationDiagnostic(code, message, 'logs')],
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const logRequestBaseKeys = Object.freeze([
|
|
13
|
+
'runtime', 'executable', 'cwd', 'stackId', 'configSha256', 'batchId', 'containerId',
|
|
14
|
+
'runtimeVersion', 'composeVersion', 'projectName', 'composeFiles', 'services', 'service',
|
|
15
|
+
'timeoutMs', 'outputLimitBytes', 'env',
|
|
16
|
+
]);
|
|
17
|
+
const logService = /^[a-z0-9][a-z0-9_.-]{0,127}$/;
|
|
18
|
+
const relativeLogSince = /^\d+(?:\.\d+)?[smhd]$/;
|
|
19
|
+
const absoluteLogSince = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,9}))?(Z|([+-])(\d{2}):(\d{2}))$/;
|
|
20
|
+
function validAbsoluteLogSince(value) {
|
|
21
|
+
const match = absoluteLogSince.exec(value);
|
|
22
|
+
if (!match)
|
|
23
|
+
return false;
|
|
24
|
+
const [year, month, day, hour, minute, second] = match.slice(1, 7).map(Number);
|
|
25
|
+
const calendar = new Date(`${match[1]}-${match[2]}-${match[3]}T${match[4]}:${match[5]}:${match[6]}Z`);
|
|
26
|
+
if (Number.isNaN(calendar.valueOf()) || calendar.getUTCFullYear() !== year || calendar.getUTCMonth() + 1 !== month
|
|
27
|
+
|| calendar.getUTCDate() !== day || calendar.getUTCHours() !== hour || calendar.getUTCMinutes() !== minute
|
|
28
|
+
|| calendar.getUTCSeconds() !== second)
|
|
29
|
+
return false;
|
|
30
|
+
const offsetHour = match[8] === 'Z' ? 0 : Number(match[10]);
|
|
31
|
+
const offsetMinute = match[8] === 'Z' ? 0 : Number(match[11]);
|
|
32
|
+
return offsetHour <= 14 && offsetMinute <= 59 && (offsetHour !== 14 || offsetMinute === 0)
|
|
33
|
+
&& Number.isFinite(Date.parse(value));
|
|
34
|
+
}
|
|
35
|
+
function validPublicLogOptions(service, since, tail) {
|
|
36
|
+
return logService.test(service) && since.length <= 64
|
|
37
|
+
&& (relativeLogSince.test(since) || validAbsoluteLogSince(since))
|
|
38
|
+
&& Number.isInteger(tail) && tail >= 1 && tail <= 10_000;
|
|
39
|
+
}
|
|
40
|
+
function logsCancelled(json) {
|
|
41
|
+
return {
|
|
42
|
+
kind: 'cancelled', status: 130, diagnostics: [],
|
|
43
|
+
result: { json, records: [], truncated: false },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function logsTruncated(service, shown, step) {
|
|
47
|
+
return [{
|
|
48
|
+
severity: 'warning',
|
|
49
|
+
code: 'LOGS_TRUNCATED',
|
|
50
|
+
message: `the logs of service ${service} exceeded the output limit of ${step.stdoutLimitBytes} bytes of stdout and ${step.stderrLimitBytes} of stderr, so only the newest ${shown} record${shown === 1 ? '' : 's'} are shown and older records in the requested range are not`,
|
|
51
|
+
target: 'logs',
|
|
52
|
+
fix: 'lower --tail to the number of recent records you need, or read the older records from the container runtime directly',
|
|
53
|
+
}];
|
|
54
|
+
}
|
|
55
|
+
export async function runLogs(input, adapters) {
|
|
56
|
+
let captured;
|
|
57
|
+
let signal;
|
|
58
|
+
let observe;
|
|
59
|
+
let execute;
|
|
60
|
+
try {
|
|
61
|
+
captured = ownDataValues(input, ['configPath', 'service', 'since', 'tail', 'follow', 'json']);
|
|
62
|
+
signal = adapters.signal;
|
|
63
|
+
observe = adapters.observe;
|
|
64
|
+
execute = adapters.execute;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return logsRefusal(ENVIRONMENT_CODES.EVIDENCE_UNAVAILABLE, `log request must be readable: ${errorCause(error)}`);
|
|
68
|
+
}
|
|
69
|
+
const configPath = captured?.configPath;
|
|
70
|
+
const service = captured?.service;
|
|
71
|
+
const since = captured?.since;
|
|
72
|
+
const tail = captured?.tail;
|
|
73
|
+
const follow = captured?.follow;
|
|
74
|
+
const json = captured?.json;
|
|
75
|
+
if (typeof configPath !== 'string' || typeof service !== 'string' || typeof since !== 'string'
|
|
76
|
+
|| typeof tail !== 'number' || typeof follow !== 'boolean' || typeof json !== 'boolean'
|
|
77
|
+
|| typeof observe !== 'function' || typeof execute !== 'function') {
|
|
78
|
+
return logsRefusal(ENVIRONMENT_CODES.EVIDENCE_UNAVAILABLE, 'log request must contain exact public options');
|
|
79
|
+
}
|
|
80
|
+
if (!validPublicLogOptions(service, since, tail)) {
|
|
81
|
+
return logsRefusal(ENVIRONMENT_CODES.EVIDENCE_UNAVAILABLE, 'log service, time range, and tail must be valid and bounded');
|
|
82
|
+
}
|
|
83
|
+
if (follow && signal === undefined) {
|
|
84
|
+
return logsRefusal(ENVIRONMENT_CODES.EVIDENCE_UNAVAILABLE, 'follow logs require a cancellation signal');
|
|
85
|
+
}
|
|
86
|
+
if (signal?.aborted)
|
|
87
|
+
return logsCancelled(json);
|
|
88
|
+
let observation;
|
|
89
|
+
try {
|
|
90
|
+
observation = await observe({ configPath, service });
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (signal?.aborted)
|
|
94
|
+
return logsCancelled(json);
|
|
95
|
+
if (error instanceof DeclarationRefusalError)
|
|
96
|
+
return { kind: 'refusal', status: 2, result: null,
|
|
97
|
+
diagnostics: [error.diagnostic] };
|
|
98
|
+
return logsRefusal(ENVIRONMENT_CODES.EVIDENCE_UNAVAILABLE, `log observation is unavailable for service ${service}: ${errorCause(error)}`);
|
|
99
|
+
}
|
|
100
|
+
if (signal?.aborted)
|
|
101
|
+
return logsCancelled(json);
|
|
102
|
+
const observed = ownDataValues(observation, ['request'], ['restart', 'ownComposeAuthority']);
|
|
103
|
+
const request = ownDataValues(observed?.request, logRequestBaseKeys, ['restartBatches']);
|
|
104
|
+
if (!request || request.service !== service) {
|
|
105
|
+
return logsRefusal(ENVIRONMENT_CODES.EVIDENCE_UNAVAILABLE, `log observation does not match service ${service}`);
|
|
106
|
+
}
|
|
107
|
+
const resolvedRequest = { ...request, since, tail, follow };
|
|
108
|
+
const plan = planLogs(resolvedRequest, observed?.ownComposeAuthority);
|
|
109
|
+
if (plan.kind !== 'planned')
|
|
110
|
+
return logsRefusal(plan.code, plan.reason);
|
|
111
|
+
let collected;
|
|
112
|
+
try {
|
|
113
|
+
collected = await collectLogs(plan, execute, signal, observed?.restart);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return logsRefusal(ENVIRONMENT_CODES.EVIDENCE_UNAVAILABLE, `log collection failed for service ${service}: ${errorCause(error)}`);
|
|
117
|
+
}
|
|
118
|
+
if (collected.kind === 'unavailable') {
|
|
119
|
+
return logsRefusal(collected.code, `the logs of service ${service} are unavailable: ${collected.reason}`);
|
|
120
|
+
}
|
|
121
|
+
const diagnostics = collected.truncated
|
|
122
|
+
? logsTruncated(service, collected.records.length, plan.step) : [];
|
|
123
|
+
const result = { json, records: collected.records, truncated: collected.truncated };
|
|
124
|
+
if (collected.kind === 'cancelled')
|
|
125
|
+
return { kind: 'cancelled', status: 130, diagnostics, result };
|
|
126
|
+
return { kind: 'complete', status: 0, diagnostics, result };
|
|
127
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { ExecutePlanOutcome } from '../../environment-exec/execute.js';
|
|
2
|
+
import { type CheckoutId, type ConfigSourceSnapshot, type EnvironmentCommandOutcome, type ExecutionPlan, type EnvironmentDiagnostic, type HolderId, type SetupExecutionEvidence, type SetupRefusalEvidence, type SourceProvenance, type StackId } from '../contract.js';
|
|
3
|
+
import { type SetupObservation, type SetupResult } from '../setup.js';
|
|
4
|
+
import type { InstructionPointerResult } from '../instruction-pointer.js';
|
|
5
|
+
import type { SiblingInstructionFilesResult } from '../sibling-instructions.js';
|
|
6
|
+
import { type ResolvedExecutable } from '../executable.js';
|
|
7
|
+
import type { InstallPolicy, Sibling } from '../../schema.js';
|
|
8
|
+
import { type StateNamespace } from '../state.js';
|
|
9
|
+
import type { LifecycleHistoryTransition } from '../lifecycle-stage.js';
|
|
10
|
+
import type { EnvironmentSeedPlan, EnvironmentSeedResult } from '../templates.js';
|
|
11
|
+
import type { InstallPolicyLockfileObservation, InstallPolicyProjection } from '../install-policy-observation.js';
|
|
12
|
+
import type { InstallPolicyResolution, ResolvedInstallPolicyBinding } from '../install-policy.js';
|
|
13
|
+
import { type EnvironmentIgnoreRefusal, type ConsumedSetupCheckoutObservation, type SetupCheckoutProjection } from '../setup-observation.js';
|
|
14
|
+
import type { LoadedConfigProjection } from '../../config/load.js';
|
|
15
|
+
export interface SetupCommandInput {
|
|
16
|
+
configPath: string;
|
|
17
|
+
writeInstructionPointers?: boolean;
|
|
18
|
+
writeInstructionFiles?: boolean;
|
|
19
|
+
env?: Readonly<Record<string, string | undefined>>;
|
|
20
|
+
gitExecutable?: ResolvedExecutable;
|
|
21
|
+
}
|
|
22
|
+
export interface SetupCommandResult {
|
|
23
|
+
source: SourceProvenance;
|
|
24
|
+
siblings: readonly SetupResult[];
|
|
25
|
+
environmentFiles?: readonly Extract<EnvironmentSeedResult, {
|
|
26
|
+
kind: 'created' | 'unchanged';
|
|
27
|
+
}>[];
|
|
28
|
+
installPolicies?: readonly ResolvedInstallPolicyBinding[];
|
|
29
|
+
}
|
|
30
|
+
export interface SetupRunContext {
|
|
31
|
+
readonly source: SourceProvenance;
|
|
32
|
+
readonly mainCheckoutPath: string;
|
|
33
|
+
readonly siblingsRoot: string;
|
|
34
|
+
readonly siblings: readonly Sibling[];
|
|
35
|
+
readonly policyCatalog: readonly InstallPolicy[];
|
|
36
|
+
readonly env: Readonly<Record<string, string>>;
|
|
37
|
+
readonly gitExecutable: ResolvedExecutable;
|
|
38
|
+
readonly namespace: StateNamespace;
|
|
39
|
+
readonly stackId: StackId;
|
|
40
|
+
readonly holderId: HolderId;
|
|
41
|
+
readonly writeInstructionPointers: boolean;
|
|
42
|
+
readonly writeInstructionFiles: boolean;
|
|
43
|
+
}
|
|
44
|
+
export interface SetupRunContextInput {
|
|
45
|
+
readonly checkout: SetupCheckoutProjection;
|
|
46
|
+
readonly configuration: LoadedConfigProjection;
|
|
47
|
+
readonly env: Readonly<Record<string, string>>;
|
|
48
|
+
readonly gitExecutable: ResolvedExecutable;
|
|
49
|
+
readonly namespace: StateNamespace;
|
|
50
|
+
readonly observedAt: string;
|
|
51
|
+
readonly currentCheckoutPath: string;
|
|
52
|
+
readonly mainCheckoutPath: string;
|
|
53
|
+
readonly cockpitId: ConsumedSetupCheckoutObservation['cockpitId'];
|
|
54
|
+
readonly checkoutId: CheckoutId;
|
|
55
|
+
readonly stackId: StackId;
|
|
56
|
+
readonly holderId: HolderId;
|
|
57
|
+
readonly sessionId: string;
|
|
58
|
+
readonly writeInstructionPointers?: boolean;
|
|
59
|
+
readonly writeInstructionFiles?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export declare function issueSetupRunContext(input: SetupRunContextInput): EnvironmentCommandOutcome<SetupRunContext>;
|
|
62
|
+
interface SiblingOperationInput {
|
|
63
|
+
readonly context: SetupRunContext;
|
|
64
|
+
readonly siblingIndex: number;
|
|
65
|
+
readonly sibling: Sibling;
|
|
66
|
+
}
|
|
67
|
+
interface TimedSiblingOperationInput extends SiblingOperationInput {
|
|
68
|
+
readonly observedAt: string;
|
|
69
|
+
}
|
|
70
|
+
export interface SetupCommandAdapters {
|
|
71
|
+
load(input: SetupCommandInput): Promise<EnvironmentCommandOutcome<SetupRunContext>>;
|
|
72
|
+
observedAt(): string;
|
|
73
|
+
observeGit(input: SiblingOperationInput): Promise<SetupObservation>;
|
|
74
|
+
planGit(input: SiblingOperationInput & {
|
|
75
|
+
readonly observation: SetupObservation;
|
|
76
|
+
}): Promise<EnvironmentCommandOutcome<SetupResult>>;
|
|
77
|
+
syncInstructionPointer?(input: Readonly<{
|
|
78
|
+
cockpitRoot: string;
|
|
79
|
+
siblingRoot: string;
|
|
80
|
+
write: boolean;
|
|
81
|
+
}>): Promise<InstructionPointerResult>;
|
|
82
|
+
syncInstructionFiles(input: Readonly<{
|
|
83
|
+
siblingRoot: string;
|
|
84
|
+
write: boolean;
|
|
85
|
+
}>): Promise<SiblingInstructionFilesResult>;
|
|
86
|
+
execute(plan: ExecutionPlan): Promise<ExecutePlanOutcome>;
|
|
87
|
+
observeSource(path: string): Promise<ConfigSourceSnapshot>;
|
|
88
|
+
recordStarted(input: Pick<SetupRunContext, 'namespace' | 'stackId' | 'holderId'> & {
|
|
89
|
+
readonly observedAt: string;
|
|
90
|
+
}): Promise<LifecycleHistoryTransition>;
|
|
91
|
+
withIgnore<T>(input: TimedSiblingOperationInput & {
|
|
92
|
+
readonly environmentFileIndex: number;
|
|
93
|
+
readonly environmentFile: NonNullable<Sibling['environment_files']>[number];
|
|
94
|
+
}, use: () => T extends PromiseLike<unknown> ? never : T): Promise<(T extends PromiseLike<unknown> ? never : T) | EnvironmentIgnoreRefusal | undefined>;
|
|
95
|
+
planSeed(input: SiblingOperationInput & {
|
|
96
|
+
readonly environmentFileIndex: number;
|
|
97
|
+
readonly environmentFile: NonNullable<Sibling['environment_files']>[number];
|
|
98
|
+
}): Promise<EnvironmentSeedPlan>;
|
|
99
|
+
seed(plan: EnvironmentSeedPlan): EnvironmentSeedResult;
|
|
100
|
+
observePolicy(input: TimedSiblingOperationInput & {
|
|
101
|
+
readonly checkoutRoot: string;
|
|
102
|
+
readonly checkoutId: CheckoutId;
|
|
103
|
+
}): Promise<InstallPolicyLockfileObservation>;
|
|
104
|
+
withPolicy<T>(observation: InstallPolicyLockfileObservation, input: TimedSiblingOperationInput & {
|
|
105
|
+
readonly checkoutRoot: string;
|
|
106
|
+
readonly checkoutId: CheckoutId;
|
|
107
|
+
}, use: (projection: InstallPolicyProjection) => T extends PromiseLike<unknown> ? never : T): Promise<(T extends PromiseLike<unknown> ? never : T) | undefined>;
|
|
108
|
+
resolvePolicy(input: SiblingOperationInput & {
|
|
109
|
+
readonly checkoutRoot: string;
|
|
110
|
+
readonly checkoutId: CheckoutId;
|
|
111
|
+
readonly projection?: InstallPolicyProjection;
|
|
112
|
+
}): InstallPolicyResolution;
|
|
113
|
+
}
|
|
114
|
+
export interface SetupApplicationResult extends SetupCommandResult {
|
|
115
|
+
execution?: SetupExecutionEvidence;
|
|
116
|
+
}
|
|
117
|
+
export type SetupApplicationOutcome = Exclude<EnvironmentCommandOutcome<SetupApplicationResult>, {
|
|
118
|
+
kind: 'refusal';
|
|
119
|
+
}> | {
|
|
120
|
+
kind: 'refusal';
|
|
121
|
+
status: 2;
|
|
122
|
+
diagnostics: readonly EnvironmentDiagnostic[];
|
|
123
|
+
result: null;
|
|
124
|
+
evidence?: SetupRefusalEvidence;
|
|
125
|
+
plan?: never;
|
|
126
|
+
};
|
|
127
|
+
export declare function setupEnvironment(input?: Readonly<Record<string, string | undefined>>): Readonly<Record<string, string>> | undefined;
|
|
128
|
+
export declare function runSetup(input: SetupCommandInput, adapters: SetupCommandAdapters): Promise<SetupApplicationOutcome>;
|
|
129
|
+
export {};
|