samagotchi 0.148.0 → 0.150.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.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -1
  3. data/README.md +4 -2
  4. data/docs/architecture.md +3 -3
  5. data/docs/bundles.md +38 -1
  6. data/docs/cli.md +76 -24
  7. data/docs/configuration.md +8 -6
  8. data/docs/guardrails.md +2 -1
  9. data/docs/hooks.md +2 -1
  10. data/docs/internals/background-tasks.md +1 -1
  11. data/docs/internals/bridge.md +8 -0
  12. data/docs/internals/bundles.md +42 -14
  13. data/docs/internals/objectives.md +269 -0
  14. data/docs/internals/web-frontend.md +4 -1
  15. data/docs/internals/web-push.md +2 -2
  16. data/docs/internals/working-set.md +5 -2
  17. data/docs/memory.md +47 -9
  18. data/docs/plugins.md +10 -2
  19. data/docs/releasing.md +1 -1
  20. data/docs/sessions.md +45 -2
  21. data/docs/system-one.md +17 -1
  22. data/docs/testing.md +5 -0
  23. data/lib/samagotchi/atomic_file.rb +3 -0
  24. data/lib/samagotchi/bootstrap_command.rb +5 -2
  25. data/lib/samagotchi/bridge/card_store.rb +52 -7
  26. data/lib/samagotchi/bridge.rb +1 -1
  27. data/lib/samagotchi/bundle_command.rb +91 -68
  28. data/lib/samagotchi/bundler_env.rb +24 -0
  29. data/lib/samagotchi/bundles/coordinator/manifest.yml +6 -4
  30. data/lib/samagotchi/bundles/coordinator/plugin.rb +3 -2
  31. data/lib/samagotchi/bundles/coordinator/skill_coordinator.md +9 -0
  32. data/lib/samagotchi/bundles/decision-card/manifest.yml +13 -0
  33. data/lib/samagotchi/bundles/decision-card/plugin.rb +280 -0
  34. data/lib/samagotchi/bundles/dev/manifest.yml +3 -2
  35. data/lib/samagotchi/bundles/github-pr/manifest.yml +3 -3
  36. data/lib/samagotchi/bundles/github-pr/plugin.rb +2 -1
  37. data/lib/samagotchi/bundles/known-names/hooks/known_names.rb +3 -1
  38. data/lib/samagotchi/bundles/known-names/manifest.yml +3 -2
  39. data/lib/samagotchi/bundles/source-links/hooks/source_links.rb +2 -2
  40. data/lib/samagotchi/bundles/source-links/manifest.yml +3 -3
  41. data/lib/samagotchi/bundles/system/manifest.yml +3 -3
  42. data/lib/samagotchi/bundles/system/memory_guide.md +5 -5
  43. data/lib/samagotchi/bundles/system/self_map.md +1 -1
  44. data/lib/samagotchi/chi_home.rb +4 -2
  45. data/lib/samagotchi/chi_shim.rb +2 -1
  46. data/lib/samagotchi/child_env.rb +10 -3
  47. data/lib/samagotchi/config.rb +7 -1
  48. data/lib/samagotchi/context_note.rb +17 -5
  49. data/lib/samagotchi/engine.rb +113 -6
  50. data/lib/samagotchi/engine_peers.rb +11 -0
  51. data/lib/samagotchi/git_env.rb +43 -0
  52. data/lib/samagotchi/guardrails/context.rb +2 -0
  53. data/lib/samagotchi/guardrails/pair_boundary.rb +3 -2
  54. data/lib/samagotchi/guardrails/targets.rb +4 -1
  55. data/lib/samagotchi/llm/chat_loop.rb +1 -1
  56. data/lib/samagotchi/memory_bundle/asset_installer.rb +16 -2
  57. data/lib/samagotchi/memory_bundle/file_standing.rb +167 -0
  58. data/lib/samagotchi/memory_bundle/installed_bundle.rb +62 -1
  59. data/lib/samagotchi/memory_bundle/installer.rb +161 -52
  60. data/lib/samagotchi/memory_bundle/listing.rb +4 -3
  61. data/lib/samagotchi/memory_bundle/merger.rb +209 -8
  62. data/lib/samagotchi/memory_bundle/placeholder.rb +2 -1
  63. data/lib/samagotchi/memory_bundle/profile.rb +7 -3
  64. data/lib/samagotchi/memory_bundle/provenance.rb +178 -20
  65. data/lib/samagotchi/memory_bundle/remerge.rb +167 -0
  66. data/lib/samagotchi/memory_bundle/shipped_history.rb +79 -0
  67. data/lib/samagotchi/memory_bundle/shipped_update.rb +89 -24
  68. data/lib/samagotchi/memory_bundle/source.rb +3 -3
  69. data/lib/samagotchi/memory_bundle/status.rb +21 -3
  70. data/lib/samagotchi/memory_bundle/system_bundle.rb +98 -33
  71. data/lib/samagotchi/memory_bundle/text_merge.rb +399 -0
  72. data/lib/samagotchi/memory_bundle/trash.rb +58 -2
  73. data/lib/samagotchi/memory_bundle/uninstaller.rb +26 -6
  74. data/lib/samagotchi/note_command.rb +1 -1
  75. data/lib/samagotchi/note_delivery.rb +6 -2
  76. data/lib/samagotchi/objectives.rb +395 -0
  77. data/lib/samagotchi/objectives_audit.rb +115 -0
  78. data/lib/samagotchi/objectives_check.rb +365 -0
  79. data/lib/samagotchi/objectives_command.rb +192 -0
  80. data/lib/samagotchi/plugin/api.rb +2 -1
  81. data/lib/samagotchi/plugin/context.rb +21 -1
  82. data/lib/samagotchi/project_env.rb +3 -2
  83. data/lib/samagotchi/self_report.rb +2 -0
  84. data/lib/samagotchi/session_commands.rb +15 -0
  85. data/lib/samagotchi/session_continue.rb +3 -0
  86. data/lib/samagotchi/session_inbox.rb +14 -6
  87. data/lib/samagotchi/session_manager.rb +1 -1
  88. data/lib/samagotchi/steer.rb +24 -4
  89. data/lib/samagotchi/testing/boundary.rb +2 -0
  90. data/lib/samagotchi/testing/host.rb +1 -0
  91. data/lib/samagotchi/testing/minitest.rb +3 -0
  92. data/lib/samagotchi/testing/rspec.rb +3 -0
  93. data/lib/samagotchi/testing/sandbox.rb +3 -1
  94. data/lib/samagotchi/tool_activity.rb +17 -0
  95. data/lib/samagotchi/tool_declarations.rb +34 -0
  96. data/lib/samagotchi/tools/builtin_calls.rb +2 -1
  97. data/lib/samagotchi/tools/builtins.rb +4 -1
  98. data/lib/samagotchi/tools/delegate.rb +2 -1
  99. data/lib/samagotchi/tools/objectives_tool.rb +75 -0
  100. data/lib/samagotchi/tools/peers.rb +3 -0
  101. data/lib/samagotchi/tools/task_runtime.rb +13 -10
  102. data/lib/samagotchi/turn_flow.rb +3 -1
  103. data/lib/samagotchi/update_command.rb +76 -28
  104. data/lib/samagotchi/update_hint.rb +4 -1
  105. data/lib/samagotchi/version.rb +1 -1
  106. data/lib/samagotchi/web/auto_update.rb +8 -8
  107. data/lib/samagotchi/web/auto_update_record.rb +6 -4
  108. data/lib/samagotchi/web/message_display.rb +9 -0
  109. data/lib/samagotchi/web/participant_view.rb +2 -2
  110. data/lib/samagotchi/web/public/app.js +15 -3
  111. data/lib/samagotchi/web/public/block_open.js +13 -0
  112. data/lib/samagotchi/web/public/bubbles.js +4 -2
  113. data/lib/samagotchi/web/public/cards_place.js +30 -9
  114. data/lib/samagotchi/web/public/commands.js +4 -1
  115. data/lib/samagotchi/web/public/details_motion.js +2 -1
  116. data/lib/samagotchi/web/public/index.html +20 -14
  117. data/lib/samagotchi/web/public/objectives.css +80 -0
  118. data/lib/samagotchi/web/public/objectives_entry.js +22 -0
  119. data/lib/samagotchi/web/public/objectives_model.js +100 -0
  120. data/lib/samagotchi/web/public/objectives_moves.js +145 -0
  121. data/lib/samagotchi/web/public/objectives_strip.js +242 -0
  122. data/lib/samagotchi/web/public/objectives_wiring.js +62 -0
  123. data/lib/samagotchi/web/public/stage_model.js +5 -6
  124. data/lib/samagotchi/web/public/stage_view.js +8 -7
  125. data/lib/samagotchi/web/public/stream_handlers.js +6 -1
  126. data/lib/samagotchi/web/public/turn_block.js +34 -19
  127. data/lib/samagotchi/web/public/turn_html.js +4 -1
  128. data/lib/samagotchi/web/public/turn_model.js +1 -1
  129. data/lib/samagotchi/web/public/update_sheet.js +8 -3
  130. data/lib/samagotchi/web/public/working_set_view.js +10 -7
  131. data/lib/samagotchi/web/push/notifier.rb +7 -9
  132. data/lib/samagotchi/web/session_hub.rb +2 -1
  133. data/lib/samagotchi/web/session_show.rb +12 -1
  134. data/lib/samagotchi/web/update_ops.rb +2 -1
  135. data/lib/samagotchi/worker.rb +3 -0
  136. data/lib/samagotchi/worker_inbound.rb +16 -8
  137. metadata +22 -1
