@jterrats/open-orchestra 1.0.17 → 1.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 +44 -0
- package/CLAUDE.md +1 -0
- package/dist/active-runtime-store.d.ts +18 -0
- package/dist/active-runtime-store.js +75 -0
- package/dist/active-runtime-store.js.map +1 -0
- package/dist/chat-api-errors.d.ts +7 -0
- package/dist/chat-api-errors.js +15 -0
- package/dist/chat-api-errors.js.map +1 -0
- package/dist/chat-api-message-persistence.d.ts +12 -0
- package/dist/chat-api-message-persistence.js +125 -0
- package/dist/chat-api-message-persistence.js.map +1 -0
- package/dist/chat-api-records.d.ts +35 -0
- package/dist/chat-api-records.js +94 -0
- package/dist/chat-api-records.js.map +1 -0
- package/dist/chat-api-service.d.ts +32 -0
- package/dist/chat-api-service.js +120 -0
- package/dist/chat-api-service.js.map +1 -0
- package/dist/chat-api-storage.d.ts +1 -0
- package/dist/chat-api-storage.js +14 -0
- package/dist/chat-api-storage.js.map +1 -0
- package/dist/chat-api-types.d.ts +81 -0
- package/dist/chat-api-types.js +2 -0
- package/dist/chat-api-types.js.map +1 -0
- package/dist/chat-compliance-service.d.ts +60 -0
- package/dist/chat-compliance-service.js +241 -0
- package/dist/chat-compliance-service.js.map +1 -0
- package/dist/chat-event-stream.d.ts +13 -0
- package/dist/chat-event-stream.js +124 -0
- package/dist/chat-event-stream.js.map +1 -0
- package/dist/chat-pagination.d.ts +6 -0
- package/dist/chat-pagination.js +64 -0
- package/dist/chat-pagination.js.map +1 -0
- package/dist/chat-storage-actor-validation.d.ts +4 -0
- package/dist/chat-storage-actor-validation.js +65 -0
- package/dist/chat-storage-actor-validation.js.map +1 -0
- package/dist/chat-storage-content-policy.d.ts +6 -0
- package/dist/chat-storage-content-policy.js +84 -0
- package/dist/chat-storage-content-policy.js.map +1 -0
- package/dist/chat-storage-errors.d.ts +20 -0
- package/dist/chat-storage-errors.js +17 -0
- package/dist/chat-storage-errors.js.map +1 -0
- package/dist/chat-storage-local-files.d.ts +17 -0
- package/dist/chat-storage-local-files.js +78 -0
- package/dist/chat-storage-local-files.js.map +1 -0
- package/dist/chat-storage-local-paths.d.ts +6 -0
- package/dist/chat-storage-local-paths.js +124 -0
- package/dist/chat-storage-local-paths.js.map +1 -0
- package/dist/chat-storage-local-projection.d.ts +10 -0
- package/dist/chat-storage-local-projection.js +55 -0
- package/dist/chat-storage-local-projection.js.map +1 -0
- package/dist/chat-storage-local-records.d.ts +13 -0
- package/dist/chat-storage-local-records.js +56 -0
- package/dist/chat-storage-local-records.js.map +1 -0
- package/dist/chat-storage-local.d.ts +6 -0
- package/dist/chat-storage-local.js +114 -0
- package/dist/chat-storage-local.js.map +1 -0
- package/dist/chat-storage-validation.d.ts +10 -0
- package/dist/chat-storage-validation.js +100 -0
- package/dist/chat-storage-validation.js.map +1 -0
- package/dist/chat-storage.d.ts +16 -0
- package/dist/chat-storage.js +4 -0
- package/dist/chat-storage.js.map +1 -0
- package/dist/chat-workflow-timeline.d.ts +17 -0
- package/dist/chat-workflow-timeline.js +210 -0
- package/dist/chat-workflow-timeline.js.map +1 -0
- package/dist/{workspace-claude-settings.d.ts → claude-settings.d.ts} +22 -3
- package/dist/{workspace-claude-settings.js → claude-settings.js} +28 -9
- package/dist/claude-settings.js.map +1 -0
- package/dist/command-init.d.ts +2 -0
- package/dist/command-init.js +150 -0
- package/dist/command-init.js.map +1 -0
- package/dist/command-manifest.js +1 -1
- package/dist/command-manifest.js.map +1 -1
- package/dist/commands.d.ts +1 -1
- package/dist/commands.js +1 -140
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/context-runtime-preprocessor.d.ts +41 -0
- package/dist/context-runtime-preprocessor.js +199 -0
- package/dist/context-runtime-preprocessor.js.map +1 -0
- package/dist/cursor-settings.d.ts +25 -0
- package/dist/cursor-settings.js +72 -0
- package/dist/cursor-settings.js.map +1 -0
- package/dist/health-commands.js +43 -3
- package/dist/health-commands.js.map +1 -1
- package/dist/model-aliases.d.ts +5 -0
- package/dist/model-aliases.js +37 -0
- package/dist/model-aliases.js.map +1 -0
- package/dist/ollama-provider.js +25 -0
- package/dist/ollama-provider.js.map +1 -1
- package/dist/phase-playbooks.js +11 -0
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/provider-agent-wrapper.js +14 -0
- package/dist/provider-agent-wrapper.js.map +1 -1
- package/dist/qa-e2e-artifacts.js +71 -3
- package/dist/qa-e2e-artifacts.js.map +1 -1
- package/dist/runtime-adapters.js +56 -0
- package/dist/runtime-adapters.js.map +1 -1
- package/dist/runtime-bootstrap.js +32 -22
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-child-prompt.js +8 -0
- package/dist/runtime-child-prompt.js.map +1 -1
- package/dist/runtime-context-manifest.d.ts +4 -1
- package/dist/runtime-context-manifest.js +59 -3
- package/dist/runtime-context-manifest.js.map +1 -1
- package/dist/runtime-execution-adapters.js +19 -0
- package/dist/runtime-execution-adapters.js.map +1 -1
- package/dist/runtime-execution-renderer.js +4 -0
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.js +13 -82
- package/dist/runtime-execution.js.map +1 -1
- package/dist/runtime-hooks.d.ts +46 -0
- package/dist/runtime-hooks.js +95 -0
- package/dist/runtime-hooks.js.map +1 -0
- package/dist/runtime-parent-actions.js +5 -0
- package/dist/runtime-parent-actions.js.map +1 -1
- package/dist/runtime-spawn-bridge.js +1 -0
- package/dist/runtime-spawn-bridge.js.map +1 -1
- package/dist/runtime-spawn-guidance.js +15 -61
- package/dist/runtime-spawn-guidance.js.map +1 -1
- package/dist/security/chat-guardrail-policy.d.ts +7 -0
- package/dist/security/chat-guardrail-policy.js +61 -0
- package/dist/security/chat-guardrail-policy.js.map +1 -0
- package/dist/security/chat-guardrail-types.d.ts +65 -0
- package/dist/security/chat-guardrail-types.js +2 -0
- package/dist/security/chat-guardrail-types.js.map +1 -0
- package/dist/security/chat-guardrail-validation.d.ts +9 -0
- package/dist/security/chat-guardrail-validation.js +64 -0
- package/dist/security/chat-guardrail-validation.js.map +1 -0
- package/dist/security/chat-guardrails.d.ts +3 -0
- package/dist/security/chat-guardrails.js +136 -0
- package/dist/security/chat-guardrails.js.map +1 -0
- package/dist/security/content-classifier.js +33 -1
- package/dist/security/content-classifier.js.map +1 -1
- package/dist/security/payment-card-detection.d.ts +3 -0
- package/dist/security/payment-card-detection.js +48 -0
- package/dist/security/payment-card-detection.js.map +1 -0
- package/dist/security/policy-types.d.ts +1 -1
- package/dist/security/provider-egress-policy.d.ts +27 -0
- package/dist/security/provider-egress-policy.js +72 -0
- package/dist/security/provider-egress-policy.js.map +1 -0
- package/dist/security/public-api-auth.d.ts +20 -0
- package/dist/security/public-api-auth.js +55 -0
- package/dist/security/public-api-auth.js.map +1 -0
- package/dist/security/public-api-policy.d.ts +8 -0
- package/dist/security/public-api-policy.js +40 -0
- package/dist/security/public-api-policy.js.map +1 -0
- package/dist/security/redaction.js +44 -13
- package/dist/security/redaction.js.map +1 -1
- package/dist/security/restricted-content-quarantine.d.ts +17 -0
- package/dist/security/restricted-content-quarantine.js +50 -0
- package/dist/security/restricted-content-quarantine.js.map +1 -0
- package/dist/security/restricted-data-classifier.d.ts +9 -0
- package/dist/security/restricted-data-classifier.js +358 -0
- package/dist/security/restricted-data-classifier.js.map +1 -0
- package/dist/skills-render.js +7 -14
- package/dist/skills-render.js.map +1 -1
- package/dist/telemetry-redaction.d.ts +2 -0
- package/dist/telemetry-redaction.js +25 -2
- package/dist/telemetry-redaction.js.map +1 -1
- package/dist/types/chat.d.ts +203 -0
- package/dist/types/chat.js +10 -0
- package/dist/types/chat.js.map +1 -0
- package/dist/types/model-config.d.ts +4 -0
- package/dist/types/public-api.d.ts +75 -0
- package/dist/types/public-api.js +2 -0
- package/dist/types/public-api.js.map +1 -0
- package/dist/types/restricted-data.d.ts +69 -0
- package/dist/types/restricted-data.js +8 -0
- package/dist/types/restricted-data.js.map +1 -0
- package/dist/types/restricted-fragment.d.ts +82 -0
- package/dist/types/restricted-fragment.js +14 -0
- package/dist/types/restricted-fragment.js.map +1 -0
- package/dist/types/runtime.d.ts +12 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.js.map +1 -1
- package/dist/web-api.js +24 -0
- package/dist/web-api.js.map +1 -1
- package/dist/web-artifact-parsers.d.ts +6 -0
- package/dist/web-artifact-parsers.js +266 -0
- package/dist/web-artifact-parsers.js.map +1 -0
- package/dist/web-artifact-types.d.ts +76 -0
- package/dist/web-artifact-types.js +2 -0
- package/dist/web-artifact-types.js.map +1 -0
- package/dist/web-artifacts.d.ts +2 -43
- package/dist/web-artifacts.js +106 -57
- package/dist/web-artifacts.js.map +1 -1
- package/dist/web-chat-route-inputs.d.ts +11 -0
- package/dist/web-chat-route-inputs.js +156 -0
- package/dist/web-chat-route-inputs.js.map +1 -0
- package/dist/web-chat-routes.d.ts +7 -0
- package/dist/web-chat-routes.js +213 -0
- package/dist/web-chat-routes.js.map +1 -0
- package/dist/web-console/assets/index-CJup1cIA.css +1 -0
- package/dist/web-console/assets/index-CVDOfipu.js +11 -0
- package/dist/web-console/index.html +2 -2
- package/dist/web-evidence.d.ts +1 -1
- package/dist/web-evidence.js +9 -2
- package/dist/web-evidence.js.map +1 -1
- package/dist/web-public-route-inputs.d.ts +14 -0
- package/dist/web-public-route-inputs.js +136 -0
- package/dist/web-public-route-inputs.js.map +1 -0
- package/dist/web-public-routes.d.ts +6 -0
- package/dist/web-public-routes.js +194 -0
- package/dist/web-public-routes.js.map +1 -0
- package/dist/web-public-service.d.ts +16 -0
- package/dist/web-public-service.js +154 -0
- package/dist/web-public-service.js.map +1 -0
- package/dist/workflow-services.js +5 -0
- package/dist/workflow-services.js.map +1 -1
- package/dist/workspace-runtime-bootstrap.js +15 -4
- package/dist/workspace-runtime-bootstrap.js.map +1 -1
- package/docs/chat-audit-retention.md +76 -0
- package/docs/chat-provider-provenance-ledger.md +75 -0
- package/docs/context-runtime-preprocessing.md +37 -0
- package/docs/orchestra-mvp.md +8 -2
- package/docs/public-api-contract.md +43 -0
- package/docs/release-test-matrix.md +14 -14
- package/docs/restricted-fragment-storage-contract.md +147 -0
- package/docs/runtime-adapters.md +40 -7
- package/docs/site-manifest.json +128 -30
- package/package.json +5 -2
- package/site/dist/_headers +9 -0
- package/site/dist/_redirects +2 -0
- package/site/dist/architecture.mmd +61 -0
- package/site/dist/assets/index-Bi8l6tCE.js +10 -0
- package/site/dist/assets/index-BsCLqY__.css +1 -0
- package/site/dist/favicon.svg +19 -0
- package/site/dist/index.html +28 -0
- package/site/package.json +19 -0
- package/dist/web-console/assets/index-BHs7OIv8.css +0 -1
- package/dist/web-console/assets/index-BJuVTqfQ.js +0 -11
- package/dist/workspace-claude-settings.js.map +0 -1
|
@@ -65,20 +65,20 @@ GitHub Actions secret.
|
|
|
65
65
|
|
|
66
66
|
## Required Flows
|
|
67
67
|
|
|
68
|
-
| Flow | Command
|
|
69
|
-
| ---------------------- |
|
|
70
|
-
| Source quality gate | `npm run precommit`
|
|
71
|
-
| Secret scanning gate | `npm run secret-scan`
|
|
72
|
-
| Duplicate-code gate | `npm run duplicates`
|
|
73
|
-
| Task split guard | `node --test test/task-split-assessment.test.js`
|
|
74
|
-
| Sonar quality gate | GitHub Actions: `Sonar` or local SonarQube import | conditional quality gate for duplication, bugs, code smells, maintainability, coverage readiness, and security hotspots when a Sonar provider is configured
|
|
75
|
-
| Browser E2E | `npm run test:e2e`
|
|
76
|
-
| Installed package init | `npm run test:e2e:init`
|
|
77
|
-
| Runtime manual queue | `npm run test:e2e:runtime`
|
|
78
|
-
| Public site build | `npm run site:build`
|
|
79
|
-
| Release readiness | `orchestra release check --json`
|
|
80
|
-
| Package contents | `npm
|
|
81
|
-
| Performance budgets | `npm run performance:bench -- --json`
|
|
68
|
+
| Flow | Command | Evidence |
|
|
69
|
+
| ---------------------- | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
70
|
+
| Source quality gate | `npm run precommit` | lint, typecheck, secret scan, security audit, build, unit tests, workflow validation |
|
|
71
|
+
| Secret scanning gate | `npm run secret-scan` | Gitleaks scan with `.gitleaks.toml` when the binary is installed; lightweight fallback for offline local development |
|
|
72
|
+
| Duplicate-code gate | `npm run duplicates` | jscpd duplicate-code report with generated/runtime outputs excluded and collection-standards follow-up for duplicated domain lists |
|
|
73
|
+
| Task split guard | `node --test test/task-split-assessment.test.js` | PO/BA functional oversize, Architect technical complexity, routine small-task non-blocking behavior, and markdown evidence rendering |
|
|
74
|
+
| Sonar quality gate | GitHub Actions: `Sonar` or local SonarQube import | conditional quality gate for duplication, bugs, code smells, maintainability, coverage readiness, and security hotspots when a Sonar provider is configured |
|
|
75
|
+
| Browser E2E | `npm run test:e2e` | Playwright checks map scenario acceptance criteria to visible UI state, API persistence, artifact attachment, responsive layout, and recovery behavior |
|
|
76
|
+
| Installed package init | `npm run test:e2e:init` | Installed CLI checks map scenario acceptance criteria to stdout, stderr, exit code, filesystem state, JSON contracts, evidence records, and release-readiness outcomes |
|
|
77
|
+
| Runtime manual queue | `npm run test:e2e:runtime` | Temporary-workspace runtime checks prove manual spawn requests queue under delegate pressure and expose queued artifacts through runtime sessions |
|
|
78
|
+
| Public site build | `npm run site:build` | production site build |
|
|
79
|
+
| Release readiness | `orchestra release check --json` | `releaseReadiness` and `gaReadiness` report |
|
|
80
|
+
| Package contents | `npm run package:validate` | package file list includes bin, dist, web console, site assets, docs, rules, skills, metadata, and changelog |
|
|
81
|
+
| Performance budgets | `npm run performance:bench -- --json` | CLI and web API timings on a synthetic large workspace |
|
|
82
82
|
|
|
83
83
|
## Network Policy
|
|
84
84
|
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Restricted Fragment Storage Contract
|
|
2
|
+
|
|
3
|
+
`GH-510-RESTRICTED-FRAGMENT-STORAGE` defines the future storage envelope for
|
|
4
|
+
retained restricted fragments. This contract does not enable retention by
|
|
5
|
+
default and does not add a vault, KMS, or retrieval product surface.
|
|
6
|
+
|
|
7
|
+
## Scope
|
|
8
|
+
|
|
9
|
+
Restricted fragment storage is exceptional. It is allowed only when a future
|
|
10
|
+
structured workflow has an approved product need, tenant policy, retention
|
|
11
|
+
class, and security review. Ordinary chat persistence remains redacted-only.
|
|
12
|
+
|
|
13
|
+
The following values must not be retained raw in transcripts, logs, exports,
|
|
14
|
+
evidence, markdown handoffs, telemetry, or provider requests:
|
|
15
|
+
|
|
16
|
+
- credentials, passwords, API keys, tokens, secrets, and signing material
|
|
17
|
+
- payment card data, CVV, track data, and payment account identifiers
|
|
18
|
+
- regulated or sensitive PII unless a future structured policy explicitly
|
|
19
|
+
authorizes encrypted retention
|
|
20
|
+
|
|
21
|
+
## Storage Boundary
|
|
22
|
+
|
|
23
|
+
Restricted fragments must be stored outside `.agent-workflow/chat/v1` transcript
|
|
24
|
+
JSONL and outside ordinary chat message tables. Chat records may keep only a
|
|
25
|
+
redacted shadow and a restricted-fragment reference.
|
|
26
|
+
|
|
27
|
+
The redacted shadow is the only transcript-safe representation:
|
|
28
|
+
|
|
29
|
+
- fragment id
|
|
30
|
+
- tenant id, workspace id, and source message id
|
|
31
|
+
- classification category and policy id
|
|
32
|
+
- redaction marker and short sanitized summary
|
|
33
|
+
- optional digest of canonical plaintext for dedupe or audit correlation
|
|
34
|
+
- lifecycle status, created timestamp, expiry timestamp, and legal-hold flag
|
|
35
|
+
|
|
36
|
+
The shadow must not contain raw plaintext, ciphertext, encrypted data keys,
|
|
37
|
+
KMS key ids that reveal tenant topology, provider payloads, or debug samples.
|
|
38
|
+
|
|
39
|
+
## Envelope Encryption
|
|
40
|
+
|
|
41
|
+
Each retained fragment uses envelope encryption:
|
|
42
|
+
|
|
43
|
+
1. A tenant root key is managed by an external KMS or vault.
|
|
44
|
+
2. A workspace key-encryption context is derived from tenant id, workspace id,
|
|
45
|
+
retention class, and policy id.
|
|
46
|
+
3. A fresh per-fragment data encryption key encrypts the fragment with
|
|
47
|
+
`AES-256-GCM` or a reviewed equivalent AEAD.
|
|
48
|
+
4. The per-fragment data key is wrapped by the workspace key context.
|
|
49
|
+
5. The ciphertext object stores only ciphertext metadata and the wrapped key
|
|
50
|
+
reference needed for an authorized decrypt operation.
|
|
51
|
+
|
|
52
|
+
The envelope metadata must include:
|
|
53
|
+
|
|
54
|
+
- envelope schema version
|
|
55
|
+
- fragment id and redacted shadow id
|
|
56
|
+
- algorithm, IV/nonce id, authentication tag id, and ciphertext digest
|
|
57
|
+
- wrapped data-key id and key version
|
|
58
|
+
- KMS provider alias and tenant/workspace key scope
|
|
59
|
+
- classification category, retention class, policy id, and purpose
|
|
60
|
+
- creation timestamp, expiry timestamp, and legal-hold flag
|
|
61
|
+
|
|
62
|
+
The envelope metadata must not include raw plaintext, derived plaintext samples,
|
|
63
|
+
complete provider prompts, route request bodies, or user-supplied secret names.
|
|
64
|
+
|
|
65
|
+
## Audit Contract
|
|
66
|
+
|
|
67
|
+
The append-only audit trail must record sanitized lifecycle events:
|
|
68
|
+
|
|
69
|
+
- `restricted_fragment_detected`
|
|
70
|
+
- `restricted_fragment_shadow_recorded`
|
|
71
|
+
- `restricted_fragment_encrypted`
|
|
72
|
+
- `restricted_fragment_decrypt_denied`
|
|
73
|
+
- `restricted_fragment_restore_attempted`
|
|
74
|
+
- `restricted_fragment_ciphertext_deleted`
|
|
75
|
+
- `restricted_fragment_key_destroyed`
|
|
76
|
+
- `restricted_fragment_crypto_shredded`
|
|
77
|
+
- `restricted_fragment_backup_expiry_pending`
|
|
78
|
+
|
|
79
|
+
Audit entries include tenant id, workspace id, fragment id, policy id, actor id,
|
|
80
|
+
decision id, category, timestamps, and counts. They never include plaintext,
|
|
81
|
+
ciphertext, wrapped key material, provider payloads, or request bodies.
|
|
82
|
+
|
|
83
|
+
## Crypto-Shred
|
|
84
|
+
|
|
85
|
+
Deleting a retained fragment requires both storage deletion and key destruction:
|
|
86
|
+
|
|
87
|
+
1. mark the redacted shadow as deletion requested;
|
|
88
|
+
2. hard-delete the ciphertext object and index entry;
|
|
89
|
+
3. destroy or disable the fragment data-key binding so decrypt is impossible;
|
|
90
|
+
4. record the KMS/vault destruction receipt or local equivalent;
|
|
91
|
+
5. record backup expiry status because immutable backups may age out later;
|
|
92
|
+
6. record a final `crypto_shredded` audit event.
|
|
93
|
+
|
|
94
|
+
If raw restricted data was blocked and never persisted, delete reports
|
|
95
|
+
`raw_not_persisted` instead of claiming a ciphertext deletion occurred.
|
|
96
|
+
|
|
97
|
+
Crypto-shred is complete only when the active ciphertext object is gone and the
|
|
98
|
+
key binding can no longer unwrap the fragment data key. Backups may still retain
|
|
99
|
+
already-encrypted bytes until their retention windows expire, but those bytes
|
|
100
|
+
must remain unrecoverable once key destruction is complete.
|
|
101
|
+
|
|
102
|
+
## Restore Constraints
|
|
103
|
+
|
|
104
|
+
Restore is denied by default. A future restore operation must require:
|
|
105
|
+
|
|
106
|
+
- tenant and workspace authorization
|
|
107
|
+
- policy allowing restore for the exact category and retention class
|
|
108
|
+
- legal basis or break-glass reason
|
|
109
|
+
- active key material that has not been crypto-shredded
|
|
110
|
+
- append-only audit before and after the attempt
|
|
111
|
+
|
|
112
|
+
Restore must fail closed when the fragment is expired, the key is destroyed, the
|
|
113
|
+
legal hold conflicts with the request, the actor lacks authorization, or the
|
|
114
|
+
policy does not allow raw recovery. Restored plaintext must be streamed only to
|
|
115
|
+
the authorized consumer and must not be written back into transcripts, evidence,
|
|
116
|
+
logs, exports, or provider prompts.
|
|
117
|
+
|
|
118
|
+
## Export And Compliance
|
|
119
|
+
|
|
120
|
+
Default chat export remains redacted-only. Export may include redacted shadows
|
|
121
|
+
and audit summaries, but it must not include ciphertext blobs, wrapped keys,
|
|
122
|
+
plaintext, KMS key material, or restoration receipts that expose internals.
|
|
123
|
+
Telemetry, evidence compaction, support bundles, and Markdown reporting follow
|
|
124
|
+
the same rule: only sanitized category, count, marker, decision, and lifecycle
|
|
125
|
+
status data may leave the restricted-fragment boundary.
|
|
126
|
+
|
|
127
|
+
Logical chat tombstones do not satisfy crypto-shred for retained fragments.
|
|
128
|
+
Compliance delete must distinguish:
|
|
129
|
+
|
|
130
|
+
- transcript tombstone only
|
|
131
|
+
- `raw_not_persisted`
|
|
132
|
+
- ciphertext hard delete
|
|
133
|
+
- key destroyed
|
|
134
|
+
- crypto-shred complete
|
|
135
|
+
- backup expiry pending
|
|
136
|
+
|
|
137
|
+
## Implementation Slices
|
|
138
|
+
|
|
139
|
+
1. Add storage-agnostic domain types and validation for restricted fragment
|
|
140
|
+
shadows, envelopes, audit events, and delete results.
|
|
141
|
+
2. Teach chat compliance exports to include redacted shadow summaries while
|
|
142
|
+
excluding ciphertext and wrapped-key metadata.
|
|
143
|
+
3. Add a storage adapter interface for encrypted fragment object stores.
|
|
144
|
+
4. Add a KMS/vault adapter interface for wrap, unwrap, disable, and destroy.
|
|
145
|
+
5. Add delete orchestration that hard-deletes ciphertext before recording key
|
|
146
|
+
destruction and crypto-shred audit events.
|
|
147
|
+
6. Add restore denial tests before any restore implementation exists.
|
package/docs/runtime-adapters.md
CHANGED
|
@@ -75,6 +75,20 @@ OpenAI/Codex provider models are provider-backed execution. `codex-cli` is a
|
|
|
75
75
|
runtime-native parent session and never becomes a provider API fallback unless a
|
|
76
76
|
future explicit hybrid policy records that decision as evidence.
|
|
77
77
|
|
|
78
|
+
Before the wrapper creates a provider adapter or sends a request, it evaluates
|
|
79
|
+
provider egress through the security policy boundary. Messages are classified
|
|
80
|
+
through the shared classifier/redaction contract and treated as a `provider`
|
|
81
|
+
sink. Restricted or unsafe-unredacted content is blocked before any provider
|
|
82
|
+
call; only sanitized policy metadata may be recorded as evidence. Provider
|
|
83
|
+
failure messages are sanitized before surfacing so backend base URLs,
|
|
84
|
+
authorization headers, API keys, and token-shaped values are not exposed.
|
|
85
|
+
|
|
86
|
+
Internal providers such as `ollama` are private-only. `OLLAMA_BASE_URL` must be
|
|
87
|
+
server-configured and point at `localhost`, loopback, link-local, or RFC1918
|
|
88
|
+
private-network IP addresses. Public DNS names and public IPs are rejected by
|
|
89
|
+
policy. Use loopback for local development, or a private address reachable only
|
|
90
|
+
inside the trusted deployment network.
|
|
91
|
+
|
|
78
92
|
## Init Modes
|
|
79
93
|
|
|
80
94
|
Default project init keeps the current compact bootstrap behavior:
|
|
@@ -487,13 +501,26 @@ agent path and records that choice in phase provenance.
|
|
|
487
501
|
|
|
488
502
|
When no task or role executor is configured and the default executor is
|
|
489
503
|
`generic-runtime`, `auto` and strict `subagents` mode infer the active runtime
|
|
490
|
-
from
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
504
|
+
from `.agent-workflow/active-runtime.json`, then from `OPEN_ORCHESTRA_ACTIVE_RUNTIME`
|
|
505
|
+
as a final fallback for non-hook environments (CI, scripts).
|
|
506
|
+
|
|
507
|
+
`.agent-workflow/active-runtime.json` is the truthful signal of which AI runtime
|
|
508
|
+
is currently driving the conversation. It is written by the active runtime's
|
|
509
|
+
UserPromptSubmit hook on every session start. `orchestra init --target claude`
|
|
510
|
+
configures Claude's `.claude/settings.json` hook to call
|
|
511
|
+
`orchestra health --runtime claude-cli --json`; `--target cursor` configures the
|
|
512
|
+
equivalent in `.cursor/rules/orchestra-health.mdc`. Manual-setup guidance for
|
|
513
|
+
Codex/VS Code/Windsurf documents the same `orchestra health --runtime <id>`
|
|
514
|
+
pattern that must run at session start. Each hook overwrites the file with its
|
|
515
|
+
own runtime id, so "last writer wins" matches "current parent runtime".
|
|
516
|
+
|
|
517
|
+
The persisted record has a 24h TTL. Records older than that are ignored and
|
|
518
|
+
inference falls through to the next signal. Codex maps to `codex-cli`, Claude
|
|
519
|
+
maps to `claude-cli`, Cursor maps to `cursor-cli`, Windsurf maps to
|
|
520
|
+
`windsurf-agent`, and VS Code maps to `vscode-agent`.
|
|
521
|
+
|
|
522
|
+
Explicit selections always take precedence in this order: `--runtime` flag,
|
|
523
|
+
task override, role override, then `runtimePolicy.defaults.executor`. Automatic
|
|
497
524
|
inference never rewrites `.agent-workflow/config.json`; it only affects the
|
|
498
525
|
current planning decision. Set `workflow.phaseExecutionMode` to `single-agent`
|
|
499
526
|
or configure `runtimePolicy.defaults.executor` to override inference for
|
|
@@ -501,6 +528,12 @@ deterministic local or CI runs. If `OPEN_ORCHESTRA_ACTIVE_RUNTIME` names an
|
|
|
501
528
|
unknown runtime, workflow planning fails with supported values and the same
|
|
502
529
|
override options instead of requiring hidden config edits.
|
|
503
530
|
|
|
531
|
+
File-based inference (reading `target=` from `AGENTS.md`/`CLAUDE.md`/etc.) and
|
|
532
|
+
per-tool environment detection (`CLAUDECODE`, `CODEX_THREAD_ID`,
|
|
533
|
+
`CURSOR_TRACE_ID`, etc.) are intentionally **not** used: instruction files
|
|
534
|
+
describe which runtimes the project supports, not which one is active right
|
|
535
|
+
now, and per-tool env vars can coexist in nested or inherited sessions.
|
|
536
|
+
|
|
504
537
|
Subagent spawning is fully asynchronous by default. A spawn request returns the
|
|
505
538
|
`sessionId`, request artifact, prompt artifact, expected result artifact, status,
|
|
506
539
|
next lifecycle commands, and quality warnings, then the parent agent should
|
package/docs/site-manifest.json
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"repositoryUrl": "https://github.com/jterrats/open-orchestra",
|
|
3
3
|
"packageUrl": "https://www.npmjs.com/package/@jterrats/open-orchestra",
|
|
4
|
-
"nav": [
|
|
5
|
-
{ "href": "https://jterrats.dev", "label": "Main site" }
|
|
6
|
-
],
|
|
4
|
+
"nav": [{ "href": "https://jterrats.dev", "label": "Main site" }],
|
|
7
5
|
"pages": [
|
|
8
6
|
{
|
|
9
7
|
"path": "/",
|
|
@@ -54,7 +52,7 @@
|
|
|
54
52
|
},
|
|
55
53
|
"quickstart": {
|
|
56
54
|
"source": "README.md",
|
|
57
|
-
"heading": "First
|
|
55
|
+
"heading": "Individual Mode: First Value In Minutes"
|
|
58
56
|
},
|
|
59
57
|
"capabilities": {
|
|
60
58
|
"source": "README.md",
|
|
@@ -92,7 +90,7 @@
|
|
|
92
90
|
"label": "README",
|
|
93
91
|
"href": "https://github.com/jterrats/open-orchestra#quick-start",
|
|
94
92
|
"source": "README.md",
|
|
95
|
-
"heading": "First
|
|
93
|
+
"heading": "Individual Mode: First Value In Minutes"
|
|
96
94
|
},
|
|
97
95
|
{
|
|
98
96
|
"title": "Release matrix",
|
|
@@ -110,43 +108,143 @@
|
|
|
110
108
|
},
|
|
111
109
|
"docs": {
|
|
112
110
|
"links": [
|
|
113
|
-
{
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
{
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
111
|
+
{
|
|
112
|
+
"title": "Adoption guide",
|
|
113
|
+
"source": "docs/adoption-guide.md",
|
|
114
|
+
"heading": "Open Orchestra 1.0.0 Adoption Guide"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"title": "Core command surface",
|
|
118
|
+
"source": "docs/core-command-surface.md",
|
|
119
|
+
"heading": "Core Command Surface"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"title": "E2E test batteries",
|
|
123
|
+
"source": "docs/e2e-test-batteries.md",
|
|
124
|
+
"heading": "End-to-End Test Batteries"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"title": "Duplicate-code enforcement",
|
|
128
|
+
"source": "docs/duplicate-code-enforcement.md",
|
|
129
|
+
"heading": "Duplicate-Code Enforcement"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"title": "Sonar quality gates",
|
|
133
|
+
"source": "docs/sonar-quality-gates.md",
|
|
134
|
+
"heading": "Sonar Quality Gates"
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"title": "Sonar architecture model",
|
|
138
|
+
"source": "docs/sonar-architecture-model.md",
|
|
139
|
+
"heading": "Sonar Architecture Model"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"title": "Runtime adapters",
|
|
143
|
+
"source": "docs/runtime-adapters.md",
|
|
144
|
+
"heading": "Runtime Adapters"
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"title": "Context vault",
|
|
148
|
+
"source": "docs/context-vault.md",
|
|
149
|
+
"heading": "Context Vault"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"title": "Site content workflow",
|
|
153
|
+
"source": "docs/site-content-workflow.md",
|
|
154
|
+
"heading": "Public Site Content Workflow"
|
|
155
|
+
}
|
|
122
156
|
]
|
|
123
157
|
},
|
|
124
158
|
"releaseDocs": {
|
|
125
159
|
"links": [
|
|
126
|
-
{
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
{
|
|
132
|
-
|
|
160
|
+
{
|
|
161
|
+
"title": "Release test matrix",
|
|
162
|
+
"source": "docs/release-test-matrix.md",
|
|
163
|
+
"heading": "1.0.0 Release Test Matrix"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"title": "E2E test batteries",
|
|
167
|
+
"source": "docs/e2e-test-batteries.md",
|
|
168
|
+
"heading": "End-to-End Test Batteries"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"title": "Sonar quality gates",
|
|
172
|
+
"source": "docs/sonar-quality-gates.md",
|
|
173
|
+
"heading": "Sonar Quality Gates"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"title": "Sonar architecture model",
|
|
177
|
+
"source": "docs/sonar-architecture-model.md",
|
|
178
|
+
"heading": "Sonar Architecture Model"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"title": "QA evidence",
|
|
182
|
+
"source": "docs/site-content-workflow.md",
|
|
183
|
+
"heading": "QA Evidence"
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
"title": "Package naming",
|
|
187
|
+
"source": "docs/package-naming.md",
|
|
188
|
+
"heading": "Package Naming Decision"
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
"title": "Upgrade dogfooding",
|
|
192
|
+
"source": "README.md",
|
|
193
|
+
"heading": "Quick Start"
|
|
194
|
+
}
|
|
133
195
|
]
|
|
134
196
|
},
|
|
135
197
|
"console": {
|
|
136
198
|
"links": [
|
|
137
|
-
{
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
199
|
+
{
|
|
200
|
+
"title": "Web console QA",
|
|
201
|
+
"source": "docs/web-console-qa.md",
|
|
202
|
+
"heading": "Web Console QA Notes"
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"title": "Local web console",
|
|
206
|
+
"source": "docs/orchestra-mvp.md",
|
|
207
|
+
"heading": "Commands"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"title": "Workflow progress API",
|
|
211
|
+
"source": "README.md",
|
|
212
|
+
"heading": "1.0.0 Workflow Tooling"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"title": "Delivery dashboard",
|
|
216
|
+
"source": "docs/adoption-guide.md",
|
|
217
|
+
"heading": "Release Operations"
|
|
218
|
+
}
|
|
141
219
|
]
|
|
142
220
|
},
|
|
143
221
|
"reference": {
|
|
144
222
|
"links": [
|
|
145
|
-
{
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
223
|
+
{
|
|
224
|
+
"title": "Command contracts",
|
|
225
|
+
"source": "docs/command-contracts.md",
|
|
226
|
+
"heading": "Command Contracts"
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"title": "Generated artifact APIs",
|
|
230
|
+
"source": "docs/generated-artifact-api-catalog.md",
|
|
231
|
+
"heading": "Generated Artifact API Catalog"
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"title": "Runtime LLM flow",
|
|
235
|
+
"source": "docs/runtime-llm-flow.md",
|
|
236
|
+
"heading": "Runtime LLM Flow"
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"title": "Tracker adapter contract",
|
|
240
|
+
"source": "docs/tracker-adapter-contract.md",
|
|
241
|
+
"heading": "Tracker Adapter Contract"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"title": "Source of truth and learning",
|
|
245
|
+
"source": "docs/source-of-truth-and-agent-learning.md",
|
|
246
|
+
"heading": "Source of Truth and Agent Learning"
|
|
247
|
+
}
|
|
150
248
|
]
|
|
151
249
|
}
|
|
152
250
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jterrats/open-orchestra",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
"extensions/vscode-open-orchestra",
|
|
@@ -31,7 +31,9 @@
|
|
|
31
31
|
"release:matrix": "node scripts/release-test-matrix.js",
|
|
32
32
|
"performance:bench": "npm run build && node scripts/performance-benchmark.js",
|
|
33
33
|
"precommit": "npm run lint && npm run typecheck && npm run secret-scan && npm run security:audit && npm test && npm run validate:workflow",
|
|
34
|
-
"
|
|
34
|
+
"package:build": "npm run build && npm run site:build",
|
|
35
|
+
"package:validate": "node scripts/validate-package-contents.js",
|
|
36
|
+
"prepack": "npm run package:build && npm run package:validate",
|
|
35
37
|
"sonar:preflight:local": "node bin/orchestra.js sonar preflight --provider sonarqube-local --project-key jterrats_open-orchestra --host-url ${SONAR_HOST_URL:-http://localhost:9001}",
|
|
36
38
|
"sonar:scan:local": "sonar-scanner -Dsonar.host.url=${SONAR_HOST_URL:-http://localhost:9001}",
|
|
37
39
|
"hooks:install": "git config core.hooksPath .githooks",
|
|
@@ -71,6 +73,7 @@
|
|
|
71
73
|
"files": [
|
|
72
74
|
"bin/",
|
|
73
75
|
"dist/",
|
|
76
|
+
"site/dist/",
|
|
74
77
|
"rules/",
|
|
75
78
|
"docs/",
|
|
76
79
|
"skills/",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Content-Security-Policy: default-src 'self'; base-uri 'self'; connect-src 'self'; font-src 'self'; frame-ancestors 'none'; img-src 'self' data:; object-src 'none'; script-src 'self'; style-src 'self'; form-action 'self'; upgrade-insecure-requests
|
|
3
|
+
Permissions-Policy: camera=(), geolocation=(), microphone=(), payment=(), usb=()
|
|
4
|
+
Referrer-Policy: strict-origin-when-cross-origin
|
|
5
|
+
Strict-Transport-Security: max-age=15552000; includeSubDomains; preload
|
|
6
|
+
X-Content-Type-Options: nosniff
|
|
7
|
+
|
|
8
|
+
/architecture.mmd
|
|
9
|
+
Content-Type: text/plain; charset=utf-8
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
flowchart LR
|
|
2
|
+
subgraph entry["Entry surfaces"]
|
|
3
|
+
human["Human operator"]
|
|
4
|
+
runtime["Agent runtimes"]
|
|
5
|
+
ide["IDE control center"]
|
|
6
|
+
web["Local web console"]
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
subgraph contract["Runtime and CLI contract"]
|
|
10
|
+
bootstrap["Runtime bootstrap"]
|
|
11
|
+
commands["orchestra CLI"]
|
|
12
|
+
manifest["Command manifest"]
|
|
13
|
+
api["JSON contracts"]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
subgraph workflow["Workflow core"]
|
|
17
|
+
intake["Task registry"]
|
|
18
|
+
phases["PM to release phases"]
|
|
19
|
+
gates["Human review gates"]
|
|
20
|
+
skills["Skills and memory"]
|
|
21
|
+
readiness["Release readiness"]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
subgraph state["Local state and adapters"]
|
|
25
|
+
files[".agent-workflow state"]
|
|
26
|
+
providers["Model providers"]
|
|
27
|
+
trackers["Tracker adapters"]
|
|
28
|
+
evidence["Evidence packs"]
|
|
29
|
+
content["Docs manifest"]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
subgraph delivery["Delivery outputs"]
|
|
33
|
+
site["Public site"]
|
|
34
|
+
package["npm package"]
|
|
35
|
+
reports["Handoffs and reports"]
|
|
36
|
+
release["CI release tags"]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
human --> commands
|
|
40
|
+
runtime --> bootstrap
|
|
41
|
+
ide --> api
|
|
42
|
+
web --> api
|
|
43
|
+
bootstrap --> commands
|
|
44
|
+
commands --> manifest
|
|
45
|
+
api --> manifest
|
|
46
|
+
manifest --> phases
|
|
47
|
+
phases --> intake
|
|
48
|
+
phases --> gates
|
|
49
|
+
phases --> skills
|
|
50
|
+
phases --> readiness
|
|
51
|
+
intake --> files
|
|
52
|
+
gates --> evidence
|
|
53
|
+
skills --> files
|
|
54
|
+
phases --> providers
|
|
55
|
+
phases --> trackers
|
|
56
|
+
readiness --> evidence
|
|
57
|
+
content --> site
|
|
58
|
+
readiness --> site
|
|
59
|
+
readiness --> package
|
|
60
|
+
readiness --> release
|
|
61
|
+
evidence --> reports
|