pi-harness-runtime 0.10.13 → 0.10.15
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/harness/notification-events.ts +2 -2
- package/package.json +4 -7
- package/packages/auth/src/minimax-browser-auth.js +889 -0
- package/packages/capability-registry/src/types.js +10 -0
- package/packages/checkpoint/src/checkpoint-manager.js +29 -0
- package/packages/clipboard/src/copy-sync.js +169 -0
- package/packages/clipboard/src/gist-relay.js +185 -0
- package/packages/clipboard/src/github-login.js +68 -0
- package/packages/config-capture/src/index.js +268 -0
- package/packages/cookie-sanitizer/src/atomic-write.js +66 -0
- package/packages/cookie-sanitizer/src/detect-format.js +87 -0
- package/packages/cookie-sanitizer/src/index.js +38 -0
- package/packages/cookie-sanitizer/src/infer-provider.js +95 -0
- package/packages/cookie-sanitizer/src/normalize.js +74 -0
- package/packages/cookie-sanitizer/src/parse-json.js +107 -0
- package/packages/cookie-sanitizer/src/parse-netscape.js +98 -0
- package/packages/cookie-sanitizer/src/sync.js +268 -0
- package/packages/cookie-sanitizer/src/types.js +12 -0
- package/packages/cookie-sanitizer/src/watcher.js +147 -0
- package/packages/evaluation-engine/src/engine.js +343 -0
- package/packages/evaluation-engine/src/index.js +7 -0
- package/packages/evaluation-engine/src/types.js +14 -0
- package/packages/event-store/src/types.js +5 -0
- package/packages/experience-replay/src/index.js +6 -0
- package/packages/experience-replay/src/replay.js +228 -0
- package/packages/experience-replay/src/types.js +6 -0
- package/packages/learning-engine/src/engine.js +294 -0
- package/packages/learning-engine/src/index.js +7 -0
- package/packages/learning-engine/src/types.js +63 -0
- package/packages/memory-engine/src/engine.js +507 -0
- package/packages/memory-engine/src/index.js +7 -0
- package/packages/memory-engine/src/types.js +39 -0
- package/packages/model-registry/src/types.js +5 -0
- package/packages/performance-optimizer/src/index.js +6 -0
- package/packages/performance-optimizer/src/optimizer.js +304 -0
- package/packages/performance-optimizer/src/types.js +6 -0
- package/packages/projection-engine/src/types.js +5 -0
- package/packages/providers/src/provider-id.js +112 -0
- package/packages/quota-manager/src/quota-manager.js +259 -0
- package/packages/quota-manager/src/tui-usage-monitor.js +267 -0
- package/packages/todo-bd-sync/src/detector.js +131 -0
- package/packages/todo-bd-sync/src/extension.js +104 -0
- package/packages/todo-bd-sync/src/sync.js +289 -0
- package/packages/todo-bd-sync/src/task-analyzer.js +239 -0
- package/packages/todo-bd-sync/src/types.js +66 -0
- package/packages/token-estimation/src/index.js +114 -0
- package/packages/types/src/agent-worker-types.js +41 -0
- package/packages/types/src/ai-providers.js +66 -0
- package/packages/types/src/runtime-types.js +3 -0
- package/packages/workflow-events/src/types.js +5 -0
- package/packages/write-review/src/blackboard.js +228 -0
- package/packages/write-review/src/gate.js +137 -0
- package/packages/write-review/src/index.js +17 -0
- package/packages/write-review/src/injection.js +141 -0
- package/packages/write-review/src/review.js +153 -0
- package/packages/write-review/src/trigger.js +106 -0
- package/packages/write-review/src/types.js +25 -0
- package/IMPLEMENTATION/RFC-0010/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0010/AI_BRIEF.md +0 -20
- package/IMPLEMENTATION/RFC-0010/FILES.md +0 -11
- package/IMPLEMENTATION/RFC-0010/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0010/TESTS.md +0 -6
- package/IMPLEMENTATION/RFC-0011/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0011/AI_BRIEF.md +0 -19
- package/IMPLEMENTATION/RFC-0011/FILES.md +0 -11
- package/IMPLEMENTATION/RFC-0011/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0011/TESTS.md +0 -6
- package/IMPLEMENTATION/RFC-0012/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0012/AI_BRIEF.md +0 -18
- package/IMPLEMENTATION/RFC-0012/FILES.md +0 -11
- package/IMPLEMENTATION/RFC-0012/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0012/TESTS.md +0 -6
- package/IMPLEMENTATION/RFC-0013/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0013/AI_BRIEF.md +0 -19
- package/IMPLEMENTATION/RFC-0013/FILES.md +0 -11
- package/IMPLEMENTATION/RFC-0013/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0013/TESTS.md +0 -6
- package/IMPLEMENTATION/RFC-0014/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0014/AI_BRIEF.md +0 -20
- package/IMPLEMENTATION/RFC-0014/FILES.md +0 -11
- package/IMPLEMENTATION/RFC-0014/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0014/TESTS.md +0 -6
- package/IMPLEMENTATION/RFC-0015/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0015/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0015/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0015/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0015/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0016/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0016/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0016/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0016/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0016/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0017/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0017/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0017/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0017/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0017/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0018/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0018/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0018/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0018/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0018/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0019/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0019/AI_BRIEF.md +0 -18
- package/IMPLEMENTATION/RFC-0019/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0020/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0020/AI_BRIEF.md +0 -18
- package/IMPLEMENTATION/RFC-0020/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0021/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0021/AI_BRIEF.md +0 -18
- package/IMPLEMENTATION/RFC-0021/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0022/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0022/AI_BRIEF.md +0 -18
- package/IMPLEMENTATION/RFC-0022/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0023/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0023/AI_BRIEF.md +0 -18
- package/IMPLEMENTATION/RFC-0023/TASKS.md +0 -10
- package/IMPLEMENTATION/RFC-0024/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0024/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0025/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0025/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0026/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0026/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0027/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0027/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0028/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0028/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0029/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0029/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0030/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0030/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0031/AI_BRIEF.md +0 -45
- package/IMPLEMENTATION/RFC-0031/TASKS.md +0 -48
- package/IMPLEMENTATION/RFC-0032/AI_BRIEF.md +0 -45
- package/IMPLEMENTATION/RFC-0032/TASKS.md +0 -44
- package/IMPLEMENTATION/RFC-0033/AI_BRIEF.md +0 -46
- package/IMPLEMENTATION/RFC-0033/TASKS.md +0 -49
- package/IMPLEMENTATION/RFC-0034/AI_BRIEF.md +0 -54
- package/IMPLEMENTATION/RFC-0034/TASKS.md +0 -57
- package/IMPLEMENTATION/RFC-0035/AI_BRIEF.md +0 -55
- package/IMPLEMENTATION/RFC-0035/TASKS.md +0 -75
- package/IMPLEMENTATION/RFC-0036/AI_BRIEF.md +0 -62
- package/IMPLEMENTATION/RFC-0036/TASKS.md +0 -60
- package/IMPLEMENTATION/RFC-0037/AI_BRIEF.md +0 -59
- package/IMPLEMENTATION/RFC-0037/TASKS.md +0 -63
- package/IMPLEMENTATION/RFC-0038/AI_BRIEF.md +0 -67
- package/IMPLEMENTATION/RFC-0038/TASKS.md +0 -65
- package/IMPLEMENTATION/RFC-0039/AI_BRIEF.md +0 -68
- package/IMPLEMENTATION/RFC-0039/TASKS.md +0 -74
- package/IMPLEMENTATION/RFC-0040/AI_BRIEF.md +0 -79
- package/IMPLEMENTATION/RFC-0040/TASKS.md +0 -77
- package/IMPLEMENTATION/RFC-0041/ACCEPTANCE_CRITERIA.md +0 -8
- package/IMPLEMENTATION/RFC-0041/AI_BRIEF.md +0 -26
- package/IMPLEMENTATION/RFC-0041/FILES.md +0 -12
- package/IMPLEMENTATION/RFC-0041/TASKS.md +0 -12
- package/IMPLEMENTATION/RFC-0041/TESTS.md +0 -12
- package/IMPLEMENTATION/RFC-0042/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0042/AI_BRIEF.md +0 -5
- package/IMPLEMENTATION/RFC-0042/FILES.md +0 -14
- package/IMPLEMENTATION/RFC-0042/TASKS.md +0 -12
- package/IMPLEMENTATION/RFC-0042/TESTS.md +0 -11
- package/IMPLEMENTATION/RFC-0043/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0043/AI_BRIEF.md +0 -5
- package/IMPLEMENTATION/RFC-0043/FILES.md +0 -14
- package/IMPLEMENTATION/RFC-0043/TASKS.md +0 -12
- package/IMPLEMENTATION/RFC-0043/TESTS.md +0 -10
- package/IMPLEMENTATION/RFC-0044/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0044/AI_BRIEF.md +0 -5
- package/IMPLEMENTATION/RFC-0044/FILES.md +0 -13
- package/IMPLEMENTATION/RFC-0044/TASKS.md +0 -12
- package/IMPLEMENTATION/RFC-0044/TESTS.md +0 -10
- package/IMPLEMENTATION/RFC-0045/ACCEPTANCE_CRITERIA.md +0 -30
- package/IMPLEMENTATION/RFC-0045/AI_BRIEF.md +0 -53
- package/IMPLEMENTATION/RFC-0045/FILES.md +0 -13
- package/IMPLEMENTATION/RFC-0045/TASKS.md +0 -31
- package/IMPLEMENTATION/RFC-0045/TESTS.md +0 -62
- package/IMPLEMENTATION/RFC-0046/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0046/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0046/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0046/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0046/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0047/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0047/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0047/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0047/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0047/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0048/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0048/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0048/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0048/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0048/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0049/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0049/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0049/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0049/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0049/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0050/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0050/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0050/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0050/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0050/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0051/ACCEPTANCE_CRITERIA.md +0 -6
- package/IMPLEMENTATION/RFC-0051/AI_BRIEF.md +0 -20
- package/IMPLEMENTATION/RFC-0051/FILES.md +0 -8
- package/IMPLEMENTATION/RFC-0051/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0051/TESTS.md +0 -4
- package/IMPLEMENTATION/RFC-0052/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0052/AI_BRIEF.md +0 -19
- package/IMPLEMENTATION/RFC-0052/FILES.md +0 -8
- package/IMPLEMENTATION/RFC-0052/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0052/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0053/ACCEPTANCE_CRITERIA.md +0 -8
- package/IMPLEMENTATION/RFC-0053/AI_BRIEF.md +0 -20
- package/IMPLEMENTATION/RFC-0053/FILES.md +0 -9
- package/IMPLEMENTATION/RFC-0053/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0053/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0054/ACCEPTANCE_CRITERIA.md +0 -8
- package/IMPLEMENTATION/RFC-0054/AI_BRIEF.md +0 -19
- package/IMPLEMENTATION/RFC-0054/FILES.md +0 -8
- package/IMPLEMENTATION/RFC-0054/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0054/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0055/ACCEPTANCE_CRITERIA.md +0 -8
- package/IMPLEMENTATION/RFC-0055/AI_BRIEF.md +0 -17
- package/IMPLEMENTATION/RFC-0055/FILES.md +0 -9
- package/IMPLEMENTATION/RFC-0055/TASKS.md +0 -3
- package/IMPLEMENTATION/RFC-0055/TESTS.md +0 -1
- package/IMPLEMENTATION/RFC-0056/ACCEPTANCE_CRITERIA.md +0 -6
- package/IMPLEMENTATION/RFC-0056/AI_BRIEF.md +0 -18
- package/IMPLEMENTATION/RFC-0056/FILES.md +0 -9
- package/IMPLEMENTATION/RFC-0056/TASKS.md +0 -9
- package/IMPLEMENTATION/RFC-0056/TESTS.md +0 -7
- package/IMPLEMENTATION/RFC-0057/ACCEPTANCE_CRITERIA.md +0 -5
- package/IMPLEMENTATION/RFC-0057/AI_BRIEF.md +0 -5
- package/IMPLEMENTATION/RFC-0057/FILES.md +0 -11
- package/IMPLEMENTATION/RFC-0057/TASKS.md +0 -9
- package/IMPLEMENTATION/RFC-0057/TESTS.md +0 -7
- package/IMPLEMENTATION/RFC-0058/ACCEPTANCE_CRITERIA.md +0 -6
- package/IMPLEMENTATION/RFC-0058/AI_BRIEF.md +0 -5
- package/IMPLEMENTATION/RFC-0058/FILES.md +0 -11
- package/IMPLEMENTATION/RFC-0058/TASKS.md +0 -9
- package/IMPLEMENTATION/RFC-0058/TESTS.md +0 -7
- package/IMPLEMENTATION/RFC-0059/ACCEPTANCE_CRITERIA.md +0 -6
- package/IMPLEMENTATION/RFC-0059/AI_BRIEF.md +0 -5
- package/IMPLEMENTATION/RFC-0059/FILES.md +0 -11
- package/IMPLEMENTATION/RFC-0059/TASKS.md +0 -9
- package/IMPLEMENTATION/RFC-0059/TESTS.md +0 -7
- package/IMPLEMENTATION/RFC-0060/ACCEPTANCE_CRITERIA.md +0 -7
- package/IMPLEMENTATION/RFC-0060/AI_BRIEF.md +0 -5
- package/IMPLEMENTATION/RFC-0060/FILES.md +0 -14
- package/IMPLEMENTATION/RFC-0060/TASKS.md +0 -12
- package/IMPLEMENTATION/RFC-0060/TESTS.md +0 -10
- package/IMPLEMENTATION/RFC-0061/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0061/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0061/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0061/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0061/TESTS.md +0 -2
- package/IMPLEMENTATION/RFC-0062/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0062/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0062/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0062/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0062/TESTS.md +0 -2
- package/IMPLEMENTATION/RFC-0063/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0063/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0063/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0063/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0063/TESTS.md +0 -2
- package/IMPLEMENTATION/RFC-0064/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0064/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0064/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0064/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0064/TESTS.md +0 -2
- package/IMPLEMENTATION/RFC-0065/ACCEPTANCE_CRITERIA.md +0 -1
- package/IMPLEMENTATION/RFC-0065/AI_BRIEF.md +0 -1
- package/IMPLEMENTATION/RFC-0065/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0065/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0065/TESTS.md +0 -2
- package/IMPLEMENTATION/RFC-0066/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0066/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0066/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0066/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0066/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0067/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0067/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0067/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0067/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0067/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0068/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0068/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0068/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0068/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0068/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0069/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0069/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0069/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0069/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0069/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0070/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0070/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0070/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0070/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0070/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0071/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0071/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0071/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0071/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0071/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0072/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0072/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0072/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0072/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0072/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0073/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0073/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0073/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0073/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0073/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0074/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0074/AI_BRIEF.md +0 -17
- package/IMPLEMENTATION/RFC-0074/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0074/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0074/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0075/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0075/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0075/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0075/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0075/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0076/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0076/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0076/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0076/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0076/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0077/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0077/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0077/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0077/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0077/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0078/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0078/AI_BRIEF.md +0 -17
- package/IMPLEMENTATION/RFC-0078/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0078/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0078/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0079/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0079/AI_BRIEF.md +0 -7
- package/IMPLEMENTATION/RFC-0079/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0079/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0079/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0080/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0080/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0080/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0080/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0080/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0081/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0081/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0081/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0081/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0081/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0082/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0082/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0082/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0082/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0082/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0083/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0083/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0083/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0083/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0083/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0084/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0084/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0084/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0084/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0084/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0085/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0085/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0085/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0085/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0085/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0086/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0086/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0086/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0086/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0086/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0087/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0087/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0087/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0087/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0087/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0088/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0088/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0088/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0088/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0088/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0089/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0089/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0089/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0089/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0089/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0090/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0090/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0090/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0090/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0090/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0091/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0091/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0091/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0091/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0091/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0092/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0092/AI_BRIEF.md +0 -20
- package/IMPLEMENTATION/RFC-0092/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0092/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0092/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0093/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0093/AI_BRIEF.md +0 -22
- package/IMPLEMENTATION/RFC-0093/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0093/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0093/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0094/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0094/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0094/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0094/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0094/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0095/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0095/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0095/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0095/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0095/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0096/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0096/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0096/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0096/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0096/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0097/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0097/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0097/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0097/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0097/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0098/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0098/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0098/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0098/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0098/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0099/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0099/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0099/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0099/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0099/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0100/ACCEPTANCE_CRITERIA.md +0 -2
- package/IMPLEMENTATION/RFC-0100/AI_BRIEF.md +0 -2
- package/IMPLEMENTATION/RFC-0100/FILES.md +0 -2
- package/IMPLEMENTATION/RFC-0100/TASKS.md +0 -4
- package/IMPLEMENTATION/RFC-0100/TESTS.md +0 -3
- package/IMPLEMENTATION/RFC-0101/ACCEPTANCE_CRITERIA.md +0 -74
- package/IMPLEMENTATION/RFC-0101/AI_BRIEF.md +0 -80
- package/IMPLEMENTATION/RFC-0101/FILES.md +0 -82
- package/IMPLEMENTATION/RFC-0101/TASKS.md +0 -92
- package/IMPLEMENTATION/RFC-0101/TESTS.md +0 -127
- package/IMPLEMENTATION/RFC-0102/ACCEPTANCE_CRITERIA.md +0 -33
- package/IMPLEMENTATION/RFC-0102/AI_BRIEF.md +0 -34
- package/IMPLEMENTATION/RFC-0102/FILES.md +0 -73
- package/IMPLEMENTATION/RFC-0102/TASKS.md +0 -75
- package/IMPLEMENTATION/RFC-0102/TESTS.md +0 -78
- package/IMPLEMENTATION/RFC-0103/ACCEPTANCE_CRITERIA.md +0 -45
- package/IMPLEMENTATION/RFC-0103/AI_BRIEF.md +0 -46
- package/IMPLEMENTATION/RFC-0103/FILES.md +0 -121
- package/IMPLEMENTATION/RFC-0103/TASKS.md +0 -97
- package/IMPLEMENTATION/RFC-0103/TESTS.md +0 -118
- package/IMPLEMENTATION/RFC-0104/ACCEPTANCE_CRITERIA.md +0 -29
- package/IMPLEMENTATION/RFC-0104/FILES.md +0 -33
- package/IMPLEMENTATION/RFC-0105/ACCEPTANCE_CRITERIA.md +0 -29
- package/IMPLEMENTATION/RFC-0105/FILES.md +0 -41
- package/IMPLEMENTATION/RFC-0106/ACCEPTANCE_CRITERIA.md +0 -29
- package/IMPLEMENTATION/RFC-0106/FILES.md +0 -43
- package/RFC/0001_LOOP_RUNTIME.md +0 -14
- package/RFC/0002_PROVIDER_ADAPTER.md +0 -3
- package/RFC/0003_QUOTA_MANAGER.md +0 -3
- package/RFC/0004_PLAYWRIGHT_ADAPTER.md +0 -3
- package/RFC/0005_GIT_WORKTREE.md +0 -3
- package/RFC/0006_CHECKPOINT_MANAGER.md +0 -56
- package/RFC/0007_SCHEDULER.md +0 -32
- package/RFC/0008_PROVIDER_ROUTER.md +0 -44
- package/RFC/0009_SHARED_CONTEXT.md +0 -32
- package/RFC/0010_CONTEXT_WINDOW_MANAGER.md +0 -50
- package/RFC/0011_SHARED_BLACKBOARD.md +0 -42
- package/RFC/0012_AGENT_HANDOFF_PROTOCOL.md +0 -41
- package/RFC/0013_E2E_TEST_ENGINE.md +0 -42
- package/RFC/0014_PROJECT_DETECTOR_AND_TEST_DATA_ENGINE.md +0 -35
- package/RFC/0015_JOB_STATE_MACHINE.md +0 -45
- package/RFC/0016_TASK_GRAPH.md +0 -31
- package/RFC/0017_MASTER_PLANNER.md +0 -32
- package/RFC/0018_REPAIR_ENGINE.md +0 -36
- package/RFC/0019_AUTO_COMPACT_AND_CONTINUE.md +0 -51
- package/RFC/0020_OUTPUT_TOKEN_LIMIT_HANDLER.md +0 -49
- package/RFC/0021_PARTIAL_RESPONSE_RECOVERY.md +0 -49
- package/RFC/0022_NOTIFICATION_CENTER.md +0 -47
- package/RFC/0023_LOCAL_BROWSER_AGENT.md +0 -67
- package/RFC/0024_LOCAL_RUNTIME_AGENT.md +0 -3
- package/RFC/0025_COMMAND_EXECUTOR.md +0 -3
- package/RFC/0026_WORKSPACE_MANAGER.md +0 -3
- package/RFC/0027_RUNTIME_API.md +0 -3
- package/RFC/0028_POLICY_ENGINE.md +0 -3
- package/RFC/0029_DEEPAGENTS_ADAPTER.md +0 -2
- package/RFC/0030_AGENT_WORKER_INTERFACE.md +0 -2
- package/RFC/0031_PROVIDER_ADAPTER_SDK.md +0 -171
- package/RFC/0032_CHECKPOINT_ENGINE.md +0 -217
- package/RFC/0033_SESSION_MANAGER.md +0 -262
- package/RFC/0034_OBSERVABILITY.md +0 -416
- package/RFC/0035_ROADMAP_V1.md +0 -295
- package/RFC/0036_CODE_REVIEW_ENGINE.md +0 -430
- package/RFC/0037_CODE_GENERATION_PIPELINE.md +0 -504
- package/RFC/0038_FRAMEWORK_DETECTOR.md +0 -466
- package/RFC/0039_TEST_DATA_GENERATOR.md +0 -504
- package/RFC/0040_FRAMEWORK_PLUGIN_SDK.md +0 -543
- package/RFC/0041_PROMPT_COMPILER.md +0 -232
- package/RFC/0042_CONTEXT_COMPILER.md +0 -216
- package/RFC/0043_REQUIREMENT_COMPILER.md +0 -211
- package/RFC/0044_TASK_COMPILER.md +0 -207
- package/RFC/0045_PROJECT_ANALYZER.md +0 -246
- package/RFC/0046_DEPENDENCY_ANALYZER.md +0 -14
- package/RFC/0047_REPOSITORY_KNOWLEDGE_GRAPH.md +0 -14
- package/RFC/0048_CODE_MERGE_ENGINE.md +0 -14
- package/RFC/0049_CONFLICT_RESOLUTION_ENGINE.md +0 -14
- package/RFC/0050_DOCUMENTATION_GENERATOR.md +0 -14
- package/RFC/0051_CAPABILITY_REGISTRY.md +0 -144
- package/RFC/0052_SKILL_REGISTRY.md +0 -167
- package/RFC/0053_MODEL_REGISTRY.md +0 -214
- package/RFC/0054_PROVIDER_ROUTER.md +0 -239
- package/RFC/0055_COST_OPTIMIZER.md +0 -285
- package/RFC/0056_PERFORMANCE_OPTIMIZER.md +0 -118
- package/RFC/0057_EVALUATION_ENGINE.md +0 -116
- package/RFC/0058_LEARNING_ENGINE.md +0 -113
- package/RFC/0059_EXPERIENCE_REPLAY.md +0 -107
- package/RFC/0060_MEMORY_ENGINE_OKF.md +0 -152
- package/RFC/0061_FRAPPE_PLUGIN.md +0 -9
- package/RFC/0062_NEXTJS_PLUGIN.md +0 -9
- package/RFC/0063_REACT_VITE_PLUGIN.md +0 -9
- package/RFC/0064_DJANGO_PLUGIN.md +0 -9
- package/RFC/0065_LARAVEL_PLUGIN.md +0 -9
- package/RFC/0066_GENERIC_WEB_PLUGIN.md +0 -24
- package/RFC/0067_CLI_PLUGIN_SDK.md +0 -101
- package/RFC/0068_MCP_ADAPTER.md +0 -114
- package/RFC/0069_GOOGLE_A2A_ADAPTER.md +0 -139
- package/RFC/0070_OPENAI_CODEX_ADAPTER.md +0 -134
- package/RFC/0071_REQUIREMENT_INTAKE.md +0 -95
- package/RFC/0072_PROJECT_BOOTSTRAP.md +0 -82
- package/RFC/0073_ARCHITECTURE_GENERATOR.md +0 -85
- package/RFC/0074_SPRINT_PLANNER.md +0 -61
- package/RFC/0075_MILESTONE_MANAGER.md +0 -58
- package/RFC/0076_BACKLOG_MANAGER.md +0 -24
- package/RFC/0077_HUMAN_APPROVAL_GATE.md +0 -24
- package/RFC/0078_RELEASE_MANAGER.md +0 -24
- package/RFC/0079_VERSION_MANAGER.md +0 -24
- package/RFC/0080_DEPLOYMENT_PIPELINE.md +0 -24
- package/RFC/0081_MULTI_USER_RUNTIME.md +0 -24
- package/RFC/0082_RBAC.md +0 -24
- package/RFC/0083_AUDIT_TRAIL.md +0 -24
- package/RFC/0084_DASHBOARD.md +0 -24
- package/RFC/0085_ANALYTICS.md +0 -24
- package/RFC/0086_DISTRIBUTED_RUNTIME.md +0 -24
- package/RFC/0087_CLUSTER_MANAGER.md +0 -24
- package/RFC/0088_RUNTIME_FEDERATION.md +0 -24
- package/RFC/0089_HIGH_AVAILABILITY.md +0 -24
- package/RFC/0090_DISASTER_RECOVERY.md +0 -24
- package/RFC/0091_AUTONOMOUS_ARCHITECTURE_REVIEW.md +0 -24
- package/RFC/0092_AUTONOMOUS_REFACTORING.md +0 -24
- package/RFC/0093_AUTONOMOUS_BUG_FIXING.md +0 -24
- package/RFC/0094_AUTONOMOUS_PERFORMANCE_TUNING.md +0 -24
- package/RFC/0095_AUTONOMOUS_SECURITY_REVIEW.md +0 -24
- package/RFC/0096_AUTONOMOUS_COST_OPTIMIZATION.md +0 -24
- package/RFC/0097_AUTONOMOUS_DOCUMENTATION.md +0 -24
- package/RFC/0098_AUTONOMOUS_KNOWLEDGE_MANAGEMENT.md +0 -24
- package/RFC/0099_RUNTIME_EVOLUTION_ENGINE.md +0 -24
- package/RFC/0100_SELF_DEVELOPING_RUNTIME.md +0 -24
- package/RFC/0101_AUTONOMOUS_OPERATIONS_RUNTIME.md +0 -1105
- package/RFC/0102_CONTEXT_ENGINEERING_PIPELINE.md +0 -508
- package/RFC/0103_SESSION_EVENT_RUNTIME_AGENT_COMMUNICATION_LAYER.md +0 -616
- package/RFC/0104_DISTRIBUTED_AGENT_COMMUNICATION.md +0 -143
- package/RFC/0105_DISTRIBUTED_KNOWLEDGE_RETRIEVAL.md +0 -301
- package/RFC/0106_KNOWLEDGE_GRAPH_PROVENANCE.md +0 -368
- package/RFC/README.md +0 -11
- package/packages/event-bus/dist/tsconfig.tsbuildinfo +0 -1
- package/packages/provider-adapter-sdk/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Two-way sync between rpiv-todo and bd
|
|
3
|
+
*
|
|
4
|
+
* This module handles:
|
|
5
|
+
* 1. rpiv-todo → bd: When todo tool is called, sync to bd
|
|
6
|
+
* 2. bd → rpiv-todo: When bd commands are executed, sync to todo
|
|
7
|
+
* 3. Session start: Load existing bd issues into todo
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from "node:child_process";
|
|
10
|
+
import { IdMappingRegistry, STATUS_MAP } from "./types.js";
|
|
11
|
+
// Mapping registry singleton
|
|
12
|
+
const mappingRegistry = new IdMappingRegistry();
|
|
13
|
+
/**
|
|
14
|
+
* Execute a bd command and return the output
|
|
15
|
+
*/
|
|
16
|
+
export function execBdCommand(command) {
|
|
17
|
+
try {
|
|
18
|
+
return execSync(command, {
|
|
19
|
+
encoding: "utf8",
|
|
20
|
+
timeout: 10000,
|
|
21
|
+
cwd: process.cwd(),
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const err = error;
|
|
26
|
+
return err.stderr || err.message || "";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Extract bd ID from command or output
|
|
31
|
+
*/
|
|
32
|
+
export function extractBdId(input) {
|
|
33
|
+
// Match patterns like: bd-a1b2, bd-a1b2.1, BD-a1b2, etc.
|
|
34
|
+
const match = input.match(/bd-[a-z0-9]+(\.[0-9]+)?/i);
|
|
35
|
+
return match ? match[0].toLowerCase() : null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get all open bd issues
|
|
39
|
+
*/
|
|
40
|
+
export function getOpenBdIssues() {
|
|
41
|
+
try {
|
|
42
|
+
const output = execBdCommand("bd ready --json");
|
|
43
|
+
const issues = JSON.parse(output);
|
|
44
|
+
return issues.map((issue) => ({
|
|
45
|
+
id: issue.id,
|
|
46
|
+
title: issue.title,
|
|
47
|
+
status: issue.status,
|
|
48
|
+
priority: issue.priority,
|
|
49
|
+
createdAt: issue.created_at,
|
|
50
|
+
updatedAt: issue.updated_at,
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get all bd issues (including closed)
|
|
59
|
+
*/
|
|
60
|
+
export function getAllBdIssues() {
|
|
61
|
+
try {
|
|
62
|
+
const output = execBdCommand("bd list --json");
|
|
63
|
+
const issues = JSON.parse(output);
|
|
64
|
+
return issues.map((issue) => ({
|
|
65
|
+
id: issue.id,
|
|
66
|
+
title: issue.title,
|
|
67
|
+
status: issue.status,
|
|
68
|
+
priority: issue.priority,
|
|
69
|
+
createdAt: issue.created_at,
|
|
70
|
+
updatedAt: issue.updated_at,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a bd issue from a todo task
|
|
79
|
+
*/
|
|
80
|
+
export function createBdFromTodo(task) {
|
|
81
|
+
const priority = inferPriorityFromTask(task);
|
|
82
|
+
try {
|
|
83
|
+
const command = `bd create "${escapeShell(task.subject)}" -p ${priority} --json`;
|
|
84
|
+
const output = execBdCommand(command);
|
|
85
|
+
// Try to extract bd ID from output
|
|
86
|
+
let bdId = extractBdId(output);
|
|
87
|
+
// If not found in output, try to get it from the created issue
|
|
88
|
+
if (!bdId) {
|
|
89
|
+
const issues = getOpenBdIssues();
|
|
90
|
+
// Match by title (not ideal but fallback)
|
|
91
|
+
const match = issues.find((i) => i.title === task.subject);
|
|
92
|
+
bdId = match?.id || null;
|
|
93
|
+
}
|
|
94
|
+
if (bdId) {
|
|
95
|
+
mappingRegistry.set(task.id, bdId);
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
success: true,
|
|
99
|
+
direction: "todo_to_bd",
|
|
100
|
+
taskId: task.id,
|
|
101
|
+
bdId: bdId || undefined,
|
|
102
|
+
action: "create",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
direction: "todo_to_bd",
|
|
109
|
+
taskId: task.id,
|
|
110
|
+
action: "create",
|
|
111
|
+
error: error instanceof Error ? error.message : String(error),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Update a bd issue from a todo task update
|
|
117
|
+
*/
|
|
118
|
+
export function updateBdFromTodo(task) {
|
|
119
|
+
const mapping = mappingRegistry.getByTodoId(task.id);
|
|
120
|
+
if (!mapping) {
|
|
121
|
+
// No mapping exists, create new bd issue
|
|
122
|
+
return createBdFromTodo(task);
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
const bdStatus = STATUS_MAP[task.status];
|
|
126
|
+
const command = `bd update ${mapping.bdId} --status ${bdStatus} --json`;
|
|
127
|
+
execBdCommand(command);
|
|
128
|
+
// Update last sync timestamp
|
|
129
|
+
mappingRegistry.updateLastSync(task.id);
|
|
130
|
+
return {
|
|
131
|
+
success: true,
|
|
132
|
+
direction: "todo_to_bd",
|
|
133
|
+
taskId: task.id,
|
|
134
|
+
bdId: mapping.bdId,
|
|
135
|
+
action: "update",
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
return {
|
|
140
|
+
success: false,
|
|
141
|
+
direction: "todo_to_bd",
|
|
142
|
+
taskId: task.id,
|
|
143
|
+
bdId: mapping.bdId,
|
|
144
|
+
action: "update",
|
|
145
|
+
error: error instanceof Error ? error.message : String(error),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Close/delete a bd issue when todo is deleted
|
|
151
|
+
*/
|
|
152
|
+
export function closeBdFromTodo(task) {
|
|
153
|
+
const mapping = mappingRegistry.getByTodoId(task.id);
|
|
154
|
+
if (!mapping) {
|
|
155
|
+
return {
|
|
156
|
+
success: true, // Nothing to close
|
|
157
|
+
direction: "todo_to_bd",
|
|
158
|
+
taskId: task.id,
|
|
159
|
+
action: "delete",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
try {
|
|
163
|
+
const command = `bd close ${mapping.bdId} --reason "Closed from todo" --json`;
|
|
164
|
+
execBdCommand(command);
|
|
165
|
+
// Remove mapping
|
|
166
|
+
mappingRegistry.delete(task.id);
|
|
167
|
+
return {
|
|
168
|
+
success: true,
|
|
169
|
+
direction: "todo_to_bd",
|
|
170
|
+
taskId: task.id,
|
|
171
|
+
bdId: mapping.bdId,
|
|
172
|
+
action: "delete",
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
direction: "todo_to_bd",
|
|
179
|
+
taskId: task.id,
|
|
180
|
+
bdId: mapping.bdId,
|
|
181
|
+
action: "delete",
|
|
182
|
+
error: error instanceof Error ? error.message : String(error),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Infer priority from task metadata
|
|
188
|
+
*/
|
|
189
|
+
function inferPriorityFromTask(task) {
|
|
190
|
+
if (task.metadata?.priority !== undefined) {
|
|
191
|
+
return task.metadata.priority;
|
|
192
|
+
}
|
|
193
|
+
// Default priority 2 (medium)
|
|
194
|
+
return 2;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Parse bd create output to extract created issue
|
|
198
|
+
*/
|
|
199
|
+
export function parseBdCreateOutput(output) {
|
|
200
|
+
try {
|
|
201
|
+
const json = JSON.parse(output);
|
|
202
|
+
if (json.id) {
|
|
203
|
+
return {
|
|
204
|
+
bdId: json.id,
|
|
205
|
+
title: json.title || "",
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Not JSON, try text extraction
|
|
211
|
+
}
|
|
212
|
+
const bdId = extractBdId(output);
|
|
213
|
+
if (bdId) {
|
|
214
|
+
return { bdId, title: "" };
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Detect if a bash command is a bd command
|
|
220
|
+
*/
|
|
221
|
+
export function isBdCommand(command) {
|
|
222
|
+
const trimmed = command.trim().toLowerCase();
|
|
223
|
+
return (trimmed.startsWith("bd ") ||
|
|
224
|
+
trimmed.startsWith("beads ") ||
|
|
225
|
+
trimmed.includes("bd create") ||
|
|
226
|
+
trimmed.includes("bd update") ||
|
|
227
|
+
trimmed.includes("bd close") ||
|
|
228
|
+
trimmed.includes("bd ready") ||
|
|
229
|
+
trimmed.includes("bd list"));
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Extract bd ID from a command
|
|
233
|
+
*/
|
|
234
|
+
export function extractBdIdFromCommand(command) {
|
|
235
|
+
return extractBdId(command);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get the mapping registry for external access
|
|
239
|
+
*/
|
|
240
|
+
export function getMappingRegistry() {
|
|
241
|
+
return mappingRegistry;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Clear all mappings (for testing or reset)
|
|
245
|
+
*/
|
|
246
|
+
export function clearMappings() {
|
|
247
|
+
mappingRegistry.clear();
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Escape shell arguments
|
|
251
|
+
*/
|
|
252
|
+
function escapeShell(str) {
|
|
253
|
+
// Escape double quotes and backslashes
|
|
254
|
+
return str.replace(/["\\]/g, "\\$&");
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Sync from todo action to bd
|
|
258
|
+
* Called when todo tool is executed
|
|
259
|
+
*/
|
|
260
|
+
export function syncTodoToBd(action, task) {
|
|
261
|
+
switch (action) {
|
|
262
|
+
case "create":
|
|
263
|
+
return createBdFromTodo(task);
|
|
264
|
+
case "update":
|
|
265
|
+
return updateBdFromTodo(task);
|
|
266
|
+
case "delete":
|
|
267
|
+
return closeBdFromTodo(task);
|
|
268
|
+
default:
|
|
269
|
+
return {
|
|
270
|
+
success: true,
|
|
271
|
+
direction: "todo_to_bd",
|
|
272
|
+
taskId: task.id,
|
|
273
|
+
action,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Parse todo task from tool event
|
|
279
|
+
* This is a simplified parser - actual implementation depends on event structure
|
|
280
|
+
*/
|
|
281
|
+
export function parseTodoTaskFromEvent(event) {
|
|
282
|
+
// The event structure depends on how pi-coding-agent exposes it
|
|
283
|
+
// This is a placeholder - actual implementation needs event inspection
|
|
284
|
+
const task = event.task;
|
|
285
|
+
if (!task || typeof task.id !== "number") {
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
return task;
|
|
289
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart Auto-Todo Task Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Decides when to automatically create bd issues based on:
|
|
5
|
+
* 1. Task complexity signals
|
|
6
|
+
* 2. Session state (pending task count)
|
|
7
|
+
*
|
|
8
|
+
* Philosophy:
|
|
9
|
+
* - Simple tasks (grep, quick edit) -> NO todo (avoid noise)
|
|
10
|
+
* - Complex tasks OR multiple pending tasks -> AUTO-CREATE todo
|
|
11
|
+
*/
|
|
12
|
+
import { getOpenBdIssues } from "./sync.js";
|
|
13
|
+
const COMPLEX_KEYWORDS = [
|
|
14
|
+
"complicated",
|
|
15
|
+
"complex",
|
|
16
|
+
"tricky",
|
|
17
|
+
"difficult",
|
|
18
|
+
"refactor",
|
|
19
|
+
"architecture",
|
|
20
|
+
"design",
|
|
21
|
+
"implement from scratch",
|
|
22
|
+
"rewrite",
|
|
23
|
+
"investigate",
|
|
24
|
+
"debug",
|
|
25
|
+
"fix the bug",
|
|
26
|
+
"performance",
|
|
27
|
+
];
|
|
28
|
+
const RESEARCH_KEYWORDS = [
|
|
29
|
+
"search",
|
|
30
|
+
"look up",
|
|
31
|
+
"find",
|
|
32
|
+
"research",
|
|
33
|
+
"check",
|
|
34
|
+
"verify",
|
|
35
|
+
"how to",
|
|
36
|
+
"best practice",
|
|
37
|
+
"compare",
|
|
38
|
+
"evaluate",
|
|
39
|
+
"review",
|
|
40
|
+
];
|
|
41
|
+
const SUBTASK_KEYWORDS = [
|
|
42
|
+
"also",
|
|
43
|
+
"plus",
|
|
44
|
+
"and also",
|
|
45
|
+
"while you're at it",
|
|
46
|
+
"on top of that",
|
|
47
|
+
"additionally",
|
|
48
|
+
"another thing",
|
|
49
|
+
"don't forget",
|
|
50
|
+
"should also",
|
|
51
|
+
];
|
|
52
|
+
/**
|
|
53
|
+
* Analyze user request text for complexity signals
|
|
54
|
+
*/
|
|
55
|
+
export function analyzeTaskSignals(userMessage) {
|
|
56
|
+
const lower = userMessage.toLowerCase();
|
|
57
|
+
// Count implied steps from action verbs
|
|
58
|
+
const actionVerbs = [
|
|
59
|
+
"create",
|
|
60
|
+
"build",
|
|
61
|
+
"implement",
|
|
62
|
+
"design",
|
|
63
|
+
"setup",
|
|
64
|
+
"configure",
|
|
65
|
+
"migrate",
|
|
66
|
+
"convert",
|
|
67
|
+
"refactor",
|
|
68
|
+
"optimize",
|
|
69
|
+
"fix",
|
|
70
|
+
"update",
|
|
71
|
+
"add",
|
|
72
|
+
"remove",
|
|
73
|
+
"delete",
|
|
74
|
+
"modify",
|
|
75
|
+
"change",
|
|
76
|
+
"replace",
|
|
77
|
+
];
|
|
78
|
+
const stepCount = Math.max(1, actionVerbs.filter((v) => lower.includes(v)).length);
|
|
79
|
+
// Estimate file count from file paths and extensions
|
|
80
|
+
const filePatterns = /[\w-]+\.(ts|js|py|json|md|yaml|yml|tsx|jsx|html|css|sql)/g;
|
|
81
|
+
const fileMatches = userMessage.match(filePatterns) || [];
|
|
82
|
+
const explicitFiles = fileMatches.length;
|
|
83
|
+
// Check for directory patterns
|
|
84
|
+
const dirPatterns = /(?:src|lib|packages|apps|components|hooks|utils|api)\/[\w/-]+/g;
|
|
85
|
+
const dirMatches = userMessage.match(dirPatterns) || [];
|
|
86
|
+
// Count "and", "also", "+" for multi-task indicators
|
|
87
|
+
const multiTaskIndicator = (lower.match(/and also|also|\+/g) || []).length;
|
|
88
|
+
const estimatedFiles = Math.max(1, explicitFiles + dirMatches.length + multiTaskIndicator);
|
|
89
|
+
return {
|
|
90
|
+
stepCount,
|
|
91
|
+
fileCount: estimatedFiles,
|
|
92
|
+
needsResearch: RESEARCH_KEYWORDS.some((k) => lower.includes(k)),
|
|
93
|
+
createsFiles: lower.includes("create") ||
|
|
94
|
+
lower.includes("add") ||
|
|
95
|
+
lower.includes("new"),
|
|
96
|
+
explicitlyComplex: COMPLEX_KEYWORDS.some((k) => lower.includes(k)),
|
|
97
|
+
likelySubtasks: SUBTASK_KEYWORDS.some((k) => lower.includes(k)) ||
|
|
98
|
+
multiTaskIndicator >= 2,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Decide whether to auto-create a todo for the given task
|
|
103
|
+
*/
|
|
104
|
+
export function decideAutoTodo(userMessage, options = {}) {
|
|
105
|
+
const signals = analyzeTaskSignals(userMessage);
|
|
106
|
+
const pendingTasks = getOpenBdIssues().filter((i) => i.status !== "closed");
|
|
107
|
+
const pendingCount = pendingTasks.length;
|
|
108
|
+
// ── Skip Conditions ────────────────────────────────────────────────────
|
|
109
|
+
// Never create todos for these
|
|
110
|
+
const simplePatterns = [
|
|
111
|
+
/^simply\s/i,
|
|
112
|
+
/^just\s/i,
|
|
113
|
+
/^quick\s/i,
|
|
114
|
+
/^can you\s+(grep|find|cat|ls|echo)/i,
|
|
115
|
+
/^(grep|find|cat|ls)\s+[\w.-]+/i,
|
|
116
|
+
/^what('s| is) the\s+\w+\s+\?$/i,
|
|
117
|
+
/^how do i\s+\w+\s*\?$/i,
|
|
118
|
+
];
|
|
119
|
+
if (simplePatterns.some((p) => p.test(userMessage.trim()))) {
|
|
120
|
+
return {
|
|
121
|
+
shouldCreate: false,
|
|
122
|
+
reason: "Simple request (lookup/one-liner)",
|
|
123
|
+
confidence: "high",
|
|
124
|
+
skipReason: "Task is too simple to warrant tracking",
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Check for trivial single actions with no complexity (lower threshold)
|
|
128
|
+
// Allow more tasks to be tracked - being conservative about NOT tracking
|
|
129
|
+
const isTrivial = signals.stepCount === 1 &&
|
|
130
|
+
signals.fileCount <= 1 &&
|
|
131
|
+
!signals.needsResearch &&
|
|
132
|
+
!signals.createsFiles &&
|
|
133
|
+
!signals.explicitlyComplex &&
|
|
134
|
+
pendingCount === 0 &&
|
|
135
|
+
!signals.likelySubtasks;
|
|
136
|
+
if (isTrivial) {
|
|
137
|
+
return {
|
|
138
|
+
shouldCreate: false,
|
|
139
|
+
reason: "Trivial request (single action)",
|
|
140
|
+
confidence: "high",
|
|
141
|
+
skipReason: "Task is trivial",
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// ── Force Modes ──────────────────────────────────────────────────────
|
|
145
|
+
if (options.forceMode) {
|
|
146
|
+
return {
|
|
147
|
+
shouldCreate: true,
|
|
148
|
+
reason: "Force mode enabled",
|
|
149
|
+
confidence: "high",
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (options.skipMode) {
|
|
153
|
+
return {
|
|
154
|
+
shouldCreate: false,
|
|
155
|
+
reason: "Skip mode enabled",
|
|
156
|
+
confidence: "high",
|
|
157
|
+
skipReason: "User requested skip",
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// ── Auto-Create Conditions ──────────────────────────────────────────
|
|
161
|
+
// Be MORE aggressive about tracking tasks - default to tracking
|
|
162
|
+
const reasons = [];
|
|
163
|
+
// HIGH CONFIDENCE: Task explicitly complex
|
|
164
|
+
if (signals.explicitlyComplex) {
|
|
165
|
+
reasons.push("explicitly complex");
|
|
166
|
+
}
|
|
167
|
+
// HIGH CONFIDENCE: Multiple steps (lower from 3 to 2)
|
|
168
|
+
if (signals.stepCount >= 2) {
|
|
169
|
+
reasons.push(`${signals.stepCount} steps implied`);
|
|
170
|
+
}
|
|
171
|
+
// HIGH CONFIDENCE: Multiple files (lower from 3 to 2)
|
|
172
|
+
if (signals.fileCount >= 2) {
|
|
173
|
+
reasons.push(`${signals.fileCount} files involved`);
|
|
174
|
+
}
|
|
175
|
+
// MEDIUM CONFIDENCE: Research needed
|
|
176
|
+
if (signals.needsResearch) {
|
|
177
|
+
reasons.push("needs research");
|
|
178
|
+
}
|
|
179
|
+
// MEDIUM CONFIDENCE: Creates files
|
|
180
|
+
if (signals.createsFiles) {
|
|
181
|
+
reasons.push("creates files");
|
|
182
|
+
}
|
|
183
|
+
// MEDIUM CONFIDENCE: Likely subtasks
|
|
184
|
+
if (signals.likelySubtasks) {
|
|
185
|
+
reasons.push("likely has subtasks");
|
|
186
|
+
}
|
|
187
|
+
// MEDIUM CONFIDENCE: Has pending tasks already (session busy)
|
|
188
|
+
if (pendingCount >= 1) {
|
|
189
|
+
reasons.push(`${pendingCount} pending tasks`);
|
|
190
|
+
}
|
|
191
|
+
// Default to creating todo if any signal present
|
|
192
|
+
// Be conservative only for truly trivial requests (already filtered above)
|
|
193
|
+
if (reasons.length === 0) {
|
|
194
|
+
// No strong signals but not trivial either - track it anyway
|
|
195
|
+
reasons.push("multi-step task detected");
|
|
196
|
+
}
|
|
197
|
+
// Create todo if ANY reason OR any pending tasks
|
|
198
|
+
const shouldCreate = reasons.length >= 1 || pendingCount >= 1;
|
|
199
|
+
return {
|
|
200
|
+
shouldCreate,
|
|
201
|
+
reason: reasons.join(", "),
|
|
202
|
+
confidence: reasons.length >= 2 ? "high" : "medium",
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
// ─── Quick Score ─────────────────────────────────────────────────────────────
|
|
206
|
+
/**
|
|
207
|
+
* Quick numeric score (0-100) for task complexity
|
|
208
|
+
* Higher = more likely to need a todo
|
|
209
|
+
*/
|
|
210
|
+
export function getTaskComplexityScore(userMessage) {
|
|
211
|
+
const signals = analyzeTaskSignals(userMessage);
|
|
212
|
+
const pendingTasks = getOpenBdIssues().filter((i) => i.status !== "closed");
|
|
213
|
+
let score = 0;
|
|
214
|
+
// Step count (0-25)
|
|
215
|
+
score += Math.min(25, signals.stepCount * 8);
|
|
216
|
+
// File count (0-20)
|
|
217
|
+
score += Math.min(20, signals.fileCount * 5);
|
|
218
|
+
// Research needed (0-15)
|
|
219
|
+
if (signals.needsResearch)
|
|
220
|
+
score += 15;
|
|
221
|
+
// Creates files (0-10)
|
|
222
|
+
if (signals.createsFiles)
|
|
223
|
+
score += 10;
|
|
224
|
+
// Explicitly complex (0-20)
|
|
225
|
+
if (signals.explicitlyComplex)
|
|
226
|
+
score += 20;
|
|
227
|
+
// Likely subtasks (0-10)
|
|
228
|
+
if (signals.likelySubtasks)
|
|
229
|
+
score += 10;
|
|
230
|
+
// Pending task overload (0-25)
|
|
231
|
+
const pendingCount = pendingTasks.length;
|
|
232
|
+
if (pendingCount >= 3)
|
|
233
|
+
score += 25;
|
|
234
|
+
else if (pendingCount >= 2)
|
|
235
|
+
score += 15;
|
|
236
|
+
else if (pendingCount >= 1)
|
|
237
|
+
score += 5;
|
|
238
|
+
return Math.min(100, score);
|
|
239
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for todo-bd-sync
|
|
3
|
+
* Two-way sync between rpiv-todo overlay and bd issue tracker
|
|
4
|
+
*/
|
|
5
|
+
// Registry of ID mappings
|
|
6
|
+
export class IdMappingRegistry {
|
|
7
|
+
mappings = new Map(); // todoId -> mapping
|
|
8
|
+
bdMappings = new Map(); // bdId -> todoId
|
|
9
|
+
set(todoId, bdId) {
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
const mapping = {
|
|
12
|
+
todoId,
|
|
13
|
+
bdId,
|
|
14
|
+
createdAt: now,
|
|
15
|
+
lastSync: now,
|
|
16
|
+
};
|
|
17
|
+
this.mappings.set(todoId, mapping);
|
|
18
|
+
this.bdMappings.set(bdId, todoId);
|
|
19
|
+
}
|
|
20
|
+
getByTodoId(todoId) {
|
|
21
|
+
return this.mappings.get(todoId);
|
|
22
|
+
}
|
|
23
|
+
getByBdId(bdId) {
|
|
24
|
+
const todoId = this.bdMappings.get(bdId);
|
|
25
|
+
return todoId !== undefined ? this.mappings.get(todoId) : undefined;
|
|
26
|
+
}
|
|
27
|
+
hasTodoId(todoId) {
|
|
28
|
+
return this.mappings.has(todoId);
|
|
29
|
+
}
|
|
30
|
+
hasBdId(bdId) {
|
|
31
|
+
return this.bdMappings.has(bdId);
|
|
32
|
+
}
|
|
33
|
+
updateLastSync(todoId) {
|
|
34
|
+
const mapping = this.mappings.get(todoId);
|
|
35
|
+
if (mapping) {
|
|
36
|
+
mapping.lastSync = Date.now();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
delete(todoId) {
|
|
40
|
+
const mapping = this.mappings.get(todoId);
|
|
41
|
+
if (mapping) {
|
|
42
|
+
this.bdMappings.delete(mapping.bdId);
|
|
43
|
+
this.mappings.delete(todoId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
getAll() {
|
|
47
|
+
return Array.from(this.mappings.values());
|
|
48
|
+
}
|
|
49
|
+
clear() {
|
|
50
|
+
this.mappings.clear();
|
|
51
|
+
this.bdMappings.clear();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Status mapping between todo and bd
|
|
55
|
+
export const STATUS_MAP = {
|
|
56
|
+
pending: "open",
|
|
57
|
+
in_progress: "in_progress",
|
|
58
|
+
completed: "closed",
|
|
59
|
+
deleted: "closed",
|
|
60
|
+
};
|
|
61
|
+
export const BD_STATUS_MAP = {
|
|
62
|
+
open: "pending",
|
|
63
|
+
in_progress: "in_progress",
|
|
64
|
+
closed: "completed",
|
|
65
|
+
blocked: "pending",
|
|
66
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Estimation
|
|
3
|
+
*
|
|
4
|
+
* Rough token counting for messages and text.
|
|
5
|
+
* Used for context window management before API calls.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Rough token count estimation — conservative (overestimates slightly).
|
|
9
|
+
* Based on average ~3.8 chars/token for English text.
|
|
10
|
+
*/
|
|
11
|
+
export function roughTokenCount(text) {
|
|
12
|
+
if (!text || text.length === 0)
|
|
13
|
+
return 0;
|
|
14
|
+
// Count words as proxy for tokens (more accurate for mixed content)
|
|
15
|
+
const words = text.trim().split(/\s+/).length;
|
|
16
|
+
// Average English token ~1.3 words, overhead for JSON structure
|
|
17
|
+
return Math.ceil(text.length / 3.5) + Math.ceil(words * 0.3);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Rough token count for a structured message.
|
|
21
|
+
* Handles role, content, tool_calls, tool_results, thinking blocks.
|
|
22
|
+
*/
|
|
23
|
+
export function roughMessageTokens(msg) {
|
|
24
|
+
if (!msg)
|
|
25
|
+
return 0;
|
|
26
|
+
let tokens = 0;
|
|
27
|
+
// Role overhead: ~4 tokens per message
|
|
28
|
+
tokens += 4;
|
|
29
|
+
// Content
|
|
30
|
+
if (typeof msg.content === "string") {
|
|
31
|
+
tokens += roughTokenCount(msg.content);
|
|
32
|
+
}
|
|
33
|
+
else if (Array.isArray(msg.content)) {
|
|
34
|
+
for (const block of msg.content) {
|
|
35
|
+
if (block.type === "text" && block.text) {
|
|
36
|
+
tokens += roughTokenCount(block.text);
|
|
37
|
+
}
|
|
38
|
+
else if (block.type === "tool_use" && block.name) {
|
|
39
|
+
// Tool name + JSON input
|
|
40
|
+
tokens += roughTokenCount(block.name);
|
|
41
|
+
if (block.input) {
|
|
42
|
+
tokens += roughTokenCount(JSON.stringify(block.input));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (block.type === "tool_result") {
|
|
46
|
+
// Tool result: estimate 50 tokens overhead + content
|
|
47
|
+
tokens += 50;
|
|
48
|
+
}
|
|
49
|
+
else if (block.type === "image") {
|
|
50
|
+
// Image blocks: ~2000 tokens (Anthropic convention)
|
|
51
|
+
tokens += 2000;
|
|
52
|
+
}
|
|
53
|
+
else if (block.type === "thinking" && block.thinking) {
|
|
54
|
+
tokens += roughTokenCount(block.thinking);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Tool calls (separate from content blocks)
|
|
59
|
+
if (msg.tool_calls && Array.isArray(msg.tool_calls)) {
|
|
60
|
+
for (const tc of msg.tool_calls) {
|
|
61
|
+
tokens += roughTokenCount(tc.name);
|
|
62
|
+
if (tc.input) {
|
|
63
|
+
tokens += roughTokenCount(JSON.stringify(tc.input));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Thinking blocks
|
|
68
|
+
if (msg.thinking) {
|
|
69
|
+
tokens += roughTokenCount(msg.thinking);
|
|
70
|
+
}
|
|
71
|
+
return tokens;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Rough token count for a full message array (API request format).
|
|
75
|
+
*/
|
|
76
|
+
export function roughMessagesTokens(messages) {
|
|
77
|
+
return messages.reduce((sum, msg) => sum + roughMessageTokens(msg), 0);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Estimate tokens for a system prompt string.
|
|
81
|
+
* System prompts typically have overhead from role markers.
|
|
82
|
+
*/
|
|
83
|
+
export function roughSystemPromptTokens(systemPrompt) {
|
|
84
|
+
// System message overhead (~15 tokens for role markers) + content
|
|
85
|
+
return 15 + roughTokenCount(systemPrompt);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Estimate tokens for tool definitions (schema).
|
|
89
|
+
*/
|
|
90
|
+
export function roughToolDefinitionTokens(tool) {
|
|
91
|
+
let tokens = roughTokenCount(tool.name);
|
|
92
|
+
if (tool.description) {
|
|
93
|
+
tokens += roughTokenCount(tool.description);
|
|
94
|
+
}
|
|
95
|
+
if (tool.input_schema) {
|
|
96
|
+
tokens += roughTokenCount(JSON.stringify(tool.input_schema));
|
|
97
|
+
}
|
|
98
|
+
return tokens;
|
|
99
|
+
}
|
|
100
|
+
export function estimateRequestTokens(systemPrompt, messages, tools, maxOutputTokens) {
|
|
101
|
+
const systemPromptTokens = roughSystemPromptTokens(systemPrompt);
|
|
102
|
+
const messagesTokens = roughMessagesTokens(messages);
|
|
103
|
+
const toolsTokens = tools.reduce((sum, tool) => sum + roughToolDefinitionTokens(tool), 0);
|
|
104
|
+
const total = systemPromptTokens + messagesTokens + toolsTokens;
|
|
105
|
+
const availableForContext = maxOutputTokens > 0 ? maxOutputTokens - total : 0;
|
|
106
|
+
return {
|
|
107
|
+
systemPrompt: systemPromptTokens,
|
|
108
|
+
messages: messagesTokens,
|
|
109
|
+
tools: toolsTokens,
|
|
110
|
+
total,
|
|
111
|
+
maxOutputTokens,
|
|
112
|
+
availableForContext,
|
|
113
|
+
};
|
|
114
|
+
}
|