@@ -95,17 +95,18 @@ function footTag(label) {
95
95
  return html` <button type="button" class="ws-step p" data-ws="jump" data-at=${atAttr(first.at)} title=${title}>${text}</button>`;
96
96
  }
97
97
 
98
- // The footprint line of a finished turn's +items+ (turn +ordinal+), nothing
99
- // for a turn that touched nothing: "touched web/public/ · 9 files · ◆ 3
100
- // memories s1–5 · +1 url · edited 2". A click opens the expanded view at
101
- // that turn; a step tag jumps to its call.
98
+ // The footprint of a finished turn's +items+ (turn +ordinal+), nothing for a
99
+ // turn that touched nothing: "touched web/public/ · 9 files · ◆ 3 memories
100
+ // s1–5 · +1 url · edited 2". It sits in the turn block's summary line, so a
101
+ // span (phrasing content). A click opens the expanded view at that turn; a
102
+ // step tag jumps to its call.
102
103
  export function footprintTemplate(items, ordinal) {
103
104
  const fp = footprint(items, BUDGETS.footprint);
104
105
  if (!fp) return nothing;
105
106
  const sep = html` <span class="sep">·</span> `;
106
107
  const parts = fp.labels.map((l, i) => html`${i ? sep : nothing}<span class=${`l ${l.kind}${l.state && l.state !== "live" ? ` ${l.state}` : ""}`} title=${labelTitle(l)}>${l.glyph ? html`<span class="k">${l.glyph}</span> ` : nothing}${labelText({ ...l, glyph: "" })}</span>${footTag(l)}`);
107
108
  const text = footprintText(items, BUDGETS.footprint);
108
- return html`<div class="ws-foot" role="button" tabindex="0" aria-haspopup="dialog" aria-expanded="false" data-ws-turn=${ordinal} data-ws-sig=${footSig(items)} aria-label=${`Working set of this turn: ${text.replace(/^touched /, "")}. Open the list.`}><span class="w">touched</span> ${parts}${fp.tail ? html`${sep}<span class="w">${fp.tail}</span>` : nothing}${fp.edited ? html`${sep}<span class="e">edited ${fp.edited}</span>` : nothing}${fp.stale ? html`${sep}<span class="s">${fp.stale} stale</span>` : nothing}${fp.forgotten ? html`${sep}<span class="f">${fp.forgotten} forgotten</span>` : nothing}${fp.dropped ? html`${sep}<span class="f">${fp.dropped} dropped</span>` : nothing}</div>`;
109
+ return html`<span class="ws-foot" role="button" tabindex="0" aria-haspopup="dialog" aria-expanded="false" data-ws-turn=${ordinal} data-ws-sig=${footSig(items)} aria-label=${`Working set of this turn: ${text.replace(/^touched /, "")}. Open the list.`}><span class="w">touched</span> ${parts}${fp.tail ? html`${sep}<span class="w">${fp.tail}</span>` : nothing}${fp.edited ? html`${sep}<span class="e">edited ${fp.edited}</span>` : nothing}${fp.stale ? html`${sep}<span class="s">${fp.stale} stale</span>` : nothing}${fp.forgotten ? html`${sep}<span class="f">${fp.forgotten} forgotten</span>` : nothing}${fp.dropped ? html`${sep}<span class="f">${fp.dropped} dropped</span>` : nothing}</span>`;
109
110
  }
