Skip to content

Commit ab484a7

Browse files
authored
feat: make Notes durable and Photon channel-free (#13)
Keep active Markdown drafts stable across shell and service-worker updates, add formatting and a cleaner Notes workspace, and constrain long channel headers. Replace Photon mappings with private Captain-to-Skipper Texts conversations that can move between phone and desktop without echoing desktop-only turns. Release as 0.0.11 with migration, browser, isolation, and packaging pins updated. Signed-off-by: Joseph Yaksich <gitcommit90@users.noreply.github.com> Co-authored-by: Joseph Yaksich <gitcommit90@users.noreply.github.com>
1 parent 88c1b0c commit ab484a7

25 files changed

Lines changed: 612 additions & 248 deletions

CHANGELOG.md

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.0.11] - 2026-07-26
11+
12+
### Added
13+
14+
- Notes now include a focused Markdown toolbar for headings, bold, italic,
15+
lists, code, and links, plus Write and Preview modes that render the current
16+
unsaved draft.
17+
- Configured Photon workspaces now show a private **Texts** tab only in the
18+
Captain's personal `#main`. It lists every Skipper conversation, preserves
19+
each thread, and lets the Captain select, resume, and continue it on desktop.
20+
1021
### Changed
1122

23+
- Notes use a cleaner searchable sidebar, friendly titles without a visible
24+
`.md` suffix, and a more spacious editor layout.
25+
- Photon is now channel-agnostic: the configured Captain phone always texts
26+
Skipper, one conversation remains current until `/new`, and legacy mapped
27+
conversations move to the Captain's private Texts inbox during migration.
28+
Desktop continuations share the same context without echoing to iMessage;
29+
returning to the phone continues the conversation selected on desktop.
1230
- GitHub Releases now require the complete numbered acceptance ledger from a
1331
multi-item request, plus artifact and verification evidence. Generated
1432
commit summaries can no longer replace the user-facing change list.
1533
- The retained Apple Silicon release host now owns the complete macOS path:
1634
clean build, signing, notarization, public-download installation, launch,
1735
smoke verification, and Application Support preservation.
1836

37+
### Fixed
38+
39+
- New notes accept titles with or without `.md`, add the suffix when omitted,
40+
and reject another extension with a corrected `.md` suggestion.
41+
- Theme, reconnect, and service-worker update refreshes no longer discard or
42+
replace the active Notes editor. The exact editor node, unsaved draft, focus,
43+
selection, and preview state survive shell rebuilds.
44+
- Long channel descriptions remain single-line and truncated at narrower
45+
desktop widths instead of expanding the top bar into a one-character column.
46+
- Newly provisioned residents prefer an unused character/color avatar
47+
combination, eliminating stochastic duplicate identities in small fleets.
48+
- Photon content is excluded from channel Chat, channel/global Threads, Board,
49+
and unread counts, and the obsolete resident Photon tools and mapping UI are
50+
removed.
51+
1952
## [0.0.10] - 2026-07-25
2053

2154
### Fixed
@@ -301,7 +334,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
301334
notarization, stapled tickets, Gatekeeper verification, persistent
302335
Application Support, and isolated Apple container machines.
303336

304-
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.10...HEAD
337+
[Unreleased]: https://github.com/gitcommit90/1Helm/compare/v0.0.11...HEAD
338+
[0.0.11]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.11
305339
[0.0.10]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.10
306340
[0.0.9]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.9
307341
[0.0.8]: https://github.com/gitcommit90/1Helm/releases/tag/v0.0.8

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,10 @@ keys per member.
196196

197197
Connections are host-owned brokers, not secrets copied into every resident's
198198
shell. Gmail exposes scoped account listing, search, read, and draft creation;
199-
sending remains disabled by default. Photon maps allowlisted inbound iMessage
200-
threads to a resident and permits narrow replies in an already-authorized
201-
conversation. Provider, Gmail, and Photon credentials stay on the host.
199+
sending remains disabled by default. Photon gives the Captain one direct line
200+
to Skipper: every text stays in a private Texts thread until `/new`, and that
201+
same context can continue on desktop without echoing desktop-only turns back to
202+
iMessage. Provider, Gmail, and Photon credentials stay on the host.
202203

203204
New connection types have to earn their place with least-privilege scoping,
204205
secret isolation, reconnect and recovery, deduplication, deterministic tests,
@@ -256,7 +257,7 @@ A fresh data directory opens first-run setup. The source runtime defaults to
256257
| `PORT` | `8123` | HTTP/WebSocket control-plane port. |
257258
| `CTRL_DATA_DIR` | `./data` | Databases, routing state, uploads, and narrow workspace mirrors. |
258259
| `HELM_CHANNEL_COMPUTER_BACKEND` | `apple` on macOS, `lxc` on Linux, `wsl` on Windows | Host isolation backend; `native` and `mock` are explicit development/test overrides. |
259-
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.10` | Versioned channel-machine image contract. |
260+
| `HELM_CHANNEL_MACHINE_IMAGE` | `local/1helm-channel-machine:0.0.11` | Versioned channel-machine image contract. |
260261

261262
### Agent-first JSON CLI
262263

docs/RELIABILITY.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@ ownership, recovery, and tests rather than depend on a prompt alone.
5959
- Delivery state records pending, attempting, delivered, failed, or uncertain.
6060
A restart may resume a never-attempted reply. An interrupted attempt is
6161
surfaced as uncertain and is not blindly replayed into a duplicate.
62-
- An external message received through Photon defaults to the Captain's
63-
`#main`/Skipper mapping, invokes the mapped partner, and returns the final
64-
response to the originating authorized conversation.
62+
- An external message received through Photon is private Captain ↔ Skipper
63+
state. It appears only in `#main` Texts, returns the final response to the
64+
originating phone conversation, and continues until the Captain sends
65+
`/new`; desktop continuations share context without producing iMessage echo.
6566
- Timers, recurring workflows, long-running follow-ups, and connector replies
6667
are durable obligations. Sleep, restart, or a closed renderer must not erase
6768
them.

