@aurora-foundation/obsidian-next 0.4.7 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/LICENSE +628 -190
- package/README.md +23 -9
- package/dist/auditLog-6WDBDNYL.js +8 -0
- package/dist/auditLog-HGPVDSDC.js +8 -0
- package/dist/auditLog-TDIKFBM4.js +8 -0
- package/dist/auditLog-XC2KY3ZZ.js +8 -0
- package/dist/chunk-2I235WNB.js +133 -0
- package/dist/chunk-2JWDGXTR.js +42 -0
- package/dist/chunk-2NOB6W2B.js +133 -0
- package/dist/chunk-3LFKVKKL.js +7199 -0
- package/dist/chunk-3U6WHPDX.js +4695 -0
- package/dist/chunk-3UCL6RYE.js +7272 -0
- package/dist/chunk-4GN2UQLI.js +130 -0
- package/dist/chunk-4MW33MZD.js +516 -0
- package/dist/chunk-4PUJBUKZ.js +4716 -0
- package/dist/chunk-4QHK6H6O.js +130 -0
- package/dist/chunk-55CQIHCO.js +133 -0
- package/dist/chunk-5LWINFWI.js +676 -0
- package/dist/chunk-5OKGLNQW.js +439 -0
- package/dist/chunk-5T6ETZEO.js +6183 -0
- package/dist/chunk-5WGIFUVL.js +4234 -0
- package/dist/chunk-66EW47T3.js +4237 -0
- package/dist/chunk-6TXUOTT2.js +581 -0
- package/dist/chunk-6YUYSYDA.js +130 -0
- package/dist/chunk-74VPNFMX.js +133 -0
- package/dist/chunk-77CGJRGV.js +6188 -0
- package/dist/chunk-7DS3VT4C.js +7135 -0
- package/dist/chunk-7FHX3VBT.js +133 -0
- package/dist/chunk-7MHF56YU.js +6178 -0
- package/dist/chunk-ABLPMV7G.js +133 -0
- package/dist/chunk-B77K6OQZ.js +687 -0
- package/dist/chunk-BKOXH66O.js +133 -0
- package/dist/chunk-BPP76UN2.js +130 -0
- package/dist/chunk-C4D56GRC.js +5936 -0
- package/dist/chunk-CCDPY4WE.js +370 -0
- package/dist/chunk-CHNVBJN3.js +7272 -0
- package/dist/chunk-CKBZI576.js +7229 -0
- package/dist/chunk-CW5HBSJ2.js +7198 -0
- package/dist/chunk-DGHDJEY7.js +133 -0
- package/dist/chunk-DPNIQWKZ.js +439 -0
- package/dist/chunk-DU4T3V2T.js +214 -0
- package/dist/chunk-DV3WFKNB.js +4679 -0
- package/dist/chunk-DZI2OVN2.js +516 -0
- package/dist/chunk-E45VILML.js +7198 -0
- package/dist/chunk-ECEUUYXC.js +7199 -0
- package/dist/chunk-EJRRSHPW.js +685 -0
- package/dist/chunk-EMBMLZFE.js +370 -0
- package/dist/chunk-EPG5V5OO.js +285 -0
- package/dist/chunk-F2R4HXXW.js +130 -0
- package/dist/chunk-FK6N66ES.js +581 -0
- package/dist/chunk-G3CZKGYA.js +197 -0
- package/dist/chunk-GUUPG4A7.js +7111 -0
- package/dist/chunk-HBAAUGUN.js +7230 -0
- package/dist/chunk-HHFJMK2Q.js +6177 -0
- package/dist/chunk-HINRQTCZ.js +196 -0
- package/dist/chunk-HRKJ3R2U.js +288 -0
- package/dist/chunk-HWVK4CVE.js +439 -0
- package/dist/chunk-JEYSADNZ.js +581 -0
- package/dist/chunk-JNEIL7UN.js +4252 -0
- package/dist/chunk-JTWSK277.js +676 -0
- package/dist/chunk-K4CHTTCJ.js +942 -0
- package/dist/chunk-K7R5KUDS.js +4695 -0
- package/dist/chunk-KNJFOURE.js +7151 -0
- package/dist/chunk-KY22FIT3.js +7256 -0
- package/dist/chunk-L2OTIJSF.js +4228 -0
- package/dist/chunk-LEEBUHP6.js +4655 -0
- package/dist/chunk-LK7UP2T7.js +130 -0
- package/dist/chunk-LPGNO3PK.js +284 -0
- package/dist/chunk-LYQYJMWS.js +133 -0
- package/dist/chunk-MBYFJXR3.js +130 -0
- package/dist/chunk-N3WX44L3.js +130 -0
- package/dist/chunk-N6AQWES3.js +6197 -0
- package/dist/chunk-NW4XSTQZ.js +130 -0
- package/dist/chunk-NWG2XURH.js +130 -0
- package/dist/chunk-O3GF3LJD.js +6142 -0
- package/dist/chunk-OHP5LD3Y.js +6188 -0
- package/dist/chunk-P5PQSFZT.js +6182 -0
- package/dist/chunk-PAADOWNP.js +130 -0
- package/dist/chunk-PERGND7L.js +7213 -0
- package/dist/chunk-PWA7V4XX.js +179 -0
- package/dist/chunk-QGCWEP6L.js +7111 -0
- package/dist/chunk-QVT2IHNJ.js +175 -0
- package/dist/chunk-QZNGYPMS.js +6161 -0
- package/dist/chunk-R6P2E2ZQ.js +207 -0
- package/dist/chunk-ROSDMGIL.js +4679 -0
- package/dist/chunk-RQZP7IKG.js +196 -0
- package/dist/chunk-RUQSPX3U.js +133 -0
- package/dist/chunk-S3BYHP5M.js +130 -0
- package/dist/chunk-S6GNETVE.js +438 -0
- package/dist/chunk-SDT2ZE2R.js +133 -0
- package/dist/chunk-SHQBXJFC.js +6166 -0
- package/dist/chunk-TJNISYTE.js +42 -0
- package/dist/chunk-TJW74HFF.js +130 -0
- package/dist/chunk-TPP72DTK.js +7096 -0
- package/dist/chunk-UOESII6R.js +42 -0
- package/dist/chunk-UWEDGLYJ.js +6142 -0
- package/dist/chunk-V5FYNAFX.js +133 -0
- package/dist/chunk-VPURF6UT.js +7198 -0
- package/dist/chunk-VQH6LWIZ.js +6184 -0
- package/dist/chunk-VS22YVX6.js +7111 -0
- package/dist/chunk-VSF5KBW7.js +367 -0
- package/dist/chunk-VV3JMCKY.js +214 -0
- package/dist/chunk-W5L7HOE3.js +133 -0
- package/dist/chunk-WFEVQISK.js +676 -0
- package/dist/chunk-WJZPSCEP.js +516 -0
- package/dist/chunk-WLV4MKEF.js +16 -0
- package/dist/chunk-WSEVQFFI.js +5428 -0
- package/dist/chunk-X7N2RNR3.js +5428 -0
- package/dist/chunk-XKZNMRNO.js +133 -0
- package/dist/chunk-Y7BVEC36.js +130 -0
- package/dist/chunk-YG7YSNNU.js +4226 -0
- package/dist/chunk-YHM62466.js +261 -0
- package/dist/chunk-YLTYJLDZ.js +7208 -0
- package/dist/chunk-YPMJD4YE.js +56 -0
- package/dist/chunk-YTX3FU2A.js +7199 -0
- package/dist/chunk-ZEQ3EBBN.js +214 -0
- package/dist/chunk-ZIWLQSLK.js +42 -0
- package/dist/chunk-ZJELNTEO.js +516 -0
- package/dist/chunk-ZOSSVNGK.js +370 -0
- package/dist/config-EYK32F2E.js +10 -0
- package/dist/config-FJPPPYTY.js +10 -0
- package/dist/config-VAHPVILX.js +10 -0
- package/dist/context-2YGE4U75.js +10 -0
- package/dist/context-5UFVYKES.js +9 -0
- package/dist/context-ANZF4J72.js +10 -0
- package/dist/context-GLUNCUBQ.js +10 -0
- package/dist/context-M5ULPZKQ.js +10 -0
- package/dist/context-NYOIRZKV.js +10 -0
- package/dist/context-YP2REI6A.js +10 -0
- package/dist/database-MP2JBLMF.js +8 -0
- package/dist/index.js +6177 -4688
- package/dist/keyManager-P2SZONKE.js +8 -0
- package/dist/mcp/index.js +127 -47
- package/dist/memory-BPGJAL4J.js +13 -0
- package/dist/memory-FRQOUI6W.js +13 -0
- package/dist/memory-OAMK27IZ.js +13 -0
- package/dist/memory-OZ734ALL.js +13 -0
- package/dist/memory-PQ2EWRMU.js +13 -0
- package/dist/memory-PXL45M6W.js +13 -0
- package/dist/memory-QZTBTYPH.js +13 -0
- package/dist/migrations-TLJ3WRVW.js +188 -0
- package/dist/resume-2NHDK6EI.js +17 -0
- package/dist/resume-44L2PDB2.js +17 -0
- package/dist/resume-4MXIWUJO.js +7 -0
- package/dist/resume-72VJX66I.js +17 -0
- package/dist/resume-7ZW4XM3B.js +15 -0
- package/dist/resume-AZHYQ657.js +17 -0
- package/dist/resume-CNLXSYHV.js +17 -0
- package/dist/resume-DPN4Q777.js +16 -0
- package/dist/resume-DSFHVNPI.js +15 -0
- package/dist/resume-GHLQJJTO.js +17 -0
- package/dist/resume-HJ6SBWTF.js +17 -0
- package/dist/resume-HRLYHY2L.js +17 -0
- package/dist/resume-ISIQFKO6.js +17 -0
- package/dist/resume-JQDEA6PS.js +15 -0
- package/dist/resume-KP3Y3Y7P.js +17 -0
- package/dist/resume-M4KHR5OI.js +17 -0
- package/dist/resume-N62OAMBG.js +17 -0
- package/dist/resume-NNMA5POT.js +17 -0
- package/dist/resume-ODYT3J4H.js +17 -0
- package/dist/resume-PCFJXA5O.js +17 -0
- package/dist/resume-PLF4XGBD.js +15 -0
- package/dist/resume-Q2PFX57V.js +17 -0
- package/dist/resume-QB4XI2J5.js +17 -0
- package/dist/resume-R5MFTUPF.js +17 -0
- package/dist/resume-SVA7223Z.js +17 -0
- package/dist/resume-TYKKDJZI.js +17 -0
- package/dist/resume-XIS45HKV.js +17 -0
- package/dist/resume-YCSEJTU7.js +17 -0
- package/dist/resume-YD76GI2J.js +15 -0
- package/dist/resume-YDN7EL77.js +17 -0
- package/dist/resume-YE7DB4ZA.js +17 -0
- package/dist/resume-YKAKOXWV.js +15 -0
- package/dist/resume-ZHBCVFDY.js +17 -0
- package/dist/scheduler-2CK24A2Q.js +14 -0
- package/dist/scheduler-7OAF2XKX.js +14 -0
- package/dist/scheduler-AS23AAB5.js +14 -0
- package/dist/scheduler-PCOYQJA5.js +14 -0
- package/dist/scheduler-V2ECBQPK.js +14 -0
- package/dist/scheduler-VEWZ6L7V.js +13 -0
- package/dist/scheduler-W37QMGDQ.js +14 -0
- package/dist/session-2E2JKPD7.js +15 -0
- package/dist/session-2VSF257B.js +14 -0
- package/dist/session-4APFTDJU.js +14 -0
- package/dist/session-5YS5LNNL.js +16 -0
- package/dist/session-6MO5ZPOB.js +16 -0
- package/dist/session-6XMGPRTQ.js +14 -0
- package/dist/session-7DJR77R7.js +16 -0
- package/dist/session-7DQHPWTR.js +14 -0
- package/dist/session-ADKIQCR5.js +16 -0
- package/dist/session-AOGH2GGI.js +16 -0
- package/dist/session-C4W6GDYG.js +16 -0
- package/dist/session-DCGNGGMV.js +14 -0
- package/dist/session-F5JKZAN2.js +16 -0
- package/dist/session-G6F3O2FQ.js +16 -0
- package/dist/session-GFBSARRO.js +16 -0
- package/dist/session-H5IWAIUI.js +16 -0
- package/dist/session-IPFA6AHC.js +14 -0
- package/dist/session-IWG2UOAX.js +14 -0
- package/dist/session-KJ2K4Y4M.js +14 -0
- package/dist/session-KPXFBW6Q.js +14 -0
- package/dist/session-KR256UL5.js +16 -0
- package/dist/session-M72LJXPR.js +16 -0
- package/dist/session-MBK3FODN.js +14 -0
- package/dist/session-MOUFAU7G.js +16 -0
- package/dist/session-NRC6ZXFQ.js +16 -0
- package/dist/session-NRPQMV4K.js +16 -0
- package/dist/session-O5IFFJZQ.js +14 -0
- package/dist/session-OF5BGKDE.js +16 -0
- package/dist/session-OGRZMIM7.js +14 -0
- package/dist/session-OJOFAJG3.js +16 -0
- package/dist/session-OKU4N3SP.js +16 -0
- package/dist/session-P2VAOSFB.js +14 -0
- package/dist/session-PKOVZD4M.js +16 -0
- package/dist/session-POAIMUVN.js +16 -0
- package/dist/session-PSHFONFE.js +16 -0
- package/dist/session-QKYVVZFV.js +16 -0
- package/dist/session-QPWGBMUS.js +14 -0
- package/dist/session-R5UG5PZR.js +14 -0
- package/dist/session-RAY6BZRQ.js +16 -0
- package/dist/session-S3VATHMU.js +16 -0
- package/dist/session-SYTD7RHW.js +14 -0
- package/dist/session-UHMMVO4J.js +16 -0
- package/dist/session-WEX5K3ZY.js +14 -0
- package/dist/session-XFLOXGU3.js +14 -0
- package/dist/session-XV2A4HHG.js +14 -0
- package/dist/settings-3VPJYD4D.js +8 -0
- package/dist/settings-GZTJJTBK.js +8 -0
- package/dist/settings-YKJFSKMO.js +8 -0
- package/dist/shell-FM34624T.js +8 -0
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
5
|
-
> This README was written by Obsidian (v0.4.
|
|
5
|
+
> This README was written by Obsidian (v0.4.8) - a global, always-on autonomous engineering daemon with adaptive reasoning and system-wide persistent memory.
|
|
6
6
|
|
|
7
|
-
[](LICENSE)
|
|
8
|
+
[](package.json)
|
|
9
|
+
[](#core-capabilities)
|
|
9
10
|
[](CHANGELOG.md)
|
|
10
|
-
[](docs/PRD.md)
|
|
11
11
|
|
|
12
12
|
**Obsidian Next** is a global, always-on autonomous engineering partner. It runs as a system-wide background service, managing multiple codebases and performing proactive engineering tasks while you're away.
|
|
13
13
|
|
|
@@ -20,6 +20,7 @@ Built for engineers who need an agent that lives in their system - not just in a
|
|
|
20
20
|
| Feature | Obsidian Next | Other Assistants |
|
|
21
21
|
|---------|---------------|------------------|
|
|
22
22
|
| **Lifecycle** | Always-on Daemon (Service) | Script / Process-bound |
|
|
23
|
+
| **Intelligence** | Adaptive Multi-Provider Engine | Single Model / Provider |
|
|
23
24
|
| **Reasoning** | Claude 4.6 Adaptive Thinking | Standard Chat |
|
|
24
25
|
| **Context** | 1 Million Token Mastery | 128k - 200k fixed |
|
|
25
26
|
| **Memory** | Semantic Vector Store (Hybrid) | Simple Chat History |
|
|
@@ -48,11 +49,11 @@ obsidian status
|
|
|
48
49
|
### Always-On Autonomy
|
|
49
50
|
Obsidian runs as a background service (`launchd` or `systemd`). It doesn't die when you close your terminal. It keeps reasoning, indexing, and auditing in the background.
|
|
50
51
|
|
|
51
|
-
###
|
|
52
|
-
|
|
52
|
+
### Adaptive Multi-Provider Engine
|
|
53
|
+
Seamlessly switch between Anthropic Claude 4.6 and local Ollama models. Obsidian intelligently routes tasks based on complexity, cost, and availability.
|
|
53
54
|
|
|
54
55
|
### 1M Token Context window
|
|
55
|
-
Hold entire repositories in active memory. Obsidian uses
|
|
56
|
+
Hold entire repositories in active memory. Obsidian uses Prompt Caching and Context Distillation to keep massive windows cheap, fast, and coherent.
|
|
56
57
|
|
|
57
58
|
### Proactive Heartbeat (The Scheduler)
|
|
58
59
|
Schedule background tasks to keep your systems healthy:
|
|
@@ -83,6 +84,19 @@ Obsidian can autonomously expand its own toolbox. If it hits a capability gap, i
|
|
|
83
84
|
|
|
84
85
|
---
|
|
85
86
|
|
|
87
|
+
## Keyboard Shortcuts
|
|
88
|
+
|
|
89
|
+
| Shortcut | Action |
|
|
90
|
+
|----------|-------------|
|
|
91
|
+
| `Shift+Tab`| Cycle between Direct, Plan, and Safe modes |
|
|
92
|
+
| `PageUp` | Scroll up through chat history |
|
|
93
|
+
| `PageDown` | Scroll down through chat history |
|
|
94
|
+
| `Ctrl+T` | Open/close Task View |
|
|
95
|
+
| `Ctrl+K` | Open Command Palette |
|
|
96
|
+
| `Escape` | Interrupt active agent execution |
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
86
100
|
## Architecture (The Gateway Pattern)
|
|
87
101
|
|
|
88
102
|
Obsidian Next operates via a central backend service connected to multiple frontends:
|
|
@@ -98,7 +112,7 @@ graph TD
|
|
|
98
112
|
subgraph "Always-On Daemon (Backend)"
|
|
99
113
|
Socket[Unix Domain Socket] <--> LaneQueue[Lane Queue]
|
|
100
114
|
LaneQueue <--> Agent[Agent Core]
|
|
101
|
-
Agent <-->
|
|
115
|
+
Agent <--> MultiProvider[Multi-Provider Engine]
|
|
102
116
|
Agent <--> Tools[Self-Improving Tools]
|
|
103
117
|
end
|
|
104
118
|
|
|
@@ -148,4 +162,4 @@ npm test # Full suite (vitest)
|
|
|
148
162
|
|
|
149
163
|
## License
|
|
150
164
|
|
|
151
|
-
Copyright 2026 Aurora Foundation. Licensed under [
|
|
165
|
+
Copyright 2026 Aurora Foundation. Licensed under [AGPL-3.0](LICENSE).
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
history,
|
|
3
|
+
session,
|
|
4
|
+
tasks
|
|
5
|
+
} from "./chunk-VQH6LWIZ.js";
|
|
6
|
+
import {
|
|
7
|
+
context
|
|
8
|
+
} from "./chunk-DPNIQWKZ.js";
|
|
9
|
+
import {
|
|
10
|
+
bus
|
|
11
|
+
} from "./chunk-WQM6FFSD.js";
|
|
12
|
+
|
|
13
|
+
// src/commands/resume.ts
|
|
14
|
+
import path from "path";
|
|
15
|
+
var resumeCommand = async (args) => {
|
|
16
|
+
if (args[0] === "--delete" || args[0] === "-d") {
|
|
17
|
+
const sessionId = args[1];
|
|
18
|
+
if (!sessionId) {
|
|
19
|
+
bus.emitAgent({
|
|
20
|
+
type: "error",
|
|
21
|
+
message: "Usage: /resume --delete <session_id>"
|
|
22
|
+
});
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const deleted = await session.delete(sessionId);
|
|
26
|
+
if (deleted) {
|
|
27
|
+
bus.emitAgent({
|
|
28
|
+
type: "done",
|
|
29
|
+
summary: `Session ${sessionId} deleted.`
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
bus.emitAgent({
|
|
33
|
+
type: "error",
|
|
34
|
+
message: `Session ${sessionId} not found.`
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (args[0] === "--last" || args[0] === "-l") {
|
|
40
|
+
const sessions = await session.list();
|
|
41
|
+
if (sessions.length === 0) {
|
|
42
|
+
bus.emitAgent({
|
|
43
|
+
type: "error",
|
|
44
|
+
message: "No saved sessions found."
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
args[0] = sessions[0].id;
|
|
49
|
+
}
|
|
50
|
+
if (!args[0]) {
|
|
51
|
+
const sessions = await session.list();
|
|
52
|
+
if (sessions.length === 0) {
|
|
53
|
+
bus.emitAgent({
|
|
54
|
+
type: "thought",
|
|
55
|
+
content: "No saved sessions found.\n\nSessions are created when you run /exit."
|
|
56
|
+
});
|
|
57
|
+
bus.emitAgent({
|
|
58
|
+
type: "done",
|
|
59
|
+
summary: "No sessions available."
|
|
60
|
+
});
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const content2 = [
|
|
64
|
+
"Saved Session Registry",
|
|
65
|
+
...sessions.slice(0, 10).map((s) => {
|
|
66
|
+
const date = new Date(s.savedAt);
|
|
67
|
+
const dateStr = date.toLocaleDateString();
|
|
68
|
+
const timeStr = date.toLocaleTimeString([], {
|
|
69
|
+
hour: "2-digit",
|
|
70
|
+
minute: "2-digit"
|
|
71
|
+
});
|
|
72
|
+
const workspaceName = path.basename(s.workspace);
|
|
73
|
+
return [
|
|
74
|
+
` \u23BF [${s.id}]`,
|
|
75
|
+
` \u23BF Date ${dateStr} ${timeStr}`,
|
|
76
|
+
` \u23BF Workspace ${workspaceName}`,
|
|
77
|
+
s.task ? ` \u23BF Task ${s.task}` : null,
|
|
78
|
+
` \u23BF Activity ${s.filesModified} files handled`,
|
|
79
|
+
""
|
|
80
|
+
].filter(Boolean).join("\n");
|
|
81
|
+
}),
|
|
82
|
+
sessions.length > 10 ? ` ... and ${sessions.length - 10} more sessions
|
|
83
|
+
` : "",
|
|
84
|
+
" [Usage]",
|
|
85
|
+
" \u23BF /resume <id> Restore session",
|
|
86
|
+
" \u23BF /resume --last Restore latest",
|
|
87
|
+
""
|
|
88
|
+
].join("\n");
|
|
89
|
+
bus.emitAgent({
|
|
90
|
+
type: "thought",
|
|
91
|
+
content: content2
|
|
92
|
+
});
|
|
93
|
+
bus.emitAgent({
|
|
94
|
+
type: "done",
|
|
95
|
+
summary: `${sessions.length} session(s) available.`
|
|
96
|
+
});
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const sessionIdArg = args[0];
|
|
100
|
+
const result = await session.restore(sessionIdArg);
|
|
101
|
+
if (!result.success) {
|
|
102
|
+
bus.emitAgent({
|
|
103
|
+
type: "error",
|
|
104
|
+
message: result.error || "Failed to restore session"
|
|
105
|
+
});
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const currentTask = tasks.get();
|
|
109
|
+
const currentContext = context.get();
|
|
110
|
+
const content = [
|
|
111
|
+
"Session Restored Successfully",
|
|
112
|
+
` \u23BF ID ${sessionIdArg}`,
|
|
113
|
+
` \u23BF Root ${path.basename(process.cwd())}`,
|
|
114
|
+
"",
|
|
115
|
+
" [Restored State]",
|
|
116
|
+
` \u23BF Context ${currentContext.files_read.length} files in set`,
|
|
117
|
+
` \u23BF History ${(await history.load()).length} events rehydrated`,
|
|
118
|
+
` \u23BF Task ${currentTask?.title || "None"}`,
|
|
119
|
+
""
|
|
120
|
+
].join("\n");
|
|
121
|
+
bus.emitAgent({
|
|
122
|
+
type: "thought",
|
|
123
|
+
content
|
|
124
|
+
});
|
|
125
|
+
bus.emitAgent({
|
|
126
|
+
type: "done",
|
|
127
|
+
summary: `Session ${sessionIdArg} restored.`
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export {
|
|
132
|
+
resumeCommand
|
|
133
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {
|
|
2
|
+
session
|
|
3
|
+
} from "./chunk-3UCL6RYE.js";
|
|
4
|
+
import {
|
|
5
|
+
bus
|
|
6
|
+
} from "./chunk-WQM6FFSD.js";
|
|
7
|
+
|
|
8
|
+
// src/commands/resume.ts
|
|
9
|
+
async function resumeCommand(args) {
|
|
10
|
+
if (args.length > 0) {
|
|
11
|
+
const sessionId = args[0];
|
|
12
|
+
try {
|
|
13
|
+
const result = await session.restore(sessionId);
|
|
14
|
+
if (result.success) {
|
|
15
|
+
bus.emitAgent({
|
|
16
|
+
type: "thought",
|
|
17
|
+
content: `Resumed session: ${sessionId}`
|
|
18
|
+
});
|
|
19
|
+
} else {
|
|
20
|
+
bus.emitAgent({
|
|
21
|
+
type: "error",
|
|
22
|
+
message: `Failed to resume session: ${result.error}`
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
} catch (err) {
|
|
26
|
+
bus.emitAgent({
|
|
27
|
+
type: "error",
|
|
28
|
+
message: `Error resuming session: ${err}`
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
bus.emitAgent({
|
|
34
|
+
type: "view_request",
|
|
35
|
+
viewId: "sessions",
|
|
36
|
+
command: "resume"
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export {
|
|
41
|
+
resumeCommand
|
|
42
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import {
|
|
2
|
+
history,
|
|
3
|
+
session,
|
|
4
|
+
tasks
|
|
5
|
+
} from "./chunk-SHQBXJFC.js";
|
|
6
|
+
import {
|
|
7
|
+
context
|
|
8
|
+
} from "./chunk-DPNIQWKZ.js";
|
|
9
|
+
import {
|
|
10
|
+
bus
|
|
11
|
+
} from "./chunk-WQM6FFSD.js";
|
|
12
|
+
|
|
13
|
+
// src/commands/resume.ts
|
|
14
|
+
import path from "path";
|
|
15
|
+
var resumeCommand = async (args) => {
|
|
16
|
+
if (args[0] === "--delete" || args[0] === "-d") {
|
|
17
|
+
const sessionId = args[1];
|
|
18
|
+
if (!sessionId) {
|
|
19
|
+
bus.emitAgent({
|
|
20
|
+
type: "error",
|
|
21
|
+
message: "Usage: /resume --delete <session_id>"
|
|
22
|
+
});
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const deleted = await session.delete(sessionId);
|
|
26
|
+
if (deleted) {
|
|
27
|
+
bus.emitAgent({
|
|
28
|
+
type: "done",
|
|
29
|
+
summary: `Session ${sessionId} deleted.`
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
bus.emitAgent({
|
|
33
|
+
type: "error",
|
|
34
|
+
message: `Session ${sessionId} not found.`
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (args[0] === "--last" || args[0] === "-l") {
|
|
40
|
+
const sessions = await session.list();
|
|
41
|
+
if (sessions.length === 0) {
|
|
42
|
+
bus.emitAgent({
|
|
43
|
+
type: "error",
|
|
44
|
+
message: "No saved sessions found."
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
args[0] = sessions[0].id;
|
|
49
|
+
}
|
|
50
|
+
if (!args[0]) {
|
|
51
|
+
const sessions = await session.list();
|
|
52
|
+
if (sessions.length === 0) {
|
|
53
|
+
bus.emitAgent({
|
|
54
|
+
type: "thought",
|
|
55
|
+
content: "No saved sessions found.\n\nSessions are created when you run /exit."
|
|
56
|
+
});
|
|
57
|
+
bus.emitAgent({
|
|
58
|
+
type: "done",
|
|
59
|
+
summary: "No sessions available."
|
|
60
|
+
});
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const content2 = [
|
|
64
|
+
"Saved Session Registry",
|
|
65
|
+
...sessions.slice(0, 10).map((s) => {
|
|
66
|
+
const date = new Date(s.savedAt);
|
|
67
|
+
const dateStr = date.toLocaleDateString();
|
|
68
|
+
const timeStr = date.toLocaleTimeString([], {
|
|
69
|
+
hour: "2-digit",
|
|
70
|
+
minute: "2-digit"
|
|
71
|
+
});
|
|
72
|
+
const workspaceName = path.basename(s.workspace);
|
|
73
|
+
return [
|
|
74
|
+
` \u23BF [${s.id}]`,
|
|
75
|
+
` \u23BF Date ${dateStr} ${timeStr}`,
|
|
76
|
+
` \u23BF Workspace ${workspaceName}`,
|
|
77
|
+
s.task ? ` \u23BF Task ${s.task}` : null,
|
|
78
|
+
` \u23BF Activity ${s.filesModified} files handled`,
|
|
79
|
+
""
|
|
80
|
+
].filter(Boolean).join("\n");
|
|
81
|
+
}),
|
|
82
|
+
sessions.length > 10 ? ` ... and ${sessions.length - 10} more sessions
|
|
83
|
+
` : "",
|
|
84
|
+
" [Usage]",
|
|
85
|
+
" \u23BF /resume <id> Restore session",
|
|
86
|
+
" \u23BF /resume --last Restore latest",
|
|
87
|
+
""
|
|
88
|
+
].join("\n");
|
|
89
|
+
bus.emitAgent({
|
|
90
|
+
type: "thought",
|
|
91
|
+
content: content2
|
|
92
|
+
});
|
|
93
|
+
bus.emitAgent({
|
|
94
|
+
type: "done",
|
|
95
|
+
summary: `${sessions.length} session(s) available.`
|
|
96
|
+
});
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const sessionIdArg = args[0];
|
|
100
|
+
const result = await session.restore(sessionIdArg);
|
|
101
|
+
if (!result.success) {
|
|
102
|
+
bus.emitAgent({
|
|
103
|
+
type: "error",
|
|
104
|
+
message: result.error || "Failed to restore session"
|
|
105
|
+
});
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const currentTask = tasks.get();
|
|
109
|
+
const currentContext = context.get();
|
|
110
|
+
const content = [
|
|
111
|
+
"Session Restored Successfully",
|
|
112
|
+
` \u23BF ID ${sessionIdArg}`,
|
|
113
|
+
` \u23BF Root ${path.basename(process.cwd())}`,
|
|
114
|
+
"",
|
|
115
|
+
" [Restored State]",
|
|
116
|
+
` \u23BF Context ${currentContext.files_read.length} files in set`,
|
|
117
|
+
` \u23BF History ${(await history.load()).length} events rehydrated`,
|
|
118
|
+
` \u23BF Task ${currentTask?.title || "None"}`,
|
|
119
|
+
""
|
|
120
|
+
].join("\n");
|
|
121
|
+
bus.emitAgent({
|
|
122
|
+
type: "thought",
|
|
123
|
+
content
|
|
124
|
+
});
|
|
125
|
+
bus.emitAgent({
|
|
126
|
+
type: "done",
|
|
127
|
+
summary: `Session ${sessionIdArg} restored.`
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export {
|
|
132
|
+
resumeCommand
|
|
133
|
+
};
|