@xhulz/nina 0.66.1 → 0.68.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/package.json +1 -1
- package/releases/0.67.0/core/GAPS.md +125 -0
- package/releases/0.67.0/core/answered.json +80 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/architect.md +1 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/dba.md +3 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/devops.md +1 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/qa.md +7 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/secops.md +3 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
- package/releases/0.67.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
- package/releases/0.67.0/core/tree/.claude/agents/architect.md +134 -0
- package/releases/0.67.0/core/tree/.claude/agents/dba.md +119 -0
- package/releases/0.67.0/core/tree/.claude/agents/design-reviewer.md +76 -0
- package/releases/0.67.0/core/tree/.claude/agents/devops.md +118 -0
- package/releases/0.67.0/core/tree/.claude/agents/implementer.md +178 -0
- package/releases/0.67.0/core/tree/.claude/agents/integration-tester.md +170 -0
- package/releases/0.67.0/core/tree/.claude/agents/planner.md +132 -0
- package/releases/0.67.0/core/tree/.claude/agents/qa.md +150 -0
- package/releases/0.67.0/core/tree/.claude/agents/reviewer.md +187 -0
- package/releases/0.67.0/core/tree/.claude/agents/secops.md +120 -0
- package/releases/0.67.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
- package/releases/0.67.0/core/tree/.claude/agents/solidity-dev.md +123 -0
- package/releases/0.67.0/core/tree/.claude/agents-overview.md +65 -0
- package/releases/0.67.0/core/tree/.claude/frontend.md +10 -0
- package/releases/0.67.0/core/tree/.claude/graph.md +79 -0
- package/releases/0.67.0/core/tree/.claude/patterns.md +252 -0
- package/releases/0.67.0/core/tree/.claude/pills/README.md +150 -0
- package/releases/0.67.0/core/tree/.claude/pipeline.md +101 -0
- package/releases/0.67.0/core/tree/.claude/retrieval.md +103 -0
- package/releases/0.67.0/core/tree/.claude/router.md +213 -0
- package/releases/0.67.0/core/tree/.claude/templates/integration.md +48 -0
- package/releases/0.67.0/core/tree/CLAUDE.md +166 -0
- package/releases/0.67.0/core/tree/scripts/cost-watch.mjs +25 -0
- package/releases/0.67.0/core/tree/scripts/edit-guard.mjs +24 -0
- package/releases/0.67.0/core/tree/scripts/harness-check.mjs +80 -0
- package/releases/0.67.0/core/tree/scripts/loop-gate.mjs +19 -0
- package/releases/0.67.0/core/vocabulary.json +14 -0
- package/releases/0.67.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
- package/releases/0.67.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
- package/releases/0.67.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
- package/releases/0.67.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
- package/releases/0.67.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
- package/releases/0.67.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
- package/releases/0.67.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
- package/releases/0.67.0/surfaces/blockchain/tree/.claude/router.md +6 -0
- package/releases/0.67.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
- package/releases/0.67.0/surfaces/d1/tree/.claude/agents/dba.md +15 -0
- package/releases/0.67.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
- package/releases/0.67.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.67.0/surfaces/d1/tree/.claude/patterns.md +8 -0
- package/releases/0.67.0/surfaces/d1/tree/CLAUDE.md +2 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/graph.md +8 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/patterns.md +22 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/pipeline.md +13 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/retrieval.md +5 -0
- package/releases/0.67.0/surfaces/db/tree/.claude/router.md +4 -0
- package/releases/0.67.0/surfaces/db/tree/CLAUDE.md +17 -0
- package/releases/0.67.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
- package/releases/0.67.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
- package/releases/0.67.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.67.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
- package/releases/0.67.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
- package/releases/0.67.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
- package/releases/0.67.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
- package/releases/0.67.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
- package/releases/0.67.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
- package/releases/0.67.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
- package/releases/0.67.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
- package/releases/0.67.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
- package/releases/0.67.0/surfaces/frontend/tree/.claude/router.md +14 -0
- package/releases/0.67.0/surfaces/frontend/tree/CLAUDE.md +5 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/graph.md +10 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
- package/releases/0.67.0/surfaces/integrations/tree/.claude/router.md +6 -0
- package/releases/0.67.0/surfaces/integrations/tree/CLAUDE.md +17 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/graph.md +2 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/patterns.md +49 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/pipeline.md +2 -0
- package/releases/0.67.0/surfaces/money/tree/.claude/retrieval.md +2 -0
- package/releases/0.67.0/surfaces/money/tree/CLAUDE.md +11 -0
- package/releases/0.67.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
- package/releases/0.67.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
- package/releases/0.67.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.67.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
- package/releases/0.67.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
- package/releases/0.67.0/surfaces/pii/tree/CLAUDE.md +5 -0
- package/releases/0.67.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
- package/releases/0.67.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
- package/releases/0.67.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
- package/releases/0.67.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.67.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
- package/releases/0.67.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
- package/releases/0.67.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
- package/releases/0.67.0/surfaces/prisma/tree/CLAUDE.md +5 -0
- package/releases/0.68.0/core/GAPS.md +125 -0
- package/releases/0.68.0/core/answered.json +80 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/architect.md +1 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/dba.md +3 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/devops.md +1 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/qa.md +7 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/secops.md +3 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
- package/releases/0.68.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
- package/releases/0.68.0/core/tree/.claude/agents/architect.md +134 -0
- package/releases/0.68.0/core/tree/.claude/agents/dba.md +119 -0
- package/releases/0.68.0/core/tree/.claude/agents/design-reviewer.md +76 -0
- package/releases/0.68.0/core/tree/.claude/agents/devops.md +118 -0
- package/releases/0.68.0/core/tree/.claude/agents/implementer.md +178 -0
- package/releases/0.68.0/core/tree/.claude/agents/integration-tester.md +170 -0
- package/releases/0.68.0/core/tree/.claude/agents/planner.md +132 -0
- package/releases/0.68.0/core/tree/.claude/agents/qa.md +150 -0
- package/releases/0.68.0/core/tree/.claude/agents/reviewer.md +187 -0
- package/releases/0.68.0/core/tree/.claude/agents/secops.md +120 -0
- package/releases/0.68.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
- package/releases/0.68.0/core/tree/.claude/agents/solidity-dev.md +123 -0
- package/releases/0.68.0/core/tree/.claude/agents-overview.md +65 -0
- package/releases/0.68.0/core/tree/.claude/frontend.md +10 -0
- package/releases/0.68.0/core/tree/.claude/graph.md +79 -0
- package/releases/0.68.0/core/tree/.claude/patterns.md +252 -0
- package/releases/0.68.0/core/tree/.claude/pills/README.md +150 -0
- package/releases/0.68.0/core/tree/.claude/pipeline.md +101 -0
- package/releases/0.68.0/core/tree/.claude/retrieval.md +103 -0
- package/releases/0.68.0/core/tree/.claude/router.md +218 -0
- package/releases/0.68.0/core/tree/.claude/templates/integration.md +48 -0
- package/releases/0.68.0/core/tree/CLAUDE.md +166 -0
- package/releases/0.68.0/core/tree/scripts/cost-watch.mjs +25 -0
- package/releases/0.68.0/core/tree/scripts/edit-guard.mjs +24 -0
- package/releases/0.68.0/core/tree/scripts/harness-check.mjs +81 -0
- package/releases/0.68.0/core/tree/scripts/loop-gate.mjs +19 -0
- package/releases/0.68.0/core/vocabulary.json +14 -0
- package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
- package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
- package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
- package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
- package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
- package/releases/0.68.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
- package/releases/0.68.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
- package/releases/0.68.0/surfaces/blockchain/tree/.claude/router.md +6 -0
- package/releases/0.68.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
- package/releases/0.68.0/surfaces/d1/tree/.claude/agents/dba.md +15 -0
- package/releases/0.68.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
- package/releases/0.68.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.68.0/surfaces/d1/tree/.claude/patterns.md +8 -0
- package/releases/0.68.0/surfaces/d1/tree/CLAUDE.md +2 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/graph.md +8 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/patterns.md +22 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/pipeline.md +13 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/retrieval.md +5 -0
- package/releases/0.68.0/surfaces/db/tree/.claude/router.md +4 -0
- package/releases/0.68.0/surfaces/db/tree/CLAUDE.md +17 -0
- package/releases/0.68.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
- package/releases/0.68.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
- package/releases/0.68.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.68.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
- package/releases/0.68.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
- package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
- package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
- package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
- package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
- package/releases/0.68.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
- package/releases/0.68.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
- package/releases/0.68.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
- package/releases/0.68.0/surfaces/frontend/tree/.claude/router.md +14 -0
- package/releases/0.68.0/surfaces/frontend/tree/CLAUDE.md +5 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/graph.md +10 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
- package/releases/0.68.0/surfaces/integrations/tree/.claude/router.md +6 -0
- package/releases/0.68.0/surfaces/integrations/tree/CLAUDE.md +17 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/graph.md +2 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/patterns.md +49 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/pipeline.md +2 -0
- package/releases/0.68.0/surfaces/money/tree/.claude/retrieval.md +2 -0
- package/releases/0.68.0/surfaces/money/tree/CLAUDE.md +11 -0
- package/releases/0.68.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
- package/releases/0.68.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
- package/releases/0.68.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
- package/releases/0.68.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
- package/releases/0.68.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
- package/releases/0.68.0/surfaces/pii/tree/CLAUDE.md +5 -0
- package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
- package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
- package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
- package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
- package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
- package/releases/0.68.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
- package/releases/0.68.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
- package/releases/0.68.0/surfaces/prisma/tree/CLAUDE.md +5 -0
- package/src/commands/gate.mjs +1 -1
- package/src/commands/learn.mjs +2 -1
- package/src/commands/sizes.mjs +72 -30
- package/src/gate.mjs +114 -8
- package/src/office.mjs +2 -1
package/src/commands/sizes.mjs
CHANGED
|
@@ -38,6 +38,30 @@ const RATE_OVER = 5;
|
|
|
38
38
|
/** Files a step's commit carries that are not the step's code: the harness's own, and lockfiles. */
|
|
39
39
|
const NOT_CODE = /^(\.claude\/|\.nina\/|CLAUDE\.md$)|(^|\/)(pnpm-lock\.yaml|package-lock\.json|yarn\.lock|bun\.lockb?)$/;
|
|
40
40
|
|
|
41
|
+
/**
|
|
42
|
+
* What a step's implementer wrote in its first round, from the `First round:` line the orchestrator writes in its step
|
|
43
|
+
* file when the step took more than one: the fix rounds after it are the review's, not the forecast's.
|
|
44
|
+
*
|
|
45
|
+
* @param {string} text - A step file.
|
|
46
|
+
* @returns {number|null}
|
|
47
|
+
*/
|
|
48
|
+
export function firstRoundIn(text) {
|
|
49
|
+
const m = /^[\s>*_-]*First round:[*_ \t]*~?[ \t]*(\d[\d,]*)[ \t]*lines?\b/im.exec(text);
|
|
50
|
+
return m ? Number(m[1].replace(/,/g, '')) : null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The kind a step file says it is, from its `Kind:` line — `new`, `extends`, `tests`, or any one word a project uses:
|
|
55
|
+
* a step is measured by the steps of its kind, where any has landed.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} text - A step file.
|
|
58
|
+
* @returns {string|null}
|
|
59
|
+
*/
|
|
60
|
+
export function kindIn(text) {
|
|
61
|
+
const m = /^[\s>*_-]*Kind:[*_ \t]*([A-Za-z][\w-]*)/m.exec(text);
|
|
62
|
+
return m ? m[1].toLowerCase() : null;
|
|
63
|
+
}
|
|
64
|
+
|
|
41
65
|
/**
|
|
42
66
|
* The forecast a step file states, from its `Size:` line.
|
|
43
67
|
*
|
|
@@ -204,13 +228,15 @@ export function measure(dir) {
|
|
|
204
228
|
};
|
|
205
229
|
const steps = [];
|
|
206
230
|
for (const file of files) {
|
|
207
|
-
const
|
|
231
|
+
const current = readFileSync(join(dir, file.path), 'utf8');
|
|
232
|
+
const now = forecastIn(current);
|
|
233
|
+
const kind = kindIn(current);
|
|
208
234
|
const landings = named.get(file.path).filter((c) => code.get(c.hash)?.size > 0);
|
|
209
235
|
if (landings.length === 0) {
|
|
210
236
|
if (!now) continue;
|
|
211
237
|
// Forecast again in the working tree, it is newer than every commit.
|
|
212
238
|
const since = at('HEAD', file.path)?.lines === now.lines ? writtenAt(file.path, Infinity, now.lines) : Infinity;
|
|
213
|
-
steps.push({ ...file, landed: false, forecast: now, since });
|
|
239
|
+
steps.push({ ...file, kind, landed: false, forecast: now, since });
|
|
214
240
|
continue;
|
|
215
241
|
}
|
|
216
242
|
// The forecast the step was built to: its file before its first commit, or as that commit wrote it.
|
|
@@ -225,15 +251,22 @@ export function measure(dir) {
|
|
|
225
251
|
const last = landings.at(-1);
|
|
226
252
|
// A forecast changed while the step was built — a fix round's spec — is shown, and the step measured against the first.
|
|
227
253
|
const revised = at(last.hash, file.path);
|
|
254
|
+
const firstRound = firstRoundIn(current);
|
|
255
|
+
const ratio = total / forecast.lines;
|
|
228
256
|
steps.push({
|
|
229
257
|
...file,
|
|
258
|
+
kind,
|
|
230
259
|
landed: true,
|
|
231
260
|
forecast,
|
|
232
261
|
revised: revised && revised.lines !== forecast.lines ? revised : null,
|
|
233
262
|
since,
|
|
234
263
|
lines: total,
|
|
235
264
|
files: lines.size,
|
|
236
|
-
ratio
|
|
265
|
+
ratio,
|
|
266
|
+
first: firstRound,
|
|
267
|
+
// What the forecast missed by: its first round where the step file says it, so fix rounds do not compound into
|
|
268
|
+
// the rate one correction-heavy step at a time.
|
|
269
|
+
measured: firstRound === null ? ratio : firstRound / forecast.lines,
|
|
237
270
|
t: last.t,
|
|
238
271
|
at: last.at,
|
|
239
272
|
hash: last.hash,
|
|
@@ -243,37 +276,41 @@ export function measure(dir) {
|
|
|
243
276
|
}
|
|
244
277
|
|
|
245
278
|
/**
|
|
246
|
-
* The rate to forecast a step again at: the median
|
|
247
|
-
*
|
|
248
|
-
* re-forecast already corrected for, and counting it would correct for
|
|
279
|
+
* The rate to forecast a step again at: the median of what its spec's newest landed steps forecast no earlier than it
|
|
280
|
+
* missed by (`measured`), over the steps of its kind where any has landed. A step forecast before the last re-forecast
|
|
281
|
+
* was measured against the old rates, which that re-forecast already corrected for, and counting it would correct for
|
|
282
|
+
* them twice; and a new module's rate put on steps that extend an existing file asked one project for six splits.
|
|
249
283
|
*
|
|
250
284
|
* @param {object[]} steps
|
|
251
|
-
* @param {{spec: string, since?: string}} step - Its spec,
|
|
252
|
-
* @returns {{rate: number, over: number}|null}
|
|
285
|
+
* @param {{spec: string, since?: string, kind?: string|null}} step - Its spec, when its own forecast was written, its kind.
|
|
286
|
+
* @returns {{rate: number, over: number, kind: string|null}|null}
|
|
253
287
|
*/
|
|
254
|
-
export function rateOf(steps, { spec, since }) {
|
|
288
|
+
export function rateOf(steps, { spec, since, kind = null }) {
|
|
255
289
|
// A forecast not known to be written when is measured by nothing, rather than by everything.
|
|
256
290
|
if (since === null || since === undefined) return null;
|
|
257
|
-
const landed = steps
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
return landed.length ? { rate: median(landed.map((s) => s.ratio)), over: landed.length } : null;
|
|
291
|
+
const landed = steps.filter((s) => s.landed && s.spec === spec && s.since >= since).sort((a, b) => a.t - b.t);
|
|
292
|
+
const mine = kind ? landed.filter((s) => s.kind === kind) : [];
|
|
293
|
+
const over = (mine.length ? mine : landed).slice(-RATE_OVER);
|
|
294
|
+
return over.length ? { rate: median(over.map((s) => s.measured ?? s.ratio)), over: over.length, kind: mine.length ? kind : null } : null;
|
|
262
295
|
}
|
|
263
296
|
|
|
264
297
|
/**
|
|
265
298
|
* What the detector says: the newest landed step, when it overran, and the steps of its spec still forecast as they
|
|
266
|
-
* were when it landed.
|
|
299
|
+
* were when it landed — until one of them is forecast again. The next step to go out is forecast again at its turn, and
|
|
300
|
+
* the rest at theirs: asked for every one at once, one project was asked for twenty splits of steps three or more
|
|
301
|
+
* steps away, which later steps would each have measured again.
|
|
267
302
|
*
|
|
268
|
-
* @param {
|
|
269
|
-
* @
|
|
270
|
-
* @returns {{step: object, rate: {rate: number, over: number}, stale: object[]}|null}
|
|
303
|
+
* @param {{steps: object[]}} measured
|
|
304
|
+
* @returns {{step: object, rate: {rate: number, over: number, kind: string|null}, stale: object[]}|null}
|
|
271
305
|
*/
|
|
272
306
|
export function overrun({ steps }) {
|
|
273
307
|
const newest = steps.filter((s) => s.landed).sort((a, b) => a.t - b.t).at(-1);
|
|
274
|
-
if (!newest || newest.
|
|
308
|
+
if (!newest || newest.measured <= OVERRUN) return null;
|
|
309
|
+
const mine = steps.filter((s) => !s.landed && s.spec === newest.spec && s.since !== null);
|
|
310
|
+
// A step forecast since it landed is the one about to go out, forecast at its turn: the overrun was acted on.
|
|
311
|
+
if (mine.some((s) => s.since > newest.t)) return null;
|
|
275
312
|
// Forecast no later than the overrun step was, so its rate measures them: forecast again since, they are not stale.
|
|
276
|
-
const stale =
|
|
313
|
+
const stale = mine.filter((s) => s.since <= newest.since);
|
|
277
314
|
return stale.length ? { step: newest, rate: rateOf(steps, stale[0]), stale } : null;
|
|
278
315
|
}
|
|
279
316
|
|
|
@@ -312,15 +349,17 @@ export async function sizes(argv) {
|
|
|
312
349
|
console.log('sizes: current');
|
|
313
350
|
return 0;
|
|
314
351
|
}
|
|
315
|
-
const { step,
|
|
352
|
+
const { step, stale } = found;
|
|
316
353
|
const again = stale.slice(0, 4).map((s) => {
|
|
317
|
-
const
|
|
318
|
-
|
|
354
|
+
const rate = rateOf(steps, s);
|
|
355
|
+
const next = Math.round(s.forecast.lines * (rate?.rate ?? 1));
|
|
356
|
+
return `${s.step} ~${s.forecast.lines} → ~${next}${rate?.kind ? ` (${rate.kind})` : ''}${next > limit ? ` past ${limit}` : ''}`;
|
|
319
357
|
});
|
|
358
|
+
const first = step.first === null ? '' : `, ${step.first} in its first round (${times(step.measured)})`;
|
|
320
359
|
console.log(
|
|
321
|
-
`step ${step.step} of ${step.spec} landed ${step.lines} lines against ~${step.forecast.lines} (${times(step.ratio)}); ` +
|
|
322
|
-
|
|
323
|
-
|
|
360
|
+
`step ${step.step} of ${step.spec} landed ${step.lines} lines against ~${step.forecast.lines} (${times(step.ratio)}${first}); ` +
|
|
361
|
+
`before the next of its ${stale.length} step(s) forecast when it was goes out, forecast that one again — a \`Size:\` line at the rate \`nina sizes\` gives it — ` +
|
|
362
|
+
`and split it if that puts it past ${limit}; the rest at their turn: ${again.join(', ')}${stale.length > again.length ? ', …' : ''}`,
|
|
324
363
|
);
|
|
325
364
|
return 1;
|
|
326
365
|
}
|
|
@@ -332,10 +371,13 @@ export async function sizes(argv) {
|
|
|
332
371
|
const mine = steps.filter((s) => s.spec === spec);
|
|
333
372
|
console.log(`\n ${bold(pink(spec))}${dim(` landed against the forecast it was built to; limit ${limit} lines`)}`);
|
|
334
373
|
for (const s of mine.filter((x) => x.landed).sort((a, b) => a.t - b.t)) {
|
|
335
|
-
const mark = s.
|
|
374
|
+
const mark = s.measured > OVERRUN ? amber(times(s.ratio)) : times(s.ratio);
|
|
336
375
|
const files = s.forecast.files === null ? `${s.files} file(s)` : `${s.files} file(s) of ${s.forecast.files}`;
|
|
337
|
-
|
|
338
|
-
|
|
376
|
+
// Against a forecast revised while it was built too, so a project can tell a forecasting miss from correction rounds.
|
|
377
|
+
const revised = s.revised ? `, revised to ~${s.revised.lines} while built: ${times(s.lines / s.revised.lines)} against it` : '';
|
|
378
|
+
const first = s.first === null ? '' : `, first round ${s.first} ${times(s.measured)}`;
|
|
379
|
+
const kind = s.kind ? `${s.kind} · ` : '';
|
|
380
|
+
console.log(` ${s.step.padEnd(10)} ~${String(s.forecast.lines).padEnd(5)} → ${String(s.lines).padEnd(5)} ${mark} ${dim(`${kind}${files}${first}${revised} · ${s.hash.slice(0, 7)} ${s.at.slice(0, 10)}`)}`);
|
|
339
381
|
}
|
|
340
382
|
for (const s of mine.filter((x) => !x.landed)) {
|
|
341
383
|
const rate = rateOf(steps, s);
|
|
@@ -346,7 +388,7 @@ export async function sizes(argv) {
|
|
|
346
388
|
const next = Math.round(s.forecast.lines * rate.rate);
|
|
347
389
|
console.log(
|
|
348
390
|
` ${s.step.padEnd(10)} ~${String(s.forecast.lines).padEnd(5)} → ~${String(next).padEnd(5)} ` +
|
|
349
|
-
dim(`to land, at ${times(rate.rate)} over ${rate.over} step(s) forecast as it was`) +
|
|
391
|
+
dim(`to land, at ${times(rate.rate)} over ${rate.over} ${rate.kind ? `${rate.kind} ` : ''}step(s) forecast as it was`) +
|
|
350
392
|
(next > limit ? amber(` past ${limit}: split`) : ''),
|
|
351
393
|
);
|
|
352
394
|
}
|
package/src/gate.mjs
CHANGED
|
@@ -399,8 +399,9 @@ export function replay(entries, loops, forward = new Map()) {
|
|
|
399
399
|
|
|
400
400
|
entries.forEach((e, i) => {
|
|
401
401
|
if (e.k === 'reset') {
|
|
402
|
-
// Ledgers written before the model's own questions stopped counting as the owner speaking hold those too.
|
|
403
|
-
|
|
402
|
+
// Ledgers written before the model's own questions stopped counting as the owner speaking hold those too. The
|
|
403
|
+
// prompt that opens a session carrying loops over is the owner resuming the work, not answering a loop.
|
|
404
|
+
if (e.why === 'ask' || e.why === 'resume') return;
|
|
404
405
|
for (const key of streak.keys()) if (key.split('|').length === 2) grace.set(key, (grace.get(key) ?? 0) + 1);
|
|
405
406
|
return;
|
|
406
407
|
}
|
|
@@ -441,7 +442,7 @@ export function replay(entries, loops, forward = new Map()) {
|
|
|
441
442
|
for (const r of rounds) {
|
|
442
443
|
streak.set(r.key, { n: r.edgeRound, agents: r.agents, at: r.at, blind: r.blind });
|
|
443
444
|
for (const issue of r.issues ?? []) streak.set(`${r.key}|${issue.id}`, { n: issue.round, edge: r.edgeRound });
|
|
444
|
-
made.push({ ...r, at: e.at });
|
|
445
|
+
made.push({ ...r, at: e.at, index: i, ...(e.inherited ? { inherited: e.inherited } : {}) });
|
|
445
446
|
}
|
|
446
447
|
}
|
|
447
448
|
});
|
|
@@ -460,7 +461,7 @@ export function replay(entries, loops, forward = new Map()) {
|
|
|
460
461
|
const onward = [...forward].filter(([, sources]) => sources.has(source)).map(([stage]) => stage);
|
|
461
462
|
return { source, token, rounds: s.n, cap, given: grace.get(key) ?? 0, issues, closing, targets: [...targetsOf(source)], onward };
|
|
462
463
|
});
|
|
463
|
-
const waiting = [...pending.entries()].flatMap(([source, batch]) => batch.filter((v) => isLoopBack(v.verdict)).map((v) => ({ source, verdict: v.verdict, issues: v.issues ?? [] })));
|
|
464
|
+
const waiting = [...pending.entries()].flatMap(([source, batch]) => batch.filter((v) => isLoopBack(v.verdict)).map((v) => ({ source, verdict: v.verdict, issues: v.issues ?? [], index: v.at })));
|
|
464
465
|
return { effect: (to) => effect(to, entries.length), rounds: made, open, waiting };
|
|
465
466
|
}
|
|
466
467
|
|
|
@@ -913,12 +914,104 @@ export function loopState(project, entries) {
|
|
|
913
914
|
}
|
|
914
915
|
for (const w of waiting) lines.push(`- waiting on a fix: ${w.source} ${w.verdict}${w.issues.length ? `, issues ${w.issues.join(', ')}` : ''}`);
|
|
915
916
|
if (open.length === 0 && waiting.length === 0) lines.push('- no loop is open');
|
|
916
|
-
const dispatched = entries.filter((e) => e.k === 'dispatch' && e.role).slice(-4);
|
|
917
|
+
const dispatched = entries.filter((e) => e.k === 'dispatch' && e.role && !e.inherited).slice(-4);
|
|
917
918
|
if (dispatched.length) lines.push(`- the latest dispatches: ${dispatched.map((e) => e.role).join(', ')}, the newest at ${String(dispatched.at(-1).at ?? '').slice(11, 16)} UTC`);
|
|
918
919
|
const closing = open.filter((l) => l.closing).length;
|
|
919
920
|
return { lines, open: open.length - closing, closing, waiting: waiting.length };
|
|
920
921
|
}
|
|
921
922
|
|
|
923
|
+
/** The entries a replay reads, and so the ones a session carries over from the one before it. */
|
|
924
|
+
const REPLAYED = new Set(['pre', 'dispatch', 'verdict', 'reset']);
|
|
925
|
+
|
|
926
|
+
/**
|
|
927
|
+
* How long the latest earlier session must have been quiet for a new one to carry its loops over: written to within
|
|
928
|
+
* the last minute, it is still at work, and a session the selftest begins milliseconds after another is not its sequel.
|
|
929
|
+
*/
|
|
930
|
+
const QUIET_MS = 60_000;
|
|
931
|
+
|
|
932
|
+
/**
|
|
933
|
+
* A new session's ledger begins with the loops the project's latest earlier session left open: the ledger is a
|
|
934
|
+
* session's, so a loop open when its session ended was not open in the next, and its cap started over. Work that
|
|
935
|
+
* pauses with a handoff note and resumes in a new session paused one design loop at round 1 of 2, and the next
|
|
936
|
+
* session's gate would have let it make two more. What is carried over is the earlier ledger's own entries from the
|
|
937
|
+
* launch whose rejection began the oldest loop still open, marked `inherited` with the session they came from, so
|
|
938
|
+
* the replay counts them as it counted them there; the office and `learn` leave them to the session that wrote them.
|
|
939
|
+
* A session running beside this one in the same checkout is carried over too: its loops are counted here as well,
|
|
940
|
+
* which holds a cap tighter, never looser.
|
|
941
|
+
*
|
|
942
|
+
* @param {string} root - The project.
|
|
943
|
+
* @param {object} project - `loadProject`'s.
|
|
944
|
+
* @param {string} path - This session's ledger, not written yet.
|
|
945
|
+
* @param {string} at - Now.
|
|
946
|
+
* @returns {{from: string, lines: string[]}|null} What was carried over, said as `nina gate --status` says it.
|
|
947
|
+
*/
|
|
948
|
+
function inherit(root, project, path, at) {
|
|
949
|
+
const session = basename(path, '.jsonl');
|
|
950
|
+
const earlier = sessionLedgers(root).ledgers.find((l) => l.session !== session);
|
|
951
|
+
if (!earlier || Date.parse(at) - earlier.written.getTime() < QUIET_MS) return null;
|
|
952
|
+
const entries = readLedger(earlier.path);
|
|
953
|
+
const { open, waiting, rounds } = replay(entries, project.loops, project.forward);
|
|
954
|
+
const held = open.filter((l) => !l.closing);
|
|
955
|
+
if (held.length === 0 && waiting.length === 0) return null;
|
|
956
|
+
// Where each began: the launch of its source before the dispatch that made its first round since it last closed,
|
|
957
|
+
// or before the rejection a fix still waits on — so its rejection, its fix and every round after it come along. A
|
|
958
|
+
// launch is where its `pre` stands: a foreground run's `dispatch` is written after its verdict, and cut there the
|
|
959
|
+
// rejection that began the loop stayed behind.
|
|
960
|
+
const launchBefore = (source, index) => {
|
|
961
|
+
const j = entries.findLastIndex((e, k) => k < index && (e.k === 'pre' || e.k === 'dispatch') && e.role === source);
|
|
962
|
+
const pre = j >= 0 && entries[j].k === 'dispatch' && entries[j].id ? entries.findIndex((e, k) => k < j && e.k === 'pre' && e.id === entries[j].id) : -1;
|
|
963
|
+
return pre >= 0 ? pre : j;
|
|
964
|
+
};
|
|
965
|
+
const starts = [
|
|
966
|
+
...held.map((l) => {
|
|
967
|
+
const first = rounds.findLast((r) => r.key === `${l.source}|${l.token}` && r.edgeRound === 1);
|
|
968
|
+
return first ? launchBefore(l.source, first.index) : 0;
|
|
969
|
+
}),
|
|
970
|
+
...waiting.map((w) => launchBefore(w.source, w.index)),
|
|
971
|
+
];
|
|
972
|
+
const from = Math.max(0, Math.min(...starts));
|
|
973
|
+
const carried = entries.slice(from).filter((e) => REPLAYED.has(e.k));
|
|
974
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
975
|
+
const head = { k: 'inherit', at, from: earlier.session, loops: held.length, waiting: waiting.length };
|
|
976
|
+
try {
|
|
977
|
+
writeFileSync(path, [head, ...carried.map((e) => ({ ...e, inherited: e.inherited ?? earlier.session }))].map((e) => `${JSON.stringify(e)}\n`).join(''), { flag: 'wx' });
|
|
978
|
+
} catch (error) {
|
|
979
|
+
// Two of this session's hooks at once: the other carried them over.
|
|
980
|
+
if (error?.code === 'EEXIST') return null;
|
|
981
|
+
throw error;
|
|
982
|
+
}
|
|
983
|
+
const lines = loopState(project, [head, ...carried]).lines.filter((line) => !line.startsWith('- the latest dispatches'));
|
|
984
|
+
return { from: earlier.session, lines };
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
/**
|
|
988
|
+
* What a session that carried loops over still owes its first prompt, when another event began its ledger: that prompt
|
|
989
|
+
* resumes the work, and is told what was carried. Read only where the ledger opens with what was carried.
|
|
990
|
+
*
|
|
991
|
+
* @param {object} project - `loadProject`'s.
|
|
992
|
+
* @param {string} path - The session's ledger.
|
|
993
|
+
* @returns {{from: string, lines: string[]}|null}
|
|
994
|
+
*/
|
|
995
|
+
function owedResume(project, path) {
|
|
996
|
+
let head = null;
|
|
997
|
+
try {
|
|
998
|
+
const fd = openSync(path, 'r');
|
|
999
|
+
try {
|
|
1000
|
+
const buffer = Buffer.alloc(512);
|
|
1001
|
+
const read = readSync(fd, buffer, 0, buffer.length, 0);
|
|
1002
|
+
head = JSON.parse(buffer.toString('utf8', 0, read).split('\n')[0]);
|
|
1003
|
+
} finally {
|
|
1004
|
+
closeSync(fd);
|
|
1005
|
+
}
|
|
1006
|
+
} catch {
|
|
1007
|
+
return null;
|
|
1008
|
+
}
|
|
1009
|
+
if (head?.k !== 'inherit') return null;
|
|
1010
|
+
const entries = readLedger(path);
|
|
1011
|
+
if (entries.some((e) => e.k === 'reset' && !e.inherited)) return null;
|
|
1012
|
+
return { from: String(head.from ?? ''), lines: loopState(project, entries).lines.filter((line) => !line.startsWith('- the latest dispatches')) };
|
|
1013
|
+
}
|
|
1014
|
+
|
|
922
1015
|
/**
|
|
923
1016
|
* What the gate hands the orchestrator after its conversation was compacted: the loops still open and the
|
|
924
1017
|
* loop-backs waiting on a fix, the latest dispatches, where the checkout stands, and the two documents to read
|
|
@@ -992,15 +1085,28 @@ export function handle(input, { root, now = new Date(), pkg = PACKAGE }) {
|
|
|
992
1085
|
if (!project) return null;
|
|
993
1086
|
const path = ledgerPath(root, input?.session_id);
|
|
994
1087
|
const at = now.toISOString();
|
|
1088
|
+
// A session's first event: its ledger begins with the loops the one before it left open. A carry-over that fails
|
|
1089
|
+
// costs only itself, never the event's own work.
|
|
1090
|
+
let carried = null;
|
|
1091
|
+
try {
|
|
1092
|
+
carried = input?.session_id && !existsSync(path) ? inherit(root, project, path, at) : null;
|
|
1093
|
+
} catch (error) {
|
|
1094
|
+
logError(root, input?.hook_event_name, error, now);
|
|
1095
|
+
}
|
|
995
1096
|
switch (input?.hook_event_name) {
|
|
996
|
-
case 'UserPromptSubmit':
|
|
1097
|
+
case 'UserPromptSubmit': {
|
|
997
1098
|
if (typeof input.prompt === 'string' && DELIVERED.test(input.prompt.slice(0, DELIVERY_HEAD))) {
|
|
998
1099
|
const from = /<agent-message from="([^"]+)"/.exec(input.prompt)?.[1] ?? /<task-id>([^<\s]+)<\/task-id>/.exec(input.prompt)?.[1];
|
|
999
1100
|
return leftBehind(input, project, path, at, from, 'UserPromptSubmit');
|
|
1000
1101
|
}
|
|
1001
|
-
|
|
1102
|
+
// The session's first prompt, whatever event began its ledger.
|
|
1103
|
+
const resumed = carried ?? owedResume(project, path);
|
|
1104
|
+
append(path, { k: 'reset', at, why: resumed ? 'resume' : 'prompt' });
|
|
1002
1105
|
prune(root, now);
|
|
1003
|
-
return null;
|
|
1106
|
+
if (!resumed) return null;
|
|
1107
|
+
const said = [`The NINA loop gate carried over what session ${resumed.from.slice(0, 8)} left open; its caps hold here as they did there:`, ...resumed.lines];
|
|
1108
|
+
return { hookSpecificOutput: { hookEventName: 'UserPromptSubmit', additionalContext: said.join('\n') } };
|
|
1109
|
+
}
|
|
1004
1110
|
case 'SubagentStop':
|
|
1005
1111
|
return onStop(input, project, path, at);
|
|
1006
1112
|
case 'SessionStart':
|
package/src/office.mjs
CHANGED
|
@@ -100,7 +100,8 @@ const REPLAY_MIN_GAP_MS = 500;
|
|
|
100
100
|
* @param {object[]} ledger - The ledger, oldest first.
|
|
101
101
|
*/
|
|
102
102
|
function readStarts(ledger) {
|
|
103
|
-
|
|
103
|
+
// What a session carried over from the one before it is that session's work, drawn there.
|
|
104
|
+
const entries = ledger.filter((e) => Number.isFinite(Date.parse(e?.at)) && !e.inherited);
|
|
104
105
|
const time = (e) => Date.parse(e.at);
|
|
105
106
|
const dispatches = new Map();
|
|
106
107
|
for (const e of entries) if (e.k === 'dispatch' && e.id && !dispatches.has(e.id)) dispatches.set(e.id, e);
|