Commit graph

746 commits

Author SHA1 Message Date
Mikael Hugo
932f17b93a refactor: rename workflow tool boundary 2026-05-07 03:45:41 +02:00
Mikael Hugo
4cefa6de2a feat: persist SF runtime signals 2026-05-07 03:07:51 +02:00
Mikael Hugo
a2a44f8d15 feat: implement Tier 1.1 Vault secret resolver
- Create vault-resolver.js: URI parser, auth chain (env → file → AppRole), in-memory caching
- Add resolveConfigValueAsync() to pi-coding-agent for lazy vault URI resolution
- Integrate vault credential resolution into auth-storage credential loading path
- Add doctor check (checkVaultHealth) for vault setup validation at startup
- Document vault setup, auth methods, examples, troubleshooting in preferences-reference.md
- Add comprehensive test suite (18 tests) for vault URI parsing, auth, caching, fallback

Auth Chain:
1. VAULT_TOKEN env var (simplest for local dev)
2. ~/.vault-token file (recommended for local dev)
3. VAULT_ROLE_ID + VAULT_SECRET_ID env vars (AppRole for CI/CD)

Fail-open behavior: If vault unavailable, falls back to plaintext URIs to allow continued operation.

URI Format: vault://secret/path/to/secret#fieldname
Example: ANTHROPIC_API_KEY=vault://secret/anthropic/prod#api_key

Tests: parseVaultUri, isVaultUri, resolveSecret, caching, edge cases all passing (18/18).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-07 02:39:51 +02:00
Mikael Hugo
30f8738585 test: harden uok self-evolution paths 2026-05-06 22:55:35 +02:00
Mikael Hugo
8f6dbb30ff refactor(pi-coding-agent): update widget host tests to reflect degraded-silent behavior
- Rename tests to match actual behavior: degrades_silently / degrades_to_no_op
- Remove incorrect status-bar routing assertions from setWidget tests
- Add federated-memory module with test
2026-05-06 08:23:27 +02:00
Mikael Hugo
2e67b15ff9 sf snapshot: uncommitted changes after 39m inactivity 2026-05-06 08:15:40 +02:00
Mikael Hugo
76b218762b fix: harden sf autonomous runtime 2026-05-06 06:02:46 +02:00
Mikael Hugo
fbb61026fc fix: stabilize uok ledger and steering 2026-05-06 01:47:21 +02:00
Mikael Hugo
fec9292104 fix: stabilize uok parity and startup widgets 2026-05-06 00:56:55 +02:00
Mikael Hugo
87d49abd87 fix: stabilize sf startup and state linting 2026-05-05 19:46:08 +02:00
Mikael Hugo
46db1e95ef refactor: remove legacy autonomous aliases 2026-05-05 18:47:50 +02:00
Mikael Hugo
861c4b6cf6 fix: stabilize interactive extension startup 2026-05-05 18:42:00 +02:00
Mikael Hugo
180f8e131e fix: align scaffold sync and gemini listings 2026-05-05 18:23:48 +02:00
Mikael Hugo
66e8265320 fix: align provider route selection 2026-05-05 17:37:01 +02:00
Mikael Hugo
1e8a05dc70 fix: constrain mimo proxy fallbacks 2026-05-05 17:18:56 +02:00
Mikael Hugo
c4ee341852 fix: discover xiaomi live models 2026-05-05 17:11:24 +02:00
Mikael Hugo
6fee7e60c8 fix: warm discovery backed providers 2026-05-05 17:05:44 +02:00
Mikael Hugo
c6fe3b2b79 fix: restrict visible aggregate providers 2026-05-05 16:50:05 +02:00
Mikael Hugo
aeea733cd6 fix: expose sf-scoped providers 2026-05-05 16:42:36 +02:00
Mikael Hugo
ab6cad4c84 fix: clean provider surfaces and core build 2026-05-05 16:31:53 +02:00
Mikael Hugo
4c98cb8c33 fix: make autonomous mode canonical 2026-05-05 15:42:10 +02:00
Mikael Hugo
2d9c2018af chore: clean repo quality gates 2026-05-05 14:55:11 +02:00
Mikael Hugo
00a118ea71 chore: commit current workspace state 2026-05-05 14:46:18 +02:00
Mikael Hugo
f11c877224 style: format repository with biome 2026-05-05 14:31:16 +02:00
Mikael Hugo
3af4185b20 fix: make sift the codebase indexer 2026-05-05 14:27:03 +02:00
Mikael Hugo
3ba2f8a501 fix: harden startup doctor and tool schemas 2026-05-05 14:03:36 +02:00
Mikael Hugo
d3954ff529 sf snapshot: pre-dispatch, uncommitted changes after 30m inactivity 2026-05-05 00:38:05 +02:00
Mikael Hugo
ccdd3027ab perf(read): stream lines when offset/limit provided to avoid loading entire file
When offset or limit are specified, use Node.js readline streaming instead of
loading the entire file into memory. This fixes the truncation issue for large
files (>50KB) where the read tool would return truncated content even when
requesting a small slice.