110
111
 
111
112
  // What a footprint shows that can change after it is drawn: its items'
@@ -418,10 +419,12 @@ export function createWorkingSet({ historyEl, stageRoot = () => null, state, ses
418
419
  }
419
420
  });
420
421
 
421
- // A footprint: its step tag jumps, the rest opens that turn's view.
422
+ // A footprint: its step tag jumps, the rest opens that turn's view. Inside
423
+ // a <summary>, the click is cancelled so it doesn't toggle the block.
422
424
  function footClick(e) {
423
425
  const foot = e.target.closest?.(".ws-foot");
424
426
  if (!foot) return;
427
+ if (foot.closest("summary")) e.preventDefault();
425
428
  const tag = e.target.closest(".ws-step[data-at]");
426
429
  if (tag) {
427
430
  const at = parseAt(tag.dataset.at);
@@ -563,7 +566,7 @@ export function createWorkingSet({ historyEl, stageRoot = () => null, state, ses
563
566
  // The rail's first-sight times, for the popover's fresh rows.
564
567
  setSeen(fn) { seenAt = fn; },
565
568
  // The running turn hands off: its set joins the turns; its footprint
566
- // line (null: it touched nothing) goes after its block.
569
+ // (null: it touched nothing) goes into its block's summary.
567
570
  handOff(turn, prompt = "") {
568
571
  const ordinal = turns.length;
569
572
  const items = itemsOfTurn(turn, ordinal);
@@ -5,6 +5,7 @@ require "uri"
5
5
  require "time"
6
6
  require_relative "attention"
7
7
  require_relative "../../log"
8
+ require_relative "../../memory_bundle/file_standing"
8
9
 
9
10
  module Samagotchi
10
11
  module Web
@@ -52,10 +53,10 @@ module Samagotchi
52
53
  AUTO_NOTICES = {
53
54
  "installed" => lambda do |version, notes|
54
55
  ["installed", "chi #{version} is installed",
55
- "chi web and its sessions switch over when you restart them.#{kept_words(notes[:kept])}"]
56
+ "chi web and its sessions switch over when you restart them.#{file_words(notes)}"]
56
57
  end,
57
58
  "updated" => lambda do |version, notes|
58
- ["updated", "chi updated to #{version}", "#{restarted_words(notes[:restarted], notes[:left])}#{kept_words(notes[:kept])}"]
59
+ ["updated", "chi updated to #{version}", "#{restarted_words(notes[:restarted], notes[:left])}#{file_words(notes)}"]
59
60
  end,
60
61
  "restart_failed" => lambda do |version, notes|
61
62
  ["restart_failed", "chi #{version} is installed; chi web didn't restart",
@@ -79,13 +80,10 @@ module Samagotchi
79
80
  "#{words}."
80
81
  end
81
82
 
82
- # " Kept your edits in 2 files." ("" for none).
83
- def self.kept_words(count)
84
- if count.to_i.positive?
85
- " Kept your edits in #{count} #{count == 1 ? "file" : "files"}."
86
- else
87
- ""
88
- end
83
+ # " Merged the update into 1 file you edited. 2 files stay behind." ("" for none).
84
+ def self.file_words(notes)
85
+ words = MemoryBundle::FileStanding.counts_sentence(merged: notes[:merged].to_i, behind: notes[:kept].to_i)
86
+ words.empty? ? "" : " #{words}"
89
87
  end
90
88
 
91
89
  # A show carries +open+ only while its JSON stays this small: one
@@ -216,7 +216,8 @@ module Samagotchi
216
216
  # `chi_update` frames are the page's), and not kept for a snapshot.
217
217
  # @param kind [String] installed, updated or failed
218
218
  # @param version [String] the release it is about
219
- # @param notes [Hash] detail:, kept: (a count), restarted:, left:
219
+ # @param notes [Hash] detail:, kept:, merged: (counts of edited files that
220
+ # stayed behind and that took the update), restarted:, left:
220
221
  def publish_notice(kind:, version:, **notes)
221
222
  @monitor.synchronize { emit("chi_notice", { kind: kind, version: version, **notes }) }
222
223
  nil
@@ -6,6 +6,7 @@ require "uri"
6
6
  require_relative "../analytics_file"
7
7
  require_relative "../answer_refs"
8
8
  require_relative "../answer_tail"
9
+ require_relative "../objectives"
9
10
  require_relative "../output_formatter"
10
11
  require_relative "../question_asked"
11
12
  require_relative "../guardrails/approvals"
@@ -91,10 +92,20 @@ module Samagotchi
91
92
  # The stream cursor `<seq>-<epoch>`: a later worker resets it
92
93
  # instead of taking the seq as its own. Only the snapshot has it.
93
94
  last_event_id: turn_snapshot && turn_snapshot["event_id"],
94
- timing: timing
95
+ timing: timing,
96
+ **objectives_field(id, raw_messages)
95
97
  })
96
98
  end
97
99
 
100
+ # The session's list (the page's strip), and no key with no list: a
101
+ # session without one reads as it always did. A snapshot's entries have
102
+ # string keys (paired_runs reads symbols).
103
+ def objectives_field(id, messages)
104
+ symbols = Array(messages).map { |message| message.is_a?(Hash) ? message.transform_keys(&:to_sym) : message }
105
+ view = Samagotchi::Objectives.view(id, symbols, state_dir: default_state_dir)
106
+ view ? { objectives: view } : {}
107
+ end
108
+
98
109
  # A list in the worker's turn +snapshot+ (queued prompts, commands,
99
110
  # init tasks); [] without a worker.
100
111
  def snapshot_list(snapshot, key) = Array(snapshot&.[](key))
@@ -175,7 +175,8 @@ module Samagotchi
175
175
  def perform_install(version, auto)
176
176
  argv = update_argv(version)
177
177
  said = nil
178
- output, success = @runner.call(argv, env: ChildEnv.unbundled,
178
+ env = auto ? ChildEnv.unbundled.merge(ChildEnv::UNATTENDED_UPDATE => "1") : ChildEnv.unbundled
179
+ output, success = @runner.call(argv, env: env,
179
180
  progress: lambda { |line|
180
181
  said = line unless line.strip.empty?
181
182
  @hub.publish_update(state: "running", rows: [], progress: line,
@@ -1203,6 +1203,9 @@ module Samagotchi
1203
1203
  save_or_log(:command) { save_session } unless Array(result.changed).empty?
1204
1204
  announce_command(command, status: result.status.to_s, output: result.output, changed: Array(result.changed),
1205
1205
  anytime: true, confirm: result.confirm)
1206
+ # It may have left a note (/objectives): an idle loop takes it now, not
1207
+ # at the fallback tick. Harmless otherwise: one more pass.
1208
+ @waker.wake
1206
1209
  rescue StandardError => e
1207
1210
  Log.warn(:worker, "anytime_command_failed", line: command.line, error: e.class.name, msg: e.message)
1208
1211
  end
@@ -9,6 +9,7 @@ require_relative "client_id"
9
9
  require_relative "config"
10
10
  require_relative "context_note"
11
11
  require_relative "log"
12
+ require_relative "objectives"
12
13
  require_relative "session"
13
14
  require_relative "session_inbox"
14
15
  require_relative "steer"
@@ -113,19 +114,26 @@ module Samagotchi
113
114
  # note the saved conversation already holds. A failed save keeps the
114
115
  # files too: the next pass claims them again, finds them in the
115
116
  # conversation and saves again. Not activity: a note alone neither
116
- # starts a turn nor keeps an idle worker up.
117
+ # starts a turn nor keeps an idle worker up. Of the objectives notes in
118
+ # a batch only the newest goes in: each is a whole list, so the older
119
+ # ones (edits made during a turn) would only be sent for nothing.
117
120
  def absorb_notes
118
121
  files = SessionInbox.find_new_note_files(@session_dir)
119
122
  return if files.empty? || @stopped.call
120
123
 
121
- claimed = files.filter_map { |file| SessionInbox.claim_note_file(file) }
122
- claimed.each do |file|
123
- note = SessionInbox.read_note(file)
124
- @engine.add_context_note(@session, note) if note
124
+ # Under the objectives' lock: an edit reads the conversation and then the
125
+ # pending file, so it must see this whole step or none of it.
126
+ Objectives.with_lock(@session_dir) do
127
+ claimed = files.filter_map { |file| SessionInbox.claim_note_file(file) }
128
+ notes = claimed.filter_map { |file| SessionInbox.read_note(file) }
129
+ newest_list = notes.reverse.find { |note| note[:objectives] }
130
+ notes.each do |note|
131
+ @engine.add_context_note(@session, note) if !note[:objectives] || note.equal?(newest_list)
132
+ end
133
+ next unless save(:notes)
134
+
135
+ claimed.each { |file| FileUtils.rm_f(file) }
125
136
  end
126
- return unless save(:notes)
127
-
128
- claimed.each { |file| FileUtils.rm_f(file) }
129
137
  end
130
138
 
131
139
  # The attached context's notes (ContextAbsorber), between turns. Not
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: samagotchi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.148.0
4
+ version: 0.150.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Dedov
@@ -163,6 +163,7 @@ files:
163
163
  - docs/internals/llm-context-bench.md
164
164
  - docs/internals/llm-context-forget.md
165
165
  - docs/internals/llm-context-live.md
166
+ - docs/internals/objectives.md
166
167
  - docs/internals/participants.md
167
168
  - docs/internals/prompt-caching.md
168
169
  - docs/internals/remote-sessions.md
@@ -225,6 +226,7 @@ files:
225
226
  - lib/samagotchi/bundle_command/try/trace.rb
226
227
  - lib/samagotchi/bundle_needs.rb
227
228
  - lib/samagotchi/bundle_settings_check.rb
229
+ - lib/samagotchi/bundler_env.rb
228
230
  - lib/samagotchi/bundles/agents-md/manifest.yml
229
231
  - lib/samagotchi/bundles/agents-md/plugin.rb
230
232
  - lib/samagotchi/bundles/btw/manifest.yml
@@ -248,6 +250,8 @@ files:
248
250
  - lib/samagotchi/bundles/core/manifest.yml
249
251
  - lib/samagotchi/bundles/cost-cap/manifest.yml
250
252
  - lib/samagotchi/bundles/cost-cap/plugin.rb
253
+ - lib/samagotchi/bundles/decision-card/manifest.yml
254
+ - lib/samagotchi/bundles/decision-card/plugin.rb
251
255
  - lib/samagotchi/bundles/dev/manifest.yml
252
256
  - lib/samagotchi/bundles/github-pr/manifest.yml
253
257
  - lib/samagotchi/bundles/github-pr/plugin.rb
@@ -356,6 +360,7 @@ files:
356
360
  - lib/samagotchi/file_ref.rb
357
361
  - lib/samagotchi/gem_update.rb
358
362
  - lib/samagotchi/generation_phase.rb
363
+ - lib/samagotchi/git_env.rb
359
364
  - lib/samagotchi/git_head.rb
360
365
  - lib/samagotchi/guardrail_wiring.rb
361
366
  - lib/samagotchi/guardrails.rb
@@ -464,6 +469,7 @@ files:
464
469
  - lib/samagotchi/memory_bundle/builder.rb
465
470
  - lib/samagotchi/memory_bundle/bundle_hook.rb
466
471
  - lib/samagotchi/memory_bundle/entry_size.rb
472
+ - lib/samagotchi/memory_bundle/file_standing.rb
467
473
  - lib/samagotchi/memory_bundle/index_size.rb
468
474
  - lib/samagotchi/memory_bundle/index_sync.rb
469
475
  - lib/samagotchi/memory_bundle/index_updater.rb
@@ -478,11 +484,14 @@ files:
478
484
  - lib/samagotchi/memory_bundle/plugin_ref.rb
479
485
  - lib/samagotchi/memory_bundle/profile.rb
480
486
  - lib/samagotchi/memory_bundle/provenance.rb
487
+ - lib/samagotchi/memory_bundle/remerge.rb
481
488
  - lib/samagotchi/memory_bundle/shas.rb
489
+ - lib/samagotchi/memory_bundle/shipped_history.rb
482
490
  - lib/samagotchi/memory_bundle/shipped_update.rb
483
491
  - lib/samagotchi/memory_bundle/source.rb
484
492
  - lib/samagotchi/memory_bundle/status.rb
485
493
  - lib/samagotchi/memory_bundle/system_bundle.rb
494
+ - lib/samagotchi/memory_bundle/text_merge.rb
486
495
  - lib/samagotchi/memory_bundle/trash.rb
487
496
  - lib/samagotchi/memory_bundle/uninstaller.rb
488
497
  - lib/samagotchi/memory_command.rb
@@ -505,6 +514,10 @@ files:
505
514
  - lib/samagotchi/muted_memories.rb
506
515
  - lib/samagotchi/note_command.rb
507
516
  - lib/samagotchi/note_delivery.rb
517
+ - lib/samagotchi/objectives.rb
518
+ - lib/samagotchi/objectives_audit.rb
519
+ - lib/samagotchi/objectives_check.rb
520
+ - lib/samagotchi/objectives_command.rb
508
521
  - lib/samagotchi/output_formatter.rb
509
522
  - lib/samagotchi/owner_lock.rb
510
523
  - lib/samagotchi/owner_prompt.rb
@@ -743,6 +756,7 @@ files:
743
756
  - lib/samagotchi/tools/list_reminders.rb
744
757
  - lib/samagotchi/tools/list_sessions.rb
745
758
  - lib/samagotchi/tools/memory.rb
759
+ - lib/samagotchi/tools/objectives_tool.rb
746
760
  - lib/samagotchi/tools/output_guardrails.rb
747
761
  - lib/samagotchi/tools/peers.rb
748
762
  - lib/samagotchi/tools/read.rb
@@ -814,6 +828,7 @@ files:
814
828
  - lib/samagotchi/web/public/app.js
815
829
  - lib/samagotchi/web/public/apple-touch-icon.png
816
830
  - lib/samagotchi/web/public/auth_lost.js
831
+ - lib/samagotchi/web/public/block_open.js
817
832
  - lib/samagotchi/web/public/bubbles.js
818
833
  - lib/samagotchi/web/public/card.js
819
834
  - lib/samagotchi/web/public/cards_place.js
@@ -872,6 +887,12 @@ files:
872
887
  - lib/samagotchi/web/public/notice_links.js
873
888
  - lib/samagotchi/web/public/notifications.js
874
889
  - lib/samagotchi/web/public/notify.js
890
+ - lib/samagotchi/web/public/objectives.css
891
+ - lib/samagotchi/web/public/objectives_entry.js
892
+ - lib/samagotchi/web/public/objectives_model.js
893
+ - lib/samagotchi/web/public/objectives_moves.js
894
+ - lib/samagotchi/web/public/objectives_strip.js
895
+ - lib/samagotchi/web/public/objectives_wiring.js
875
896
  - lib/samagotchi/web/public/participant.html
876
897
  - lib/samagotchi/web/public/participant.js
877
898
  - lib/samagotchi/web/public/participant_annotate.js