docs/USER_GUIDE.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -248,15 +248,16 @@ running on that host.
248248
## Photon / iMessage
249249

250250
Connections guides Photon device authorization, project setup, secret rotation,
251-
phone registration, sidecar health, and conversation mapping. The first mapping
252-
defaults to the Captain's `#main` and Skipper.
253-
254-
An allowlisted inbound text creates a real 1Helm thread, invokes the mapped
255-
agent, retains its reply in 1Helm, and sends that final reply to the exact inbound
256-
conversation once. If the agent explicitly uses `photon_send`, the automatic
257-
return suppresses its duplicate. New unrelated outbound destinations remain
258-
blocked unless explicitly granted. Rich attachment fidelity is not yet part of
259-
the verified contract.
251+
phone registration, and sidecar health. There are no channel mappings: the
252+
Captain's configured phone always talks directly to Skipper.
253+
254+
The first inbound text creates a private conversation in `#main`'s **Texts**
255+
tab. Phone messages and Skipper's iMessage replies are retained there, and the
256+
conversation keeps one context across connector restarts and Photon space-ID
257+
changes until the Captain sends `/new`. The Captain can continue the same
258+
thread inside 1Helm and return to the phone later; desktop-only turns stay in
259+
1Helm rather than being replayed as iMessages. Rich attachment fidelity is not
260+
yet part of the verified contract.
260261

261262
## Workflows, follow-ups, and computer care
262263

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "1helm",
33
"productName": "1Helm",
4-
"version": "0.0.10",
4+
"version": "0.0.11",
55
"private": true,
66
"type": "module",
77
"license": "AGPL-3.0-only",

public/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@
2929
document.querySelectorAll('meta[name="theme-color"]').forEach(function (m) { m.setAttribute("content", color); });
3030
})();
3131
</script>
32-
<link rel="stylesheet" href="/app.css?v=e7e858bbd30c" />
32+
<link rel="stylesheet" href="/app.css?v=a96cb46611b7" />
3333
<link rel="stylesheet" href="/bundle.css" />
3434
</head>
3535
<body class="h-screen w-screen overflow-hidden antialiased">
3636
<div id="app" class="h-full w-full"></div>
37-
<script type="module" src="/bundle.js?v=de7765eea23f"></script>
37+
<script type="module" src="/bundle.js?v=f02f841b8e70"></script>
3838
</body>
3939
</html>

src/client/api.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export type AgentQuestions = {
1313
answers?: Array<{ question_id: string; question: string; values: string[]; custom: string }> | null;
1414
answered?: number | null;
1515
};
16-
export type Message = { id: number; channel_id: number; parent_id: number | null; body: string; created: number; reply_count: number; last_reply: number | null; author: Author; attachments: Attachment[]; progress?: AgentProgress[]; questions?: AgentQuestions | null };
16+
export type Message = { id: number; channel_id: number; parent_id: number | null; body: string; created: number; reply_count: number; last_reply: number | null; author: Author; attachments: Attachment[]; progress?: AgentProgress[]; questions?: AgentQuestions | null; photon_conversation_id?: number | null; transport?: "inbound" | "outbound" | "app" };
1717
export type ModelPolicy = { provider_id: number | null; provider_name: string | null; provider_kind: string | null; model: string; overridden: boolean; editable: boolean };
1818
export type ResidentAgent = {
1919
id: number; bot_id: number; kind: "channel" | "skipper"; name: string; display_name: string;
@@ -57,6 +57,7 @@ export type ThreadState = {
5757
followup?: ThreadFollowup | null;
5858
};
5959
export type GlobalThread = ThreadState & { channel_name: string; channel_slug: string; unread: boolean };
60+
export type TextConversation = { id: number; sender: string; root_message_id: number; thread_id: number; active: number; started: number; updated: number; closed?: number | null; title: string; summary: string; status: string; last_body?: string; message_count?: number; messages?: Message[] };
6061
export type ChannelFile = { path: string; name: string; size: number; modified: number; kind: "file" | "directory" };
6162
export type MemoryItem = { id: number; channel_id: number; thread_id: number | null; root_message_id?: number | null; kind: "summary" | "decision" | "fact" | "preference" | "artifact_ref"; content: string; author_type: string; scope: string; status: "current" | "superseded"; created: number };
6263
export type ActivityItem = {

0 commit comments

Comments
 (0)