- Add readLinesStreamed() for memory-efficient line reading
- Add countLines() for total line count without full read
- Use streaming path when offset !== undefined || limit !== undefined
- Keep existing full-file read path when no offset/limit specified
- Add tests for streaming behavior with large files

Fixes the long-standing issue where reading large files like src/headless.ts
(~50KB) with offset/limit would still hit truncation limits.
2026-05-04 15:20:16 +02:00
Mikael Hugo
362d766680 sf snapshot: uncommitted changes after 120m inactivity 2026-05-04 14:46:50 +02:00
Mikael Hugo
0037f44677 sf snapshot: pre-dispatch, uncommitted changes after 83m inactivity 2026-05-04 09:47:30 +02:00
Mikael Hugo
3e8c5b192f fix(sf): add sf-dev batch server command 2026-05-02 22:44:14 +02:00
Mikael Hugo
c9609459e4 fix(daemon): --verbose actually lowers log level + reports effective level
--verbose was wired only to the stderr-mirror path. Debug entries got
filtered by Logger.level (default 'info' from config) before reaching
the mirror — so passing --verbose produced almost no extra output, which
made it look broken on a fresh start.

Now --verbose lowers the level to 'debug' AND mirrors. Logger exposes
`effectiveLevel` so the "daemon started" banner reports what the logger
is actually using, not what was in the config file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 22:41:48 +02:00
Mikael Hugo
3f213f3131 fix(sf): run sf-server from source in dev 2026-05-02 22:34:42 +02:00
Mikael Hugo
974d8e4b6d fix(sf): expose daemon as sf-server 2026-05-02 22:25:24 +02:00
Mikael Hugo
dd126ddc8b fix(sf): recover model routes and self-feedback 2026-05-02 22:07:10 +02:00
Mikael Hugo
0c7c4eca5b fix(sf): harden auto loops and skill sandbox 2026-05-02 19:46:36 +02:00
Mikael Hugo
a3ef4bdf3f fix(sf): remove workflow tool aliases 2026-05-02 18:32:50 +02:00
Mikael Hugo
56234b5131 fix(sf): canonicalize milestone id tool surface 2026-05-02 18:09:13 +02:00
Mikael Hugo
21113e18a9 fix: update remaining stale repo and scope refs to singularity-forge
After fixing forensics.md and error-classifier.ts last fire, swept the
rest of the tree for the same class of stale reference:

- scripts/validate-pack.js: criticalPackages list used \`@sf\` and
  \`@sf-build\` scopes — neither exists in node_modules; this is in CI
  (.github/workflows/ci.yml) + prepublishOnly, so the validation step
  was failing to find anything. Now \`@singularity-forge/pi-coding-agent\`
  and \`@singularity-forge/rpc-client\` (the actual scope).
- src/resources/skills/github-workflows/references/gh/SKILL.md: same
  GraphQL bug as forensics.md — owner:"sf-build" name:"sf-2" — and
  three \`gh project\` commands using owner sf-build. The gh issue
  create command above already used singularity-forge/sf-run, so the
  follow-up calls always failed. Also retitled "sf-2 Backlog" to
  "sf-run Backlog".
- src/resources/extensions/sf/bootstrap/system-context.ts: deprecation
  warning linked to https://github.com/sf-build/SF/issues/1492.
- packages/mcp-server/README.md, packages/rpc-client/README.md: 9 refs
  to \`@sf-build/...\` for installable package names — would mislead
  anyone copy-pasting into npm install.
- docs/user-docs/troubleshooting.md (+ zh-CN): GitHub Issues link
  pointed at github.com/sf-build/SF/issues.
- docs/user-docs/getting-started.md (+ zh-CN): clone URL was correct
  but the next \`cd\` was \`cd sf-2/docker\` — won't exist after a
  fresh clone of sf-run.
- docs/dev/ci-cd-pipeline.md: GHCR org was \`sf-build\`.

Code comments containing "sf-2" / "sf-build" in non-active places
(parsers.ts banner, error message URLs in tests, dev-doc absolute
paths from a contributor's Mac) left alone — they're informational
and not addressed by users or runtime.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 18:01:55 +02:00
Mikael Hugo
61485c5bef fix(sf): remove legacy completion tool aliases 2026-05-02 17:51:38 +02:00
Mikael Hugo
71ce87b981 fix(sf): await scoped dispatch messages 2026-05-02 16:57:41 +02:00
Mikael Hugo
f5290e41aa fix(sf): reload after self-feedback inline fixes 2026-05-02 16:12:23 +02:00
Mikael Hugo
644187c73e fix: resolve 10 high-severity self-feedback inline-fix issues
- gap-audit prompt detection: Add DYNAMICALLY_LOADED_PROMPTS set for prompts
  loaded through wrappers (research-slice, plan-slice, execute-task, etc.)
  and detect loadPrompt calls with comma-separated args (#sf-moobj36l-ewu7js)

- gap-audit command detection: Detect exact match, prefix match, and
  switch/case patterns for command dispatch (#sf-moobj36o-n8b7g9)

- empty task summary: Add isValidTaskSummary() to require non-empty content
  with frontmatter or H1 before reconciliation marks task complete
  (#sf-moobj36o-6rxy6e)

- journal write failures: Emit bounded health warning to .write-failures.jsonl
  on journal write failure with per-session dedup (#sf-moobj36p-ikq3b2)

- resource sync manifest divergence: Add verifyManifestFilesExist() to check
  all manifest-listed files exist on disk after hash match (#sf-moody5qi-8gbwp2)

- self-feedback markdown stale: Regenerate SELF-FEEDBACK.md from jsonl on
  markResolved with resolved entries section (#sf-moobj36p-rlo95i)

- self-feedback context bloat: Cap entries to 20 max, 4000 chars, inject
  compact summaries only with pointer to jsonl for full evidence
  (#sf-moobj36p-ko6snt)

- hook-emitter types: Replace unknown with EventResult discriminated union,
  implement emitExtensionEvent call with fallback warning when _pi missing
  (#sf-moobmhwt-bxejb6, #sf-moobmhx4-gk9g83)

- export visualizer types: Add VisualizerExportData interface with proper
  PhaseAggregate/SliceAggregate/ModelAggregate/ProjectTotals types
  replacing any (#sf-moobmhx0-ow5fhy)

- native-edit-bridge: Already resolved (artifact removed from repo)
  (#sf-moobj36q-z4id3u)
2026-05-02 16:03:52 +02:00
Mikael Hugo
7053938f7d fix(gemini): keep cli tools in pi harness 2026-05-02 13:32:05 +02:00
Mikael Hugo
98fe3b605d fix(gemini): route cli retry and quota through core 2026-05-02 13:20:10 +02:00
Mikael Hugo
3c3000c25f fix(auth): use gemini cli credentials outside sf store 2026-05-02 13:08:41 +02:00
Mikael Hugo
cb2ab66d4f feat(sf): UOK production hardening — diff capture, exit symmetry, commit-gate
Three production gaps Codex's adversarial review flagged are now closed:

1. Real legacy-vs-UOK parity diff (per turn, per plane):
   - parity-diff-capture.ts captures plan / graph / model-policy /
     audit-envelope / gitops decisions for both paths and emits
     ParityDiffEvent records to .sf/runtime/uok-parity.jsonl.
   - parity-report.ts aggregates divergencesByPlane, populates
     criticalMismatches with real divergence summaries, and tracks
     enterEvents / exitEvents / missingExitEvents for symmetry.

2. Exit-event symmetry:
   - sessionId / turnId now flow through enter+exit parity events.
   - writeParityHeartbeat lets kernel/loop-adapter emit best-effort
     diagnostics on plane failure paths so missing-exit gaps shrink.

3. Commit-gating on divergence or missing-exit:
   - resolveParitySafeGitAction (in uok/gitops.ts) reads the parity
     report and downgrades turn_action to status-only when divergence
     count > 0 or missing-exit count > 0 — UOK can no longer commit
     on top of unverified state.
   - auto-post-unit.ts now resolves a configuredTurnAction from UOK
     flags then asks the parity gate for the safe action; the gate's
     decision is what flows to the actual git op.
   - new test: tests/uok-gitops-commit-gate.test.ts.
   - existing gitops-wiring assertion updated for the renamed
     configuredTurnAction (semantic preserved).

Tests: 53/53 UOK pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 12:57:48 +02:00
Mikael Hugo
85a0188fe1 fix(sf): stabilize auto notices and package checks 2026-05-02 12:39:27 +02:00
Mikael Hugo
e0fd2076d3 test: Investigated R102 symlink dedup: canonicalizePath already exists…
SF-Task: S01/T07
2026-05-02 12:00:56 +02:00
Mikael Hugo
12538bbfa3 sf snapshot: pre-dispatch, uncommitted changes after 32m inactivity 2026-05-02 11:25:51 +02:00