samagotchi 0.8.1 → 0.10.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +89 -1
- data/docs/architecture.md +24 -9
- data/docs/cli.md +4 -3
- data/docs/guardrails.md +9 -2
- data/docs/hooks.md +44 -7
- data/docs/internals/gemma4-contract.md +1 -0
- data/docs/memory.md +5 -3
- data/docs/plugins.md +47 -17
- data/docs/sessions.md +1 -1
- data/lib/samagotchi/bootstrap_command.rb +29 -29
- data/lib/samagotchi/bridge/card_store.rb +4 -4
- data/lib/samagotchi/bridge/pending_card.rb +2 -2
- data/lib/samagotchi/bridge/sse_writer.rb +22 -28
- data/lib/samagotchi/bridge/turn_accumulator.rb +92 -5
- data/lib/samagotchi/bridge.rb +59 -112
- data/lib/samagotchi/bridge_client.rb +11 -28
- data/lib/samagotchi/bundle_command.rb +158 -212
- data/lib/samagotchi/bundles/check-in/manifest.yml +2 -2
- data/lib/samagotchi/bundles/check-in/plugin.rb +3 -4
- data/lib/samagotchi/bundles/known-names/hooks/known_names.rb +7 -3
- data/lib/samagotchi/bundles/known-names/manifest.yml +2 -2
- data/lib/samagotchi/bundles/loop-guard/manifest.yml +2 -2
- data/lib/samagotchi/bundles/loop-guard/plugin.rb +10 -10
- data/lib/samagotchi/bundles/mcp/manifest.yml +3 -3
- data/lib/samagotchi/bundles/mcp/plugin.rb +2 -4
- data/lib/samagotchi/bundles/skills/manifest.yml +3 -3
- data/lib/samagotchi/bundles/skills/plugin.rb +65 -17
- data/lib/samagotchi/bundles/source-links/hooks/source_links.rb +0 -1
- data/lib/samagotchi/bundles/source-links/manifest.yml +2 -2
- data/lib/samagotchi/bundles/system/config_modification_protocol.md +2 -2
- data/lib/samagotchi/bundles/system/identity.md +1 -1
- data/lib/samagotchi/bundles/system/manifest.yml +4 -4
- data/lib/samagotchi/bundles/system/memory_guide.md +5 -4
- data/lib/samagotchi/cli/command.rb +51 -0
- data/lib/samagotchi/cli/flags.rb +116 -0
- data/lib/samagotchi/config.rb +70 -55
- data/lib/samagotchi/config_text_edit.rb +107 -0
- data/lib/samagotchi/desktop_command.rb +24 -18
- data/lib/samagotchi/edit_preview.rb +2 -2
- data/lib/samagotchi/engine.rb +20 -75
- data/lib/samagotchi/events.rb +23 -0
- data/lib/samagotchi/guardrail_wiring.rb +2 -5
- data/lib/samagotchi/guardrails/targets.rb +7 -1
- data/lib/samagotchi/hooks/bundle_loader.rb +13 -30
- data/lib/samagotchi/hooks/loader.rb +23 -33
- data/lib/samagotchi/hooks/registry.rb +41 -0
- data/lib/samagotchi/hooks.rb +0 -3
- data/lib/samagotchi/host_registry.rb +15 -0
- data/lib/samagotchi/idle_reminders.rb +0 -7
- data/lib/samagotchi/image_store.rb +22 -0
- data/lib/samagotchi/kernel_loop.rb +12 -16
- data/lib/samagotchi/live_versions.rb +2 -13
- data/lib/samagotchi/llm/native_tool_normalizer.rb +10 -227
- data/lib/samagotchi/log_subscriber.rb +5 -1
- data/lib/samagotchi/memory_bundle/builder.rb +1 -14
- data/lib/samagotchi/memory_bundle/index_sync.rb +73 -0
- data/lib/samagotchi/memory_bundle/index_updater.rb +2 -28
- data/lib/samagotchi/memory_bundle/installer.rb +25 -30
- data/lib/samagotchi/memory_bundle/provenance.rb +2 -6
- data/lib/samagotchi/memory_bundle/status.rb +1 -14
- data/lib/samagotchi/memory_bundle/system_bundle.rb +2 -2
- data/lib/samagotchi/memory_bundle/uninstaller.rb +1 -24
- data/lib/samagotchi/memory_paths.rb +10 -0
- data/lib/samagotchi/note_command.rb +23 -37
- data/lib/samagotchi/owner_lock.rb +14 -3
- data/lib/samagotchi/plugin/api.rb +11 -17
- data/lib/samagotchi/plugin/context.rb +70 -15
- data/lib/samagotchi/plugin/loader.rb +2 -3
- data/lib/samagotchi/sampling_settings.rb +3 -5
- data/lib/samagotchi/self_report.rb +6 -9
- data/lib/samagotchi/send_command.rb +33 -52
- data/lib/samagotchi/session.rb +88 -92
- data/lib/samagotchi/session_archive_command.rb +8 -14
- data/lib/samagotchi/session_commands.rb +3 -21
- data/lib/samagotchi/session_delete_command.rb +15 -29
- data/lib/samagotchi/session_manager.rb +29 -15
- data/lib/samagotchi/session_metrics.rb +2 -1
- data/lib/samagotchi/sessions_command.rb +3 -2
- data/lib/samagotchi/system_prompt.rb +2 -1
- data/lib/samagotchi/terminal_ui/attached_loop.rb +30 -80
- data/lib/samagotchi/terminal_ui/attached_view.rb +1 -10
- data/lib/samagotchi/terminal_ui/between_turns.rb +133 -0
- data/lib/samagotchi/terminal_ui/event_renderer.rb +3 -1
- data/lib/samagotchi/terminal_ui/formatting.rb +51 -1
- data/lib/samagotchi/terminal_ui/status_row.rb +32 -0
- data/lib/samagotchi/terminal_ui/thinking_line.rb +3 -3
- data/lib/samagotchi/terminal_ui.rb +156 -234
- data/lib/samagotchi/thinking.rb +2 -3
- data/lib/samagotchi/thought_stream_splitter.rb +10 -9
- data/lib/samagotchi/tool_call_parser.rb +56 -292
- data/lib/samagotchi/tool_declarations.rb +1 -1
- data/lib/samagotchi/tool_runner.rb +8 -0
- data/lib/samagotchi/tools/builtin_calls.rb +146 -0
- data/lib/samagotchi/tools/builtins.rb +2 -1
- data/lib/samagotchi/tools/edit.rb +21 -29
- data/lib/samagotchi/tools/memory.rb +2 -13
- data/lib/samagotchi/tools/send_note.rb +1 -1
- data/lib/samagotchi/update_command.rb +32 -22
- data/lib/samagotchi/version.rb +1 -1
- data/lib/samagotchi/vision_support.rb +4 -5
- data/lib/samagotchi/web/app.rb +89 -151
- data/lib/samagotchi/web/public/activity.js +1 -11
- data/lib/samagotchi/web/public/annotate_bar.js +120 -0
- data/lib/samagotchi/web/public/app.js +158 -785
- data/lib/samagotchi/web/public/chunk_router.js +7 -6
- data/lib/samagotchi/web/public/command_list.js +99 -0
- data/lib/samagotchi/web/public/data.js +22 -66
- data/lib/samagotchi/web/public/format.js +0 -23
- data/lib/samagotchi/web/public/index.html +0 -2
- data/lib/samagotchi/web/public/model_pick.js +0 -7
- data/lib/samagotchi/web/public/notifications.js +169 -0
- data/lib/samagotchi/web/public/question_cards.js +352 -0
- data/lib/samagotchi/web/public/session_state.js +34 -0
- data/lib/samagotchi/web/public/timing.js +1 -1
- data/lib/samagotchi/web/public/turn_events.js +11 -2
- data/lib/samagotchi/web/public/turn_model.js +0 -14
- data/lib/samagotchi/web/session_hub.rb +6 -4
- data/lib/samagotchi/web/session_summary.rb +5 -3
- data/lib/samagotchi/worker.rb +59 -53
- data/lib/samagotchi/worker_sidecar.rb +27 -1
- metadata +13 -1
data/lib/samagotchi/worker.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require "fileutils"
|
|
4
4
|
|
|
5
|
+
require_relative "events"
|
|
5
6
|
require_relative "session"
|
|
6
7
|
require_relative "session_inbox"
|
|
7
8
|
require_relative "turn_note"
|
|
@@ -43,7 +44,6 @@ module Samagotchi
|
|
|
43
44
|
# How much of a command's output goes into its :command_ran.
|
|
44
45
|
COMMAND_OUTPUT_LIMIT = 4096
|
|
45
46
|
BUSY_OUTPUT = "busy: wait for the turn to end"
|
|
46
|
-
TURN_END_EVENTS = %i[turn_completed turn_canceled turn_failed].freeze
|
|
47
47
|
DEFAULT_MAX_ITERATIONS = 100
|
|
48
48
|
NO_INTERRUPT_MAX_ITERATIONS = 1000
|
|
49
49
|
|
|
@@ -95,8 +95,10 @@ module Samagotchi
|
|
|
95
95
|
# What a new session starts on (and /model resets to); nil before #run.
|
|
96
96
|
attr_reader :default_model
|
|
97
97
|
|
|
98
|
-
# @return [Symbol] :idle_exit,
|
|
99
|
-
# to exit (Bridge POST /exit)
|
|
98
|
+
# @return [Symbol] :idle_exit, :exit_requested when a client asked it
|
|
99
|
+
# to exit (Bridge POST /exit), :stopped when the session was stopped
|
|
100
|
+
# (chi stop), :crashed when the loop raised (the session is marked
|
|
101
|
+
# errored); SessionManager.run_session_loop turns it into the exit
|
|
100
102
|
def run
|
|
101
103
|
@session = Session.load(@session_id, state_dir: @state_dir)
|
|
102
104
|
drop_dead_question
|
|
@@ -113,7 +115,7 @@ module Samagotchi
|
|
|
113
115
|
# queued while that turn ran.
|
|
114
116
|
@turn_end_seq = 0
|
|
115
117
|
@engine.subscribe(observer: lambda { |event|
|
|
116
|
-
@turn_end_seq = event[:event_seq] if
|
|
118
|
+
@turn_end_seq = event[:event_seq] if Events::TURN_END.include?(event[:type])
|
|
117
119
|
})
|
|
118
120
|
# /model's default is the config's, as in the REPL; the Engine started
|
|
119
121
|
# on the session's model.
|
|
@@ -151,14 +153,17 @@ module Samagotchi
|
|
|
151
153
|
begin
|
|
152
154
|
# A session stopped before this worker took the lock (e.g. a stop
|
|
153
155
|
# right after create) must not run its initial prompt.
|
|
154
|
-
|
|
156
|
+
return :stopped if stopped_on_disk?
|
|
155
157
|
# Plugins' slow setup (chi.init: an MCP server's first start), in
|
|
156
158
|
# the background, shown by the UIs; a turn waits only for the ones
|
|
157
159
|
# that bring tools.
|
|
158
160
|
@engine.start_init_tasks!
|
|
159
161
|
loop do
|
|
160
|
-
# Check if the session was externally marked as stopped
|
|
161
|
-
|
|
162
|
+
# Check if the session was externally marked as stopped. Not
|
|
163
|
+
# stopped_on_disk?, which reads a vanished file as "not stopped":
|
|
164
|
+
# a session file deleted under a running worker crashes it here
|
|
165
|
+
# instead of being saved back by its next turn.
|
|
166
|
+
return :stopped if Session.load(@session_id, state_dir: @state_dir).status == Session::STATUS_STOPPED
|
|
162
167
|
|
|
163
168
|
# Commands queued before a prompt run first (a /continue sent
|
|
164
169
|
# before a new prompt still answers the offer).
|
|
@@ -194,7 +199,7 @@ module Samagotchi
|
|
|
194
199
|
# Its stderr is /dev/null: the log is the only trace of why.
|
|
195
200
|
Log.exception(:worker, "crashed", e)
|
|
196
201
|
Session.mark_error(@session_id, reason: e.message, state_dir: @state_dir)
|
|
197
|
-
|
|
202
|
+
:crashed
|
|
198
203
|
ensure
|
|
199
204
|
# The anytime commands finish and the plugins' services stop (a
|
|
200
205
|
# server process), whatever the way out; the Bridge last, so a
|
|
@@ -297,28 +302,19 @@ module Samagotchi
|
|
|
297
302
|
# its continue turn
|
|
298
303
|
# @param images [Array<Hash>] the prompt's image refs ({file:, name:})
|
|
299
304
|
def run_prompt(prompt, origin, no_interrupt: false, images: [])
|
|
300
|
-
# Show the turn as running to readers of the file (the web's session
|
|
301
|
-
# list); the Engine resets it to idle when it ends.
|
|
302
|
-
@session.status = Session::STATUS_RUNNING
|
|
303
|
-
@session.save(state_dir: @state_dir)
|
|
304
305
|
user_input(origin&.dig(:client_id))
|
|
305
306
|
drop_continue_offer(origin)
|
|
306
307
|
@turn_flow.before_prompt_turn
|
|
307
308
|
@merged_this_turn = []
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
refuse_queued_commands
|
|
309
|
+
run_engine_turn(prompt, origin: origin, max_iterations: max_iterations(no_interrupt),
|
|
310
|
+
images: images) do |result, error|
|
|
311
|
+
if error
|
|
312
|
+
# The Engine announced :turn_failed (with the error's one line).
|
|
313
|
+
restore_failed_turn([[prompt, origin, images], *@merged_this_turn], error: error)
|
|
314
|
+
else
|
|
315
|
+
after_turn(result, no_interrupt: no_interrupt)
|
|
316
|
+
end
|
|
317
317
|
end
|
|
318
|
-
after_turn(result, no_interrupt: no_interrupt)
|
|
319
|
-
response = result.respond_to?(:output) ? result.output : nil
|
|
320
|
-
SessionInbox.write_output(@session_dir, response) unless response.nil? || response.strip.empty?
|
|
321
|
-
@session.save(state_dir: @state_dir) unless stopped_on_disk?
|
|
322
318
|
end
|
|
323
319
|
|
|
324
320
|
# A due reminder runs as a continue turn, as in the REPL: Engine#run_turn
|
|
@@ -333,23 +329,11 @@ module Samagotchi
|
|
|
333
329
|
return false unless @engine.reminders_due?
|
|
334
330
|
|
|
335
331
|
drop_continue_offer({ client_id: SessionManager::REMINDER_CLIENT_ID })
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
max_iterations: DEFAULT_MAX_ITERATIONS)
|
|
342
|
-
response = result.respond_to?(:output) ? result.output : nil
|
|
343
|
-
SessionInbox.write_output(@session_dir, response) unless response.nil? || response.strip.empty?
|
|
344
|
-
rescue StandardError
|
|
345
|
-
nil # the Engine announced :turn_failed; there is no prompt to hand back
|
|
346
|
-
ensure
|
|
347
|
-
refuse_queued_commands
|
|
348
|
-
end
|
|
349
|
-
# The offer went before the turn (drop_continue_offer); the rollback
|
|
350
|
-
# window closes.
|
|
351
|
-
@turn_flow.after_reminder_turn
|
|
352
|
-
@session.save(state_dir: @state_dir) unless stopped_on_disk?
|
|
332
|
+
# A failure has no prompt to hand back (the Engine announced
|
|
333
|
+
# :turn_failed). The offer went before the turn
|
|
334
|
+
# (drop_continue_offer); either way the rollback window closes.
|
|
335
|
+
run_engine_turn(nil, continue: true, origin: { client_id: SessionManager::REMINDER_CLIENT_ID },
|
|
336
|
+
max_iterations: DEFAULT_MAX_ITERATIONS) { @turn_flow.after_reminder_turn }
|
|
353
337
|
true
|
|
354
338
|
end
|
|
355
339
|
|
|
@@ -397,7 +381,7 @@ module Samagotchi
|
|
|
397
381
|
announce_command(command, status: result.status.to_s, output: result.output, changed: Array(result.changed))
|
|
398
382
|
shown.each { |event| @engine.announce(event) }
|
|
399
383
|
end
|
|
400
|
-
|
|
384
|
+
save_session unless Array(result.changed).empty?
|
|
401
385
|
user_input(command[:client_id]) if resolved
|
|
402
386
|
# An offer answered without a turn ("no") is activity: the recap
|
|
403
387
|
# written at the offer (it says the turn stopped) gets rewritten.
|
|
@@ -461,23 +445,38 @@ module Samagotchi
|
|
|
461
445
|
def run_continue_turn(command)
|
|
462
446
|
offer = @turn_flow.offer
|
|
463
447
|
@turn_flow.before_continue_turn
|
|
448
|
+
run_engine_turn(nil, continue: true, origin: { client_id: command[:client_id] }.compact,
|
|
449
|
+
max_iterations: max_iterations(offer[:no_interrupt])) do |result, error|
|
|
450
|
+
if error
|
|
451
|
+
@engine.announce(type: :continue_offered, context: offer[:context], no_interrupt: offer[:no_interrupt])
|
|
452
|
+
else
|
|
453
|
+
after_turn(result, continue: true, no_interrupt: offer[:no_interrupt])
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
# One Engine turn, the same for a prompt, a reminder and a continue:
|
|
459
|
+
# the session shows as running to readers of the file (the web's
|
|
460
|
+
# session list; the Engine resets it to idle when it ends), commands
|
|
461
|
+
# queued while it ran are refused, then the caller's block takes the
|
|
462
|
+
# result (or the error the Engine announced as :turn_failed), the
|
|
463
|
+
# answer goes to the output file and the session is saved.
|
|
464
|
+
# @yieldparam result [Object, nil] Engine#run_turn's, nil on a failure
|
|
465
|
+
# @yieldparam error [StandardError, nil]
|
|
466
|
+
def run_engine_turn(prompt, **turn_args)
|
|
464
467
|
@session.status = Session::STATUS_RUNNING
|
|
465
468
|
@session.save(state_dir: @state_dir)
|
|
466
469
|
begin
|
|
467
|
-
result = @engine.run_turn(@session,
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
rescue StandardError
|
|
471
|
-
@engine.announce(type: :continue_offered, context: offer[:context], no_interrupt: offer[:no_interrupt])
|
|
472
|
-
@session.save(state_dir: @state_dir) unless stopped_on_disk?
|
|
473
|
-
return
|
|
470
|
+
result = @engine.run_turn(@session, prompt, pending_input: pending_input_drain, **turn_args)
|
|
471
|
+
rescue StandardError => e
|
|
472
|
+
error = e
|
|
474
473
|
ensure
|
|
475
474
|
refuse_queued_commands
|
|
476
475
|
end
|
|
477
|
-
|
|
476
|
+
yield result, error
|
|
478
477
|
response = result.respond_to?(:output) ? result.output : nil
|
|
479
478
|
SessionInbox.write_output(@session_dir, response) unless response.nil? || response.strip.empty?
|
|
480
|
-
|
|
479
|
+
save_session
|
|
481
480
|
end
|
|
482
481
|
|
|
483
482
|
# TurnFlow keeps the checkpoint (a cancelled turn's, for !rollback) and
|
|
@@ -513,6 +512,7 @@ module Samagotchi
|
|
|
513
512
|
# origin, images] (a web client gets its image chips back)
|
|
514
513
|
# @param error [Exception, nil] what failed: its one line stays in the
|
|
515
514
|
# conversation as a turn note
|
|
515
|
+
# Not saved here: run_engine_turn saves after its block.
|
|
516
516
|
def restore_failed_turn(prompts, error: nil)
|
|
517
517
|
note = error && TurnNote.failed(error.respond_to?(:summary) ? error.summary : error.message, restored: true)
|
|
518
518
|
@engine.synchronize_events do
|
|
@@ -523,7 +523,6 @@ module Samagotchi
|
|
|
523
523
|
@engine.announce(restored)
|
|
524
524
|
end
|
|
525
525
|
end
|
|
526
|
-
@session.save(state_dir: @state_dir) unless stopped_on_disk?
|
|
527
526
|
end
|
|
528
527
|
|
|
529
528
|
# Shared mid-turn steering drain: claims any input files that arrive
|
|
@@ -657,5 +656,12 @@ module Samagotchi
|
|
|
657
656
|
def stopped_on_disk?
|
|
658
657
|
SessionManager.stopped_on_disk?(@session_id, state_dir: @state_dir)
|
|
659
658
|
end
|
|
659
|
+
|
|
660
|
+
# Save the session unless it was stopped meanwhile: the stop (chi stop,
|
|
661
|
+
# from another process) saved its status, and this save would write
|
|
662
|
+
# the worker's over it.
|
|
663
|
+
def save_session
|
|
664
|
+
@session.save(state_dir: @state_dir) unless stopped_on_disk?
|
|
665
|
+
end
|
|
660
666
|
end
|
|
661
667
|
end
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require "json"
|
|
4
4
|
require "fileutils"
|
|
5
|
+
require "socket"
|
|
5
6
|
require_relative "atomic_file"
|
|
6
7
|
|
|
7
8
|
module Samagotchi
|
|
@@ -10,9 +11,11 @@ module Samagotchi
|
|
|
10
11
|
# "worker" owner), the chi it runs (chi update) and the input-file format
|
|
11
12
|
# it reads (SessionInbox::INPUT_FORMAT). The Bridge writes it on start
|
|
12
13
|
# and removes it on stop; one a dead worker left stays until a client's
|
|
13
|
-
# probe finds its port closed (
|
|
14
|
+
# probe finds its port closed (.live with unlink: true).
|
|
14
15
|
class WorkerSidecar < Data.define(:port, :bind, :session_id, :started_at, :version, :input_format)
|
|
15
16
|
FILE = "bridge.json"
|
|
17
|
+
# Seconds a liveness probe waits for the port to take a connect.
|
|
18
|
+
PROBE_TIMEOUT = 0.2
|
|
16
19
|
|
|
17
20
|
def self.path(session_dir) = File.join(session_dir, FILE)
|
|
18
21
|
|
|
@@ -29,6 +32,29 @@ module Samagotchi
|
|
|
29
32
|
nil
|
|
30
33
|
end
|
|
31
34
|
|
|
35
|
+
# The sidecar of a worker whose Bridge takes a connect on its port, or
|
|
36
|
+
# nil. One whose port refuses (its worker died) is stale: +unlink+
|
|
37
|
+
# removes it (the clients that would talk to it), else it stays (a
|
|
38
|
+
# read-only look, like `chi update`'s).
|
|
39
|
+
# @return [WorkerSidecar, nil]
|
|
40
|
+
def self.live(session_dir, unlink:, host: "127.0.0.1", timeout: PROBE_TIMEOUT)
|
|
41
|
+
sidecar = read(session_dir)
|
|
42
|
+
return nil unless sidecar&.port&.positive?
|
|
43
|
+
|
|
44
|
+
begin
|
|
45
|
+
Socket.tcp(host, sidecar.port, connect_timeout: timeout).close
|
|
46
|
+
sidecar
|
|
47
|
+
rescue StandardError
|
|
48
|
+
FileUtils.rm_f(path(session_dir)) if unlink
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
rescue StandardError
|
|
52
|
+
nil
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @return [Integer, nil] .live's port
|
|
56
|
+
def self.live_port(session_dir, unlink:, host: "127.0.0.1") = live(session_dir, unlink: unlink, host: host)&.port
|
|
57
|
+
|
|
32
58
|
def initialize(port:, bind: nil, session_id: nil, started_at: nil, version: nil, input_format: nil) = super
|
|
33
59
|
|
|
34
60
|
# Written whole or not at all; input_format only when it names one.
|
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.
|
|
4
|
+
version: 0.10.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dmitry Dedov
|
|
@@ -187,9 +187,12 @@ files:
|
|
|
187
187
|
- lib/samagotchi/bundles/system/memory_guide.md
|
|
188
188
|
- lib/samagotchi/bundles/system/self_map.md
|
|
189
189
|
- lib/samagotchi/cancellation_controller.rb
|
|
190
|
+
- lib/samagotchi/cli/command.rb
|
|
191
|
+
- lib/samagotchi/cli/flags.rb
|
|
190
192
|
- lib/samagotchi/client.rb
|
|
191
193
|
- lib/samagotchi/commands/registry.rb
|
|
192
194
|
- lib/samagotchi/config.rb
|
|
195
|
+
- lib/samagotchi/config_text_edit.rb
|
|
193
196
|
- lib/samagotchi/context_note.rb
|
|
194
197
|
- lib/samagotchi/context_quote.rb
|
|
195
198
|
- lib/samagotchi/context_status.rb
|
|
@@ -210,6 +213,7 @@ files:
|
|
|
210
213
|
- lib/samagotchi/edit_preview.rb
|
|
211
214
|
- lib/samagotchi/empty_answer_retry.rb
|
|
212
215
|
- lib/samagotchi/engine.rb
|
|
216
|
+
- lib/samagotchi/events.rb
|
|
213
217
|
- lib/samagotchi/gem_update.rb
|
|
214
218
|
- lib/samagotchi/guardrail_wiring.rb
|
|
215
219
|
- lib/samagotchi/guardrails.rb
|
|
@@ -256,6 +260,7 @@ files:
|
|
|
256
260
|
- lib/samagotchi/log_subscriber.rb
|
|
257
261
|
- lib/samagotchi/memory_bundle.rb
|
|
258
262
|
- lib/samagotchi/memory_bundle/builder.rb
|
|
263
|
+
- lib/samagotchi/memory_bundle/index_sync.rb
|
|
259
264
|
- lib/samagotchi/memory_bundle/index_updater.rb
|
|
260
265
|
- lib/samagotchi/memory_bundle/installer.rb
|
|
261
266
|
- lib/samagotchi/memory_bundle/listing.rb
|
|
@@ -314,6 +319,7 @@ files:
|
|
|
314
319
|
- lib/samagotchi/terminal_ui/attach_launcher.rb
|
|
315
320
|
- lib/samagotchi/terminal_ui/attached_loop.rb
|
|
316
321
|
- lib/samagotchi/terminal_ui/attached_view.rb
|
|
322
|
+
- lib/samagotchi/terminal_ui/between_turns.rb
|
|
317
323
|
- lib/samagotchi/terminal_ui/event_renderer.rb
|
|
318
324
|
- lib/samagotchi/terminal_ui/formatting.rb
|
|
319
325
|
- lib/samagotchi/terminal_ui/image_input.rb
|
|
@@ -340,6 +346,7 @@ files:
|
|
|
340
346
|
- lib/samagotchi/tool_runner.rb
|
|
341
347
|
- lib/samagotchi/tools/args.rb
|
|
342
348
|
- lib/samagotchi/tools/ask_user_question.rb
|
|
349
|
+
- lib/samagotchi/tools/builtin_calls.rb
|
|
343
350
|
- lib/samagotchi/tools/builtins.rb
|
|
344
351
|
- lib/samagotchi/tools/cancel_reminder.rb
|
|
345
352
|
- lib/samagotchi/tools/delegate.rb
|
|
@@ -379,12 +386,14 @@ files:
|
|
|
379
386
|
- lib/samagotchi/web/markdown_renderer.rb
|
|
380
387
|
- lib/samagotchi/web/message_parts.rb
|
|
381
388
|
- lib/samagotchi/web/public/activity.js
|
|
389
|
+
- lib/samagotchi/web/public/annotate_bar.js
|
|
382
390
|
- lib/samagotchi/web/public/annotate_presets.js
|
|
383
391
|
- lib/samagotchi/web/public/annotations.js
|
|
384
392
|
- lib/samagotchi/web/public/app.js
|
|
385
393
|
- lib/samagotchi/web/public/card.js
|
|
386
394
|
- lib/samagotchi/web/public/chunk_router.js
|
|
387
395
|
- lib/samagotchi/web/public/command_complete.js
|
|
396
|
+
- lib/samagotchi/web/public/command_list.js
|
|
388
397
|
- lib/samagotchi/web/public/composer_size.js
|
|
389
398
|
- lib/samagotchi/web/public/copy.js
|
|
390
399
|
- lib/samagotchi/web/public/ctx.js
|
|
@@ -397,12 +406,15 @@ files:
|
|
|
397
406
|
- lib/samagotchi/web/public/init_row.js
|
|
398
407
|
- lib/samagotchi/web/public/model_pick.js
|
|
399
408
|
- lib/samagotchi/web/public/model_picker.js
|
|
409
|
+
- lib/samagotchi/web/public/notifications.js
|
|
400
410
|
- lib/samagotchi/web/public/notify.js
|
|
401
411
|
- lib/samagotchi/web/public/question_card.js
|
|
412
|
+
- lib/samagotchi/web/public/question_cards.js
|
|
402
413
|
- lib/samagotchi/web/public/route.js
|
|
403
414
|
- lib/samagotchi/web/public/scope.js
|
|
404
415
|
- lib/samagotchi/web/public/scroll.js
|
|
405
416
|
- lib/samagotchi/web/public/sentences.js
|
|
417
|
+
- lib/samagotchi/web/public/session_state.js
|
|
406
418
|
- lib/samagotchi/web/public/sessions_list.js
|
|
407
419
|
- lib/samagotchi/web/public/stage_model.js
|
|
408
420
|
- lib/samagotchi/web/public/stage_view.js
|