agent-tome 1.0.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.
@@ -0,0 +1,8 @@
1
+ module Agent
2
+ module Tome
3
+ class ConsolidationLink < ApplicationRecord
4
+ belongs_to :new_article, class_name: "Agent::Tome::Article"
5
+ belongs_to :old_article, class_name: "Agent::Tome::Article"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ module Agent
2
+ module Tome
3
+ class Entry < ApplicationRecord
4
+ belongs_to :article
5
+ has_many :entry_web_sources, dependent: :destroy
6
+ has_many :web_sources, through: :entry_web_sources
7
+ has_many :entry_file_sources, dependent: :destroy
8
+ has_many :file_sources, through: :entry_file_sources
9
+
10
+ validates :global_id, presence: true, length: { is: 7 }, uniqueness: true
11
+
12
+ before_validation :assign_global_id, on: :create
13
+
14
+ private
15
+
16
+ def assign_global_id
17
+ return if global_id.present?
18
+
19
+ self.global_id = GlobalId.generate
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module Agent
2
+ module Tome
3
+ class EntryFileSource < ApplicationRecord
4
+ belongs_to :entry
5
+ belongs_to :file_source
6
+
7
+ validates :entry_id, uniqueness: { scope: :file_source_id }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Agent
2
+ module Tome
3
+ class EntryWebSource < ApplicationRecord
4
+ belongs_to :entry
5
+ belongs_to :web_source
6
+
7
+ validates :entry_id, uniqueness: { scope: :web_source_id }
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ module Agent
2
+ module Tome
3
+ class FileSource < ApplicationRecord
4
+ has_many :entry_file_sources, dependent: :destroy
5
+ has_many :entries, through: :entry_file_sources
6
+
7
+ validates :global_id, presence: true, length: { is: 7 }, uniqueness: true
8
+ validates :path, presence: true
9
+ validates :system_name, presence: true
10
+ validates :path, uniqueness: { scope: :system_name }
11
+
12
+ before_validation :assign_global_id, on: :create
13
+
14
+ private
15
+
16
+ def assign_global_id
17
+ return if global_id.present?
18
+
19
+ self.global_id = GlobalId.generate
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,10 @@
1
+ module Agent
2
+ module Tome
3
+ class Keyword < ApplicationRecord
4
+ has_many :article_keywords, dependent: :destroy
5
+ has_many :articles, through: :article_keywords
6
+
7
+ validates :term, presence: true, uniqueness: true
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module Agent
2
+ module Tome
3
+ class WebSource < ApplicationRecord
4
+ has_many :entry_web_sources, dependent: :destroy
5
+ has_many :entries, through: :entry_web_sources
6
+
7
+ validates :global_id, presence: true, length: { is: 7 }, uniqueness: true
8
+ validates :url, presence: true, uniqueness: true
9
+
10
+ before_validation :assign_global_id, on: :create
11
+
12
+ private
13
+
14
+ def assign_global_id
15
+ return if global_id.present?
16
+
17
+ self.global_id = GlobalId.generate
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ require "uri"
2
+
3
+ module Agent
4
+ module Tome
5
+ module UrlNormalizer
6
+ TRACKING_PARAMS = %w[
7
+ fbclid gclid fbid mc_cid mc_eid
8
+ ].freeze
9
+
10
+ def self.normalize(url)
11
+ uri = URI.parse(url)
12
+ return url unless uri.query
13
+
14
+ params = URI.decode_www_form(uri.query)
15
+ filtered = params.reject do |k, _|
16
+ k.start_with?("utm_") || TRACKING_PARAMS.include?(k)
17
+ end
18
+
19
+ uri.query = filtered.empty? ? nil : URI.encode_www_form(filtered)
20
+ uri.to_s
21
+ rescue URI::InvalidURIError
22
+ url
23
+ end
24
+
25
+ def self.valid?(url)
26
+ uri = URI.parse(url)
27
+ uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
28
+ rescue URI::InvalidURIError
29
+ false
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Agent
4
+ module Tome
5
+ VERSION = "1.0.0"
6
+ end
7
+ end
data/lib/agent/tome.rb ADDED
@@ -0,0 +1,46 @@
1
+ require "active_record"
2
+ require "active_support"
3
+ require "active_support/core_ext/string/inflections"
4
+ require "fileutils"
5
+ require "yaml"
6
+ require "uri"
7
+ require "json"
8
+ require "time"
9
+
10
+ require_relative "tome/version"
11
+ require_relative "tome/config"
12
+ require_relative "tome/database"
13
+ require_relative "tome/global_id"
14
+ require_relative "tome/url_normalizer"
15
+
16
+ module Agent
17
+ module Tome
18
+ def self.table_name_prefix
19
+ ""
20
+ end
21
+
22
+ class ValidationError < StandardError; end
23
+ class NotFoundError < StandardError; end
24
+ end
25
+ end
26
+
27
+ require_relative "tome/models/application_record"
28
+ require_relative "tome/models/article"
29
+ require_relative "tome/models/entry"
30
+ require_relative "tome/models/keyword"
31
+ require_relative "tome/models/article_keyword"
32
+ require_relative "tome/models/web_source"
33
+ require_relative "tome/models/file_source"
34
+ require_relative "tome/models/entry_web_source"
35
+ require_relative "tome/models/entry_file_source"
36
+ require_relative "tome/models/article_reference"
37
+ require_relative "tome/models/consolidation_link"
38
+ require_relative "tome/commands/create"
39
+ require_relative "tome/commands/addend"
40
+ require_relative "tome/commands/search"
41
+ require_relative "tome/commands/fetch"
42
+ require_relative "tome/commands/consolidate"
43
+ require_relative "tome/commands/related"
44
+ require_relative "tome/commands/keywords_list"
45
+ require_relative "tome/commands/source_search"
46
+ require_relative "tome/cli"
data/lib/agent.rb ADDED
@@ -0,0 +1 @@
1
+ require_relative "agent/tome"
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: agent-tome
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Erik T. Madsen
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: activerecord
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '8.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '8.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: activesupport
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '8.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '8.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: sqlite3
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ description: A knowledge base that grows with every session your AI agent runs. Findings
55
+ accumulate in a persistent, append-only store, so your agent can build on what it
56
+ already knows instead of starting from scratch. Keyword-indexed and searchable from
57
+ any CLI.
58
+ email: []
59
+ executables:
60
+ - agent-tome
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - CHANGELOG.md
65
+ - CONTRIBUTING.md
66
+ - LICENSE.txt
67
+ - README.md
68
+ - db/migrate/20250601000001_create_initial_schema.rb
69
+ - exe/agent-tome
70
+ - lib/agent.rb
71
+ - lib/agent/tome.rb
72
+ - lib/agent/tome/cli.rb
73
+ - lib/agent/tome/commands/addend.rb
74
+ - lib/agent/tome/commands/consolidate.rb
75
+ - lib/agent/tome/commands/create.rb
76
+ - lib/agent/tome/commands/fetch.rb
77
+ - lib/agent/tome/commands/keywords_list.rb
78
+ - lib/agent/tome/commands/related.rb
79
+ - lib/agent/tome/commands/search.rb
80
+ - lib/agent/tome/commands/source_search.rb
81
+ - lib/agent/tome/config.rb
82
+ - lib/agent/tome/database.rb
83
+ - lib/agent/tome/global_id.rb
84
+ - lib/agent/tome/models/application_record.rb
85
+ - lib/agent/tome/models/article.rb
86
+ - lib/agent/tome/models/article_keyword.rb
87
+ - lib/agent/tome/models/article_reference.rb
88
+ - lib/agent/tome/models/consolidation_link.rb
89
+ - lib/agent/tome/models/entry.rb
90
+ - lib/agent/tome/models/entry_file_source.rb
91
+ - lib/agent/tome/models/entry_web_source.rb
92
+ - lib/agent/tome/models/file_source.rb
93
+ - lib/agent/tome/models/keyword.rb
94
+ - lib/agent/tome/models/web_source.rb
95
+ - lib/agent/tome/url_normalizer.rb
96
+ - lib/agent/tome/version.rb
97
+ homepage: https://github.com/beatmadsen/agent-tome
98
+ licenses:
99
+ - MIT
100
+ metadata:
101
+ homepage_uri: https://github.com/beatmadsen/agent-tome
102
+ changelog_uri: https://github.com/beatmadsen/agent-tome/blob/main/CHANGELOG.md
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '3.2'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubygems_version: 4.0.6
118
+ specification_version: 4
119
+ summary: Build a personal encyclopedia of accumulated knowledge, designed for AI agents.
120
+ test_